Release v2.2.0_20250106
diff --git a/BUILDING b/BUILDING
new file mode 100644
index 0000000..a2adc62
--- /dev/null
+++ b/BUILDING
@@ -0,0 +1,119 @@
+Building lwIP
+=============
+
+lwIP uses a CMake based build system.
+
+The CMake files in this project are designed to
+be included into your own CMake files. They are
+mainly variable definitions containing a list of
+source files and predefined static libraries to
+be linked against application code.
+
+1) lwIP sources:
+   src/Filelists.cmake provides file lists containing
+   the lwIP core library.
+   The file also contains two static libraries, lwipcore
+   and lwipallapps, where you can link your app against.
+   This is the file that is useful to all lwIP users.
+
+2) Example applications:
+   contrib/Filelists.cmake provides several file lists
+   containing the example applications.
+   The file also contains several static libraries
+   for these example apps.
+   This file is only useful for you, if you can use one
+   of the examples in your application, which is normally
+   not the case.
+
+3) OS/platform port:
+   Usually the OS port needs to be provided by the user.
+   If a port to Linux, Windows or MacOS is useful for
+   you, you can use
+   contrib/ports/{win32, unix}/Filelists.cmake
+   that contains file lists and libraries for
+   these operating systems.
+
+VARIABLES
+=========
+In all cases, you need to provide two variables.
+
+"LWIP_DIR" pointing to the lwIP directory
+Example:
+set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/externals/lwip)
+
+"LWIP_INCLUDE_DIRS" that contains the include base paths
+- for lwIP itself (${LWIP_DIR}/src/include)
+- for lwIP contrib if you use it (${LWIP_DIR}/contrib)
+- to a directory containing an OS port
+- to a directory containing lwipopts.h
+
+Example:
+set (LWIP_INCLUDE_DIRS
+    "${LWIP_DIR}/src/include"
+    "${LWIP_DIR}/contrib"
+    "${LWIP_DIR}/contrib/ports/unix/port/include"
+    "${LWIP_DIR}/contrib/examples/example_app"
+)
+
+Putting it all together
+=======================
+To get a working application, your CMake system
+needs to provide the variables described above, e.g.
+set (LWIP_DIR <path to lwip sources>)
+set (LWIP_INCLUDE_DIRS
+    "${LWIP_DIR}/src/include"
+    "${LWIP_DIR}/contrib"
+    "<path to my port>/include"
+    "<path to lwipopts.h>"
+)
+
+You may add some defines:
+set (LWIP_DEFINITIONS LWIP_DEBUG=1)
+
+Then include the filelists you need:
+include(${LWIP_DIR}/src/Filelists.cmake)
+include(${LWIP_DIR}/contrib/Filelists.cmake)
+
+Then, declare you executable:
+add_executable(my_app <my source files> <my lwip port files>)
+
+Add lwIP include dirs to your app:
+target_include_directories(my_app PRIVATE ${LWIP_INCLUDE_DIRS})
+
+Link your app against the lwIP libs from the filelists you need:
+target_link_libraries(my_app lwipcontribapps lwipallapps lwipcore)
+
+Working example
+===============
+Working build examples can be found in the
+contrib/ports/{win32, unix}/example_app
+subdirectory.
+To use them, create a build directory and call cmake with
+the lwIP root dir:
+
+- mkdir build
+- cd build
+- cmake ..
+- cmake --build .
+
+The CMakeLists.txt will autoselect the correct port
+for your system (supported: Linux, Windows, Darwin).
+
+To configure the example app to your needs, you need to copy the file
+    contrib/examples/example_app/lwipcfg.h.example
+to
+    contrib/examples/example_app/lwipcfg.h
+and edit to your needs.
+
+Makefile based build system
+===========================
+lwIP also maintains file lists for Makefile-based
+build systems. Look for Filelists.mk files
+in the source tree. We try to maintain them,
+but lwIP's mainly focused build system is CMake.
+
+MS Visual Studio
+================
+lwIP also provides basic support for MSVS in the win32 port
+folder under 'msvc'. We try to maintain these files,
+but lwIP's mainly focused build system is CMake.
diff --git a/CHANGELOG b/CHANGELOG
index 5f797e7..5d5f81a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -6,6 +6,93 @@
 
   * [Enter new changes just after this line - do not remove this line]
 
+(STABLE-2.2.0):
+
+  2018-10-02: Dirk Ziegelmeier
+  * Integrate contrib repository into main lwIP repository
+
+  ++ New features:
+
+  2022-04-05: David Cermak
+  * contrib/addons: Add example of using DHCP extra options hooks
+
+  2023-05-11: David Cermak
+  * dhcp: Add macro for appending extra client's request options
+
+  2023-05-11: xueyunfei
+  * dhcp: Enable custom config for timeouts, thresholds, backoff time
+
+  2021-04-26
+  * test/unit: added more unit tests
+
+  2020-03-27: Simon Goldschmidt
+  * test/fuzz: improve fuzz test
+
+  2019-12-11: Simon Goldschmidt
+  * ip6addr_aton: support scoped address strings (via '%')
+
+  2019-08-28: Joan Lledó
+  * Contrib: Add kFreeBSD to the Unix port
+
+  2019-07-14: Joan Lledó
+  * Unix port: improve support for the Hurd
+
+  ++ Bugfixes:
+
+  2019-12-11: David Girault
+  * altcp_tls: support for saving/restoring session information
+
+  2018-11-16: Craig McQUeen
+  * dns: allow a DNS look-up with a trailing dot in the name
+
+  2018-10-19: Timmy Brolin
+  * Add outgoing VLAN PCP support for Ethernet level QoS
+
+  2018-10-08: Ben Wijen
+  * apps/tftp: added TFTP client
+
+  2018-10-04: Jasper Verschueren
+  * Implement IPv4 ACD (Address Conflict Detection)
+
+  2023-05-10
+  * altcp_tls_mbedtls: note which version of mbedtls we are compatible to
+  * altcp_tls_mbedtls: multiple compatibility fixes
+
+  2023-04-26: Jan Breuer, Harrold Spier, Ognjen Bjelica, Dirk Ziegelmeier, Simon Goldschmidt
+  * apps/snmp: multiple fixes and improvements to snmp
+
+  2022-01-12: Simon Goldschmidt
+  * httpd: clean up custom file handling
+
+  2021-11-25: quanjia
+  * ping: fix sockaddr len in ping_send() for PING_USE_SOCKETS==1
+
+  2021-11-12: Bas Prins
+  * http_client: reset timeout when receiving data
+
+  2020-07-07: Erik Ekman
+  * Rename IP and Ethernet equality checkers from _cmp to _eq
+
+  2020-03-05: Simon Goldschmidt
+  * tcp: tighten up checks for received SYN
+
+  2020-01-30: Simon Goldschmidt, David Girault, David J. Fiddes, Tom Ferrin
+  * apps/sntp: multiple fixes and improvements for sntp
+
+  2020-01-30: Simon Goldschmidt
+  * ip_forward: fix IPv4 forwarding with multiple netifs/offloading
+
+  2019-06-11: David Girault, Giuseppe Modugno
+  * apps/mqtt: multiple fixes for mqtt
+
+  2019-05-19: Joan Lledó
+  * New function tcpip_callback_wait()
+    Call a function inside the tcpip thread and block the calling thread until
+    the callback finishes
+
+  2018-08-15: Jasper Verschueren, David Girault, Our Air Quality
+  * apps/mdns: greatly improved the mdns client
+
 (STABLE-2.1.2):
 
   ++ Bugfixes:
@@ -177,7 +264,7 @@
 
   2017-01-20: Joel Cunningham
   * sockets: add interface name/index APIs (task #14314)
-  
+
   2017-01-08: David van Moolenbroek
   * Extensions to RAW API (patch #9208)
     - Connected RAW PCBs
@@ -266,7 +353,7 @@
 
   2017-08-02: Abroz Bizjak/Simon Goldschmidt
   * multiple fixes in IPv4 reassembly (leading to corrupted datagrams received)
-  
+
   2017-03-30: Simon Goldschmidt
   * dhcp.c: return ERR_VAL instead of asserting on offset-out-of-pbuf
 
@@ -411,7 +498,7 @@
 
   2016-11-14: Joel Cunningham
   * tcp_out.c: fixed bug #49533 (start persist timer when unsent seg can't fit
-    in window) 
+    in window)
 
   2016-11-16: Roberto Barbieri Carrera
   * autoip.c: fixed bug #49610 (sometimes AutoIP fails to reuse the same address)
@@ -686,7 +773,7 @@
       implementation which is under a BSD-ish license.
     - Also switched to PolarSSL MD4,MD5,SHA1 implementations, which are meant to be
       used in embedded devices with reduced memory footprint.
-    - Removed PPP configuration file parsing support. 
+    - Removed PPP configuration file parsing support.
     - Added macro definition EAP_SUPPORT to make EAP support optional.
     - Added macro definition CHAP_SUPPORT to make CHAP support optional.
     - Added macro definition MSCHAP_SUPPORT to make MSCHAP support optional.
@@ -1218,7 +1305,7 @@
   2012-03-25: Simon Goldschmidt (idea by Mason)
   * posix/*: added posix-compatibility include files posix/netdb.h and posix/sys/socket.h
     which are a simple wrapper to the correct lwIP include files.
- 
+
   2012-01-16: Simon Goldschmidt
   * opt.h, icmp.c: Added option CHECKSUM_GEN_ICMP
 
@@ -1300,10 +1387,10 @@
 
   2012-03-22: Simon Goldschmidt
   * ip4.c: fixed bug #35927: missing refragmentaion in ip_forward
- 
+
   2012-03-20: Simon Goldschmidt (patch by Mason)
   * netdb.c: fixed bug #35907: lwip_gethostbyname_r returns an invalid h_addr_list
- 
+
   2012-03-12: Simon Goldschmidt (patch by Bostjan Meglic)
   * ppp.c: fixed bug #35809: PPP GetMask(): Compiler warning on big endian,
     possible bug on little endian system
@@ -1758,7 +1845,7 @@
   2011-03-27: Simon Goldschmidt
   * sockets.c: Fixed bug #32906: lwip_connect+lwip_send did not work for udp and
     raw pcbs with LWIP_TCPIP_CORE_LOCKING==1.
-  
+
   2011-03-27: Simon Goldschmidt
   * tcp_out.c: Fixed bug #32820 (Outgoing TCP connections created before route
     is present never times out) by starting retransmission timer before checking
@@ -1811,7 +1898,7 @@
   2010-11-23: Simon Goldschmidt
   * tcp_in.c: Fixed bug #30577: tcp_input: don't discard ACK-only packets after
     refusing 'refused_data' again.
-  
+
   2010-11-22: Simon Goldschmidt
   * sockets.c: Fixed bug #31590: getsockopt(... SO_ERROR ...) gives EINPROGRESS
     after a successful nonblocking connection.
@@ -1856,21 +1943,21 @@
   2010-08-01: Simon Goldschmidt (patch by Greg Renda)
   * ppp.c: Applied patch #7264 (PPP protocols are rejected incorrectly on big
     endian architectures)
-  
+
   2010-07-28: Simon Goldschmidt
   * api_lib.c, api_msg.c, sockets.c, mib2.c: Fixed compilation with TCP or UDP
     disabled.
-  
+
   2010-07-27: Simon Goldschmidt
   * tcp.c: Fixed bug #30565 (tcp_connect() check bound list): that check did no
     harm but never did anything
-  
+
   2010-07-21: Simon Goldschmidt
   * ip.c: Fixed invalid fix for bug #30402 (CHECKSUM_GEN_IP_INLINE does not
     add IP options)
 
   2010-07-16: Kieran Mansley
-  * msg_in.c: Fixed SNMP ASN constant defines to not use ! operator 
+  * msg_in.c: Fixed SNMP ASN constant defines to not use ! operator
 
   2010-07-10: Simon Goldschmidt
   * ip.c: Fixed bug #30402: CHECKSUM_GEN_IP_INLINE does not add IP options
@@ -1974,7 +2061,7 @@
 
   2010-03-05: Simon Goldschmidt
   * api_msg.c: Correctly set TCP_WRITE_FLAG_MORE when netconn_write is split
-    into multiple calls to tcp_write.    
+    into multiple calls to tcp_write.
 
   2010-02-21: Simon Goldschmidt
   * opt.h, mem.h, dns.c: task #10140: Remove DNS_USES_STATIC_BUF (keep
@@ -2434,7 +2521,7 @@
     sent to mbox
 
   2009-06-25 Kieran Mansley
-  * api_msg.c api.h: BUG26722: initialise netconn write variables 
+  * api_msg.c api.h: BUG26722: initialise netconn write variables
     in netconn_alloc
 
   2009-06-25 Kieran Mansley
@@ -2442,7 +2529,7 @@
 
   2009-06-25 Kieran Mansley
   * tcp.c, tcp_in.c, tcp_out.c, tcp.h: BUG26301 and BUG26267: correct
-    simultaneous close behaviour, and make snd_nxt have the same meaning 
+    simultaneous close behaviour, and make snd_nxt have the same meaning
     as in the RFCs.
 
   2009-05-12 Simon Goldschmidt
@@ -2578,7 +2665,7 @@
   * tcp.c, tcp_in.c, tcp.h: add tcp_abandon() to cope with dropping
     connections where no reset required (bug #25622)
 
-  * tcp_out.c: set TCP_ACK flag on keepalive and zero window probes 
+  * tcp_out.c: set TCP_ACK flag on keepalive and zero window probes
     (bug #20779)
 
   2009-02-18 Simon Goldschmidt (Jonathan Larmour and Bill Auerbach)
@@ -2614,7 +2701,7 @@
     out of pool pbufs.
 
   2008-12-19 Simon Goldschmidt
-  * many files: patch #6699: fixed some warnings on platform where sizeof(int) == 2 
+  * many files: patch #6699: fixed some warnings on platform where sizeof(int) == 2
 
   2008-12-10 Tamas Somogyi, Frédéric Bernon
   * sockets.c: fixed bug #25051: lwip_recvfrom problem with udp: fromaddr and
@@ -2699,7 +2786,7 @@
     made from lwipopts.h. Fix comment on how to override LWIP_CHKSUM.
 
   2008-01-22 Frédéric Bernon
-  * tcp.c, tcp_in.c, tcp.h, opt.h: Rename LWIP_CALCULATE_EFF_SEND_MSS in 
+  * tcp.c, tcp_in.c, tcp.h, opt.h: Rename LWIP_CALCULATE_EFF_SEND_MSS in
     TCP_CALCULATE_EFF_SEND_MSS to have coherent TCP options names.
 
   2008-01-14 Frédéric Bernon
@@ -2709,7 +2796,7 @@
 
   2008-01-14 Frédéric Bernon, Marc Chaland
   * ip.c: Integrate patch #6369" ip_input : checking before realloc".
-  
+
   2008-01-12 Frédéric Bernon
   * tcpip.h, tcpip.c, api.h, api_lib.c, api_msg.c, sockets.c: replace the field
     netconn::sem per netconn::op_completed like suggested for the task #7490
@@ -2735,8 +2822,8 @@
     Introduce changes for task #7490 "Add return value to sys_mbox_post" with some
     modifications in the sys_mbox api: sys_mbox_new take a "size" parameters which
     indicate the number of pointers query by the mailbox. There is three defines
-    in opt.h to indicate sizes for tcpip::mbox, netconn::recvmbox, and for the 
-    netconn::acceptmbox. Port maintainers, you can decide to just add this new 
+    in opt.h to indicate sizes for tcpip::mbox, netconn::recvmbox, and for the
+    netconn::acceptmbox. Port maintainers, you can decide to just add this new
     parameter in your implementation, but to ignore it to keep the previous behavior.
     The new sys_mbox_trypost function return a value to know if the mailbox is
     full or if the message is posted. Take a look to sys_arch.txt for more details.
@@ -2860,7 +2947,7 @@
     Note that previous "copy" parameter for "write" APIs is now called "apiflags".
 
   2007-10-24 Frédéric Bernon
-  * api.h, api_lib.c, api_msg.c: Add macro API_EVENT in the same spirit than 
+  * api.h, api_lib.c, api_msg.c: Add macro API_EVENT in the same spirit than
     TCP_EVENT_xxx macros to get a code more readable. It could also help to remove
     some code (like we have talk in "patch #5919 : Create compile switch to remove
     select code"), but it could be done later.
@@ -2880,7 +2967,7 @@
     all netifs (or ports) can use it.
 
   2007-10-05 Frédéric Bernon
-  * netifapi.h, netifapi.c: add function netifapi_netif_set_default. Change the 
+  * netifapi.h, netifapi.c: add function netifapi_netif_set_default. Change the
     common function to reduce a little bit the footprint (for all functions using
     only the "netif" parameter).
 
@@ -2904,7 +2991,7 @@
     or snmp_add_sysuptime(), and to define the SNMP_GET_SYSUPTIME(sysuptime) macro.
     This one is undefined by default in mib2.c. SNMP_GET_SYSUPTIME is called inside
     snmp_get_sysuptime(u32_t *value), and enable to change "sysuptime" value only
-    when it's queried (any direct call to "sysuptime" is changed by a call to 
+    when it's queried (any direct call to "sysuptime" is changed by a call to
     snmp_get_sysuptime).
 
   2007-09-09 Frédéric Bernon, Bill Florac
@@ -2985,7 +3072,7 @@
   2007-08-26 Marc Boucher
   * api_msg.c: do_close_internal(): Reset the callbacks and arg (conn) to NULL
     since they can under certain circumstances be called with an invalid conn
-    pointer after the connection has been closed (and conn has been freed). 
+    pointer after the connection has been closed (and conn has been freed).
 
   2007-08-25 Frédéric Bernon (Artem Migaev's Patch)
   * netif.h, netif.c: Integrate "patch #6163 : Function to check if link layer is up".
@@ -2997,11 +3084,11 @@
 
   2007-08-22 Frédéric Bernon
   * tcpip.h, tcpip.c, ethernetif.c, opt.h: remove options ETHARP_TCPIP_INPUT &
-    ETHARP_TCPIP_ETHINPUT, now, only "ethinput" code is supported, even if the 
+    ETHARP_TCPIP_ETHINPUT, now, only "ethinput" code is supported, even if the
     name is tcpip_input (we keep the name of 1.2.0 function).
 
   2007-08-17 Jared Grubb
-  * memp_std.h, memp.h, memp.c, mem.c, stats.c: (Task #7136) Centralize mempool 
+  * memp_std.h, memp.h, memp.c, mem.c, stats.c: (Task #7136) Centralize mempool
     settings into new memp_std.h and optional user file lwippools.h. This adds
     more dynamic mempools, and allows the user to create an arbitrary number of
     mempools for mem_malloc.
@@ -3208,32 +3295,32 @@
     snmp_set_sysname.
 
   2007-03-28 Frédéric Bernon
-  * netif.h, netif.c: A new NETIF_FLAG_ETHARP flag is defined in netif.h, to allow to 
+  * netif.h, netif.c: A new NETIF_FLAG_ETHARP flag is defined in netif.h, to allow to
     initialize a network interface's flag with. It tell this interface is an ethernet
     device, and we can use ARP with it to do a "gratuitous ARP" (RFC 3220 "IP Mobility
     Support for IPv4" section 4.6) when interface is "up" with netif_set_up().
 
   2007-03-26 Frédéric Bernon, Jonathan Larmour
   * opt.h, tcpip.c: New configuration option LWIP_ARP allow to disable ARP init at build
-    time if you only use PPP or SLIP. The default is enable. Note we don't have to call 
+    time if you only use PPP or SLIP. The default is enable. Note we don't have to call
     etharp_init in your port's initilization sequence if you use tcpip.c, because this call
     is done in tcpip_init function.
 
   2007-03-22 Frédéric Bernon
   * stats.h, stats.c, msg_in.c: Stats counters can be change to u32_t if necessary with the
     new option LWIP_STATS_LARGE. If you need this option, define LWIP_STATS_LARGE to 1 in
-    your lwipopts.h. More, unused counters are not defined in the stats structs, and not 
+    your lwipopts.h. More, unused counters are not defined in the stats structs, and not
     display by stats_display(). Note that some options (SYS_STATS and RAW_STATS) are defined
     but never used. Fix msg_in.c with the correct #if test for a stat display.
 
   2007-03-21 Kieran Mansley
-  * netif.c, netif.h: Apply patch#4197 with some changes (originator: rireland@hmgsl.com). 
+  * netif.c, netif.h: Apply patch#4197 with some changes (originator: rireland@hmgsl.com).
     Provides callback on netif up/down state change.
 
   2007-03-11 Frédéric Bernon, Mace Gael, Steve Reynolds
   * sockets.h, sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c, igmp.h, igmp.c,
     ip.c, netif.h, tcpip.c, opt.h:
-    New configuration option LWIP_IGMP to enable IGMP processing. Based on only one 
+    New configuration option LWIP_IGMP to enable IGMP processing. Based on only one
     filter per all network interfaces. Declare a new function in netif to enable to
     control the MAC filter (to reduce lwIP traffic processing).
 
@@ -3256,7 +3343,7 @@
   * snmp_msg.h, msg_in.c: SNMP UDP ports can be configured at compile time.
 
   2007-03-06 Frédéric Bernon
-  * api.h, api_lib.c, sockets.h, sockets.c, tcpip.c, sys.h, sys.c, err.h: 
+  * api.h, api_lib.c, sockets.h, sockets.c, tcpip.c, sys.h, sys.c, err.h:
     Implement SO_RCVTIMEO on UDP sockets/netconn.
 
   2007-02-28 Kieran Mansley (based on patch from Simon Goldschmidt)
@@ -3298,7 +3385,7 @@
   and/or warnings on some systems where mem_size_t and size_t differ.
   * pbuf.c, ppp.c: Fix warnings on some systems with mem_malloc.
 
-  2008-03-04 Kieran Mansley (contributions by others) 
+  2008-03-04 Kieran Mansley (contributions by others)
   * Numerous small compiler error/warning fixes from contributions to
     mailing list after 1.3.0 release candidate made.
 
@@ -3415,7 +3502,7 @@
     type change. Any compiler should cause an error without any changes in
     yours netconn_peer calls (so, it can't be a "silent change"). It also
     reduce a little bit the footprint for socket layer (lwip_getpeername &
-    lwip_getsockname use now a common lwip_getaddrname function since 
+    lwip_getsockname use now a common lwip_getaddrname function since
     netconn_peer & netconn_addr have the same parameters).
 
   2007-09-20 Simon Goldschmidt
@@ -3435,13 +3522,13 @@
     if they are not defined in cc.h, in the same spirit than "lwip/opt.h" for lwipopts.h.
 
   2007-08-30 Frédéric Bernon
-  * igmp.h, igmp.c: Some changes to remove some redundant code, add some traces, 
+  * igmp.h, igmp.c: Some changes to remove some redundant code, add some traces,
     and fix some coding style.
 
   2007-08-28 Frédéric Bernon
   * tcpip.c: Fix TCPIP_MSG_INPKT processing: now, tcpip_input can be used for any
-    kind of packets. These packets are considered like Ethernet packets (payload 
-    pointing to ethhdr) if the netif got the NETIF_FLAG_ETHARP flag. Else, packets 
+    kind of packets. These packets are considered like Ethernet packets (payload
+    pointing to ethhdr) if the netif got the NETIF_FLAG_ETHARP flag. Else, packets
     are considered like IP packets (payload pointing to iphdr).
 
   2007-08-27 Frédéric Bernon
@@ -3539,7 +3626,7 @@
   2007-06-28 Frédéric Bernon
   * netifapi.h, netifapi.c, tcpip.h, tcpip.c: Update code to handle the option
     LWIP_TCPIP_CORE_LOCKING, and do some changes to be coherent with last modifications
-    in api_lib/api_msg (use pointers and not type with table, etc...) 
+    in api_lib/api_msg (use pointers and not type with table, etc...)
 
   2007-06-26 Simon Goldschmidt
   * udp.h: Fixed bug #20259: struct udp_hdr was lacking the packin defines.
@@ -3641,7 +3728,7 @@
 
   2007-05-16 Frédéric Bernon
   * tcpip.c, igmp.h, igmp.c: Fixed bug "#19800 : IGMP: igmp_tick() will not work
-    with NO_SYS=1". Note that igmp_init is always in tcpip_thread (and not in 
+    with NO_SYS=1". Note that igmp_init is always in tcpip_thread (and not in
     tcpip_init) because we have to be sure that network interfaces are already
     added (mac filter is updated only in igmp_init for the moment).
 
@@ -3788,7 +3875,7 @@
 
   2007-03-20 Frédéric Bernon
   * tcpip.c: Initialize tcpip's mbox, and verify if initialized in tcpip_input,
-    tcpip_ethinput, tcpip_callback, tcpip_apimsg, to fix a init problem with 
+    tcpip_ethinput, tcpip_callback, tcpip_apimsg, to fix a init problem with
     network interfaces. Also fix a compiler warning.
 
   2007-03-20 Kieran Mansley
@@ -3880,13 +3967,13 @@
   * rawapi.txt: Fix documentation mismatch with etharp.h about etharp_tmr's call
     interval.
 
-  2007-02-28 Kieran Mansley 
+  2007-02-28 Kieran Mansley
   * pbuf.c: Fix BUG#17645 - ensure pbuf payload pointer is not moved
     outside the region of the pbuf by pbuf_header()
 
-  2007-02-28 Kieran Mansley 
+  2007-02-28 Kieran Mansley
   * sockets.c: Fix BUG#19161 - ensure milliseconds timeout is non-zero
-    when supplied timeout is also non-zero 
+    when supplied timeout is also non-zero
 
 (STABLE-1.2.0)
 
@@ -3970,7 +4057,7 @@
     in accept() by Kevin Lawson.
 
   2006-05-26 Christiaan Simons
-  * api_lib.c: Removed conn->sem creation and destruction 
+  * api_lib.c: Removed conn->sem creation and destruction
     from netconn_write() and added sys_sem_new to netconn_new_*.
 
 (STABLE-1_1_1)
@@ -4040,7 +4127,7 @@
   * dhcp.c: Decline messages were not multicast but unicast.
   * etharp.c: ETHARP_CREATE is renamed to ETHARP_TRY_HARD.
     Do not try hard to insert arbitrary packet's source address,
-    etharp_ip_input() now calls etharp_update() without ETHARP_TRY_HARD. 
+    etharp_ip_input() now calls etharp_update() without ETHARP_TRY_HARD.
     etharp_query() now always DOES call ETHARP_TRY_HARD so that users
     querying an address will see it appear in the cache (DHCP could
     suffer from this when a server invalidly gave an in-use address.)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f05c0f6..55fc44a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,11 +1,23 @@
-cmake_minimum_required(VERSION 3.7)
+cmake_minimum_required(VERSION 3.10)
+
+set (CMAKE_CONFIGURATION_TYPES "Debug;Release")
 
 project(lwIP)
 
+# Example lwIP application
 set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR})
-include(src/Filelists.cmake)
 
-# Package generation
+set (LWIP_DEFINITIONS LWIP_DEBUG=1)
+
+if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+  add_subdirectory(${LWIP_DIR}/contrib/ports/win32/example_app)
+elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
+  add_subdirectory(${LWIP_DIR}/contrib/ports/unix/example_app)
+else()
+  message(WARNING "Host ${CMAKE_SYSTEM_NAME} is not supported to build example_app")
+endif()
+
+# Source package generation
 set(CPACK_SOURCE_GENERATOR "ZIP")
 set(CPACK_SOURCE_PACKAGE_DESCRIPTION_SUMMARY "lwIP lightweight IP stack")
 set(CPACK_PACKAGE_VERSION_MAJOR "${LWIP_VERSION_MAJOR}")
@@ -15,6 +27,9 @@
 set(CPACK_SOURCE_PACKAGE_FILE_NAME "lwip-${LWIP_VERSION_MAJOR}.${LWIP_VERSION_MINOR}.${LWIP_VERSION_REVISION}")
 include(CPack)
 
-# Target for package generation
+# Generate docs before creating source package
+include(src/Filelists.cmake)
 add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
-add_dependencies(dist lwipdocs)
+if (TARGET lwipdocs)
+  add_dependencies(dist lwipdocs)
+endif()
diff --git a/COPYING b/COPYING
index e23898b..90465f5 100644
--- a/COPYING
+++ b/COPYING
@@ -1,33 +1,25 @@
-/*
- * 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>
- *
- */
+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.
 
diff --git a/FEATURES b/FEATURES
index a50c5a5..87802d1 100644
--- a/FEATURES
+++ b/FEATURES
@@ -4,7 +4,7 @@
 
 Main features include:
 - Protocols: IP, IPv6, ICMP, ND, MLD, UDP, TCP, IGMP, ARP, PPPoS, PPPoE, 6LowPAN (via IEEE 802.15.4, BLE or ZEP; since v2.1.0)
-- DHCP client, stateless DHCPv6 (since v2.1.0), DNS client (incl. mDNS hostname resolver), AutoIP/APIPA (Zeroconf), SNMP agent (v1, v2c, v3 (since v2.1.0), private MIB support & MIB compiler)
+- DHCP client, stateless DHCPv6 (since v2.1.0), DNS client (incl. mDNS hostname resolver), AutoIP/APIPA (Zeroconf), ACD (Address Conflict Detection), SNMP agent (v1, v2c, v3 (since v2.1.0), private MIB support & MIB compiler)
 - APIs: specialized APIs for enhanced performance & zero copy, optional Berkeley-alike socket API
 - Extended features: IP forwarding over multiple network interfaces
 - Extended TCP features: congestion control, RTT estimation and fast recovery/fast retransmit, sending SACKs (since v2.1.0), "altcp": nearly transparent TLS for any tcp pcb (since v2.1.0)
diff --git a/FILES b/FILES
index e6e0998..2a7086c 100644
--- a/FILES
+++ b/FILES
@@ -1,3 +1,4 @@
+contrib/  - lwIP examples, ports, and small apps (formerly http://git.savannah.gnu.org/cgit/lwip/lwip-contrib.git/)
 src/      - The source code for the lwIP TCP/IP stack.
 doc/      - The documentation for lwIP.
 test/     - Some code to test whether the sources do what they should.
diff --git a/README b/README
index b95f155..f831051 100644
--- a/README
+++ b/README
@@ -17,12 +17,13 @@
     multiple network interfaces
   * ICMP (Internet Control Message Protocol) for network maintenance and debugging
   * IGMP (Internet Group Management Protocol) for multicast traffic management
-  * MLD (Multicast listener discovery for IPv6). Aims to be compliant with 
+  * MLD (Multicast listener discovery for IPv6). Aims to be compliant with
     RFC 2710. No support for MLDv2
   * ND (Neighbor discovery and stateless address autoconfiguration for IPv6).
     Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862
     (Address autoconfiguration)
-  * DHCP, AutoIP/APIPA (Zeroconf) and (stateless) DHCPv6
+  * DHCP, AutoIP/APIPA (Zeroconf), ACD (Address Conflict Detection)
+    and (stateless) DHCPv6
   * UDP (User Datagram Protocol) including experimental UDP-lite extensions
   * TCP (Transmission Control Protocol) with congestion control, RTT estimation
     fast recovery/fast retransmit and sending SACKs
@@ -63,37 +64,39 @@
 mailing list. A core team of developers will commit changes to the
 Git source tree.
 
-The lwIP TCP/IP stack is maintained in the 'lwip' Git module and
-contributions (such as platform ports) are in the 'contrib' Git module.
+The lwIP TCP/IP stack is maintained in the 'src' directory and
+contributions (such as platform ports and applications) are in
+the 'contrib' directory.
 
 See doc/savannah.txt for details on Git server access for users and
 developers.
 
-The current Git trees are web-browsable:
-  http://git.savannah.gnu.org/cgit/lwip.git
-  http://git.savannah.gnu.org/cgit/lwip/lwip-contrib.git
+The current Git tree is web-browsable:
+  https://git.savannah.gnu.org/cgit/lwip.git
 
 Submit patches and bugs via the lwIP project page:
-  http://savannah.nongnu.org/projects/lwip/
+  https://savannah.nongnu.org/projects/lwip/
 
 Continuous integration builds (GCC, clang):
-  https://travis-ci.org/yarrick/lwip-merged
+  https://github.com/lwip-tcpip/lwip/actions
 
 
 DOCUMENTATION
 
 Self documentation of the source code is regularly extracted from the current
 Git sources and is available from this web page:
-  http://www.nongnu.org/lwip/
-
-There is now a constantly growing wiki about lwIP at
-  http://lwip.wikia.com/wiki/LwIP_Wiki
+  https://www.nongnu.org/lwip/
 
 Also, there are mailing lists you can subscribe at
-  http://savannah.nongnu.org/mail/?group=lwip
+  https://savannah.nongnu.org/mail/?group=lwip
 plus searchable archives:
-  http://lists.nongnu.org/archive/html/lwip-users/
-  http://lists.nongnu.org/archive/html/lwip-devel/
+  https://lists.nongnu.org/archive/html/lwip-users/
+  https://lists.nongnu.org/archive/html/lwip-devel/
+
+There is a wiki about lwIP at
+  https://lwip.wikia.com/wiki/LwIP_Wiki
+You might get questions answered there, but unfortunately, it is not as
+well maintained as it should be.
 
 lwIP was originally written by Adam Dunkels:
   http://dunkels.com/adam/
diff --git a/UPGRADING b/UPGRADING
index 21ad8cc..0d35790 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -7,6 +7,16 @@
 (git master)
 
   * [Enter new changes just after this line - do not remove this line]
+  * The eth_addr_cmp and ip_addr_cmp set of functions have been renamed to eth_addr_eq, ip_addr_eq
+    and so on, since they return non-zero on equality. Macros for the old names exist.
+  * The sio_write function used by PPP now takes the data argument as const.
+
+(2.2.0)
+
+  ++ Repository changes:
+
+  * The contrib repository has been added into the main repository in the subdirectory 'contrib'
+    (the old contrib repository remains online for reference but is not used any more)
 
 (2.1.0)
 
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/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/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..ea2ca4b
--- /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>
+	  &nbsp;
+	</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>
+	  &nbsp;
+	</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>
+   &nbsp;
+  </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>
+    &nbsp;
+   </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>
+    &nbsp;
+   </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>
+	  &nbsp;
+	</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"
+"    &nbsp;\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(&current_time_val, &current_time);
+#else
+  localtime_r(&current_time, &current_time_val);
+#endif
+
+  strftime(buf, sizeof(buf), "%d.%m.%Y %H:%M:%S", &current_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/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 100644
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..f933f17
--- /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);
+}
diff --git a/doc/FILES b/doc/FILES
index e588575..155a82c 100644
--- a/doc/FILES
+++ b/doc/FILES
@@ -3,7 +3,4 @@
 
 savannah.txt   - How to obtain the current development source code.
 contrib.txt    - How to contribute to lwIP as a developer.
-rawapi.txt     - The documentation for the core API of lwIP.
-                 Also provides an overview about the other APIs and multithreading.
-sys_arch.txt   - The documentation for a system abstraction layer of lwIP.
 ppp.txt        - Documentation of the PPP interface for lwIP.
diff --git a/doc/NO_SYS_SampleCode.c b/doc/NO_SYS_SampleCode.c
index 71f1c9f..b263420 100644
--- a/doc/NO_SYS_SampleCode.c
+++ b/doc/NO_SYS_SampleCode.c
@@ -73,7 +73,6 @@
   netif.name[0] = 'e';
   netif.name[1] = '0';
   netif_create_ip6_linklocal_address(&netif, 1);
-  netif.ip6_autoconfig_enabled = 1;
   netif_set_status_callback(&netif, netif_status_callback);
   netif_set_default(&netif);
   netif_set_up(&netif);
diff --git a/doc/ZeroCopyRx.c b/doc/ZeroCopyRx.c
index 0e8219b..600b13a 100644
--- a/doc/ZeroCopyRx.c
+++ b/doc/ZeroCopyRx.c
@@ -13,7 +13,7 @@
   my_custom_pbuf_t* my_puf = (my_custom_pbuf_t*)p;
 
   // invalidate data cache here - lwIP and/or application may have written into buffer!
-  // (invalidate is faster than flushing, and noone needs the correct data in the buffer)
+  // (invalidate is faster than flushing, and no one needs the correct data in the buffer)
   invalidate_cpu_cache(p->payload, p->tot_len);
 
   SYS_ARCH_PROTECT(old_level);
diff --git a/doc/contrib.txt b/doc/contrib.txt
index 6f0d7bc..2a44857 100644
--- a/doc/contrib.txt
+++ b/doc/contrib.txt
@@ -55,4 +55,4 @@
 
 1. If you have ported lwIP to a platform (an OS, a uC/processor or a combination of these) and
    you think it could benefit others[1] you might want discuss this on the mailing list. You
-   can also ask for Git access to submit and maintain your port in the contrib Git module.
+   can also ask for Git access to submit and maintain your port in the lwIP/contrib subdir.
diff --git a/doc/doxygen/lwip.Doxyfile b/doc/doxygen/lwip.Doxyfile
index 3477722..f830afe 100644
--- a/doc/doxygen/lwip.Doxyfile
+++ b/doc/doxygen/lwip.Doxyfile
@@ -1,7 +1,7 @@
-# Doxyfile 1.8.13
+# Doxyfile 1.12.0
 
 # This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
+# Doxygen (www.doxygen.org) for a project.
 #
 # All text after a double hash (##) is considered a comment and is placed in
 # front of the TAG it is preceding.
@@ -12,16 +12,26 @@
 # For lists, items can also be appended using:
 # TAG += value [value, ...]
 # Values that contain spaces should be placed between quotes (\" \").
+#
+# Note:
+#
+# Use Doxygen to compare the used configuration file with the template
+# configuration file:
+# doxygen -x [configFile]
+# Use Doxygen to compare the used configuration file with the template
+# configuration file without replacing the environment variables or CMake type
+# replacement variables:
+# doxygen -x_noenv [configFile]
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
-# for the list of possible encodings.
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
 # The default value is: UTF-8.
 
 DOXYFILE_ENCODING      = UTF-8
@@ -32,13 +42,13 @@
 # title of most generated pages and in a few other places.
 # The default value is: My Project.
 
-PROJECT_NAME           = "lwIP"
+PROJECT_NAME           = lwIP
 
 # The PROJECT_NUMBER tag can be used to enter a project or revision number. This
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = "2.1.3"
+PROJECT_NUMBER         = 2.2.0
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -53,24 +63,42 @@
 
 PROJECT_LOGO           =
 
+# With the PROJECT_ICON tag one can specify an icon that is included in the tabs
+# when the HTML document is shown. Doxygen will copy the logo to the output
+# directory.
+
+PROJECT_ICON           =
+
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
 # into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
+# entered, it will be relative to the location where Doxygen was started. If
 # left blank the current directory will be used.
 
-OUTPUT_DIRECTORY       = "output"
+OUTPUT_DIRECTORY       = output
 
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
-# option can be useful when feeding doxygen a huge amount of source files, where
+# If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096
+# sub-directories (in 2 levels) under the output directory of each output format
+# and will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding Doxygen a huge amount of source files, where
 # putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
+# control the number of sub-directories.
 # The default value is: NO.
 
 CREATE_SUBDIRS         = NO
 
-# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# Controls the number of sub-directories that will be created when
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
+# level increment doubles the number of directories, resulting in 4096
+# directories at level 8 which is the default and also the maximum value. The
+# sub-directories are organized in 2 levels, the first level always has a fixed
+# number of 16 directories.
+# Minimum value: 0, maximum value: 8, default value: 8.
+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
+
+CREATE_SUBDIRS_LEVEL   = 8
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, Doxygen will allow non-ASCII
 # characters to appear in the names of generated files. If set to NO, non-ASCII
 # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
 # U+3044.
@@ -79,28 +107,28 @@
 ALLOW_UNICODE_NAMES    = NO
 
 # The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
+# documentation generated by Doxygen is written. Doxygen will use this
 # information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
+# Swedish, Turkish, Ukrainian and Vietnamese.
 # The default value is: English.
 
 OUTPUT_LANGUAGE        = English
 
-# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# If the BRIEF_MEMBER_DESC tag is set to YES, Doxygen will include brief member
 # descriptions after the members that are listed in the file and class
 # documentation (similar to Javadoc). Set to NO to disable this.
 # The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# If the REPEAT_BRIEF tag is set to YES, Doxygen will prepend the brief
 # description of a member or function before the detailed description
 #
 # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
@@ -118,9 +146,9 @@
 # the entity):The $name class, The $name widget, The $name file, is, provides,
 # specifies, contains, represents, a, an and the.
 
-ABBREVIATE_BRIEF       = "The $name class       " \
-                         "The $name widget       " \
-                         "The $name file       " \
+ABBREVIATE_BRIEF       = "The $name class      " \
+                         "The $name widget      " \
+                         "The $name file      " \
                          is \
                          provides \
                          specifies \
@@ -131,13 +159,13 @@
                          the
 
 # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# doxygen will generate a detailed section even if there is only a brief
+# Doxygen will generate a detailed section even if there is only a brief
 # description.
 # The default value is: NO.
 
 ALWAYS_DETAILED_SEC    = NO
 
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# If the INLINE_INHERITED_MEMB tag is set to YES, Doxygen will show all
 # inherited members of a class in the documentation of that class as if those
 # members were ordinary class members. Constructors, destructors and assignment
 # operators of the base classes will not be shown.
@@ -145,7 +173,7 @@
 
 INLINE_INHERITED_MEMB  = NO
 
-# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# If the FULL_PATH_NAMES tag is set to YES, Doxygen will prepend the full path
 # before files name in the file list and in the header files. If set to NO the
 # shortest path that makes the file name unique will be used
 # The default value is: YES.
@@ -155,11 +183,11 @@
 # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
 # Stripping is only done if one of the specified strings matches the left-hand
 # part of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to
+# If left blank the directory from which Doxygen is run is used as the path to
 # strip.
 #
 # Note that you can specify absolute paths here, but also relative paths, which
-# will be relative from the directory where doxygen is started.
+# will be relative from the directory where Doxygen is started.
 # This tag requires that the tag FULL_PATH_NAMES is set to YES.
 
 STRIP_FROM_PATH        = ../../
@@ -173,14 +201,14 @@
 
 STRIP_FROM_INC_PATH    =
 
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# If the SHORT_NAMES tag is set to YES, Doxygen will generate much shorter (but
 # less readable) file names. This can be useful is your file systems doesn't
 # support long names like on DOS, Mac, or CD-ROM.
 # The default value is: NO.
 
 SHORT_NAMES            = NO
 
-# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen will interpret the
 # first line (until the first dot) of a Javadoc-style comment as the brief
 # description. If set to NO, the Javadoc-style will behave just like regular Qt-
 # style comments (thus requiring an explicit @brief command for a brief
@@ -189,7 +217,17 @@
 
 JAVADOC_AUTOBRIEF      = NO
 
-# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# If the JAVADOC_BANNER tag is set to YES then Doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by Doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER         = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will interpret the first
 # line (until the first dot) of a Qt-style comment as the brief description. If
 # set to NO, the Qt-style will behave just like regular Qt-style comments (thus
 # requiring an explicit \brief command for a brief description.)
@@ -197,7 +235,7 @@
 
 QT_AUTOBRIEF           = NO
 
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen treat a
 # multi-line C++ special comment block (i.e. a block of //! or /// comments) as
 # a brief description. This used to be the default behavior. The new default is
 # to treat a multi-line C++ comment block as a detailed description. Set this
@@ -209,13 +247,21 @@
 
 MULTILINE_CPP_IS_BRIEF = NO
 
+# By default Python docstrings are displayed as preformatted text and Doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# Doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as Doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING       = YES
+
 # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
 # documentation from any documented member that it re-implements.
 # The default value is: YES.
 
 INHERIT_DOCS           = YES
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then Doxygen will produce a new
 # page for each member. If set to NO, the documentation of a member will be part
 # of the file/class/namespace that contains it.
 # The default value is: NO.
@@ -232,20 +278,19 @@
 # the documentation. An alias has the form:
 # name=value
 # For example adding
-# "sideeffect=@par Side Effects:\n"
+# "sideeffect=@par Side Effects:^^"
 # will allow you to put the command \sideeffect (or @sideeffect) in the
 # documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines.
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
 
 ALIASES                =
 
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST              =
-
 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
 # only. Doxygen will then generate output that is more tailored for C. For
 # instance, some of the names that are used will be different. The list of all
@@ -274,30 +319,42 @@
 
 OPTIMIZE_OUTPUT_VHDL   = NO
 
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE  = NO
+
 # Doxygen selects the parser to use depending on the extension of the files it
 # parses. With this tag you can assign which parser to use for a given
 # extension. Doxygen has a built-in mapping, but you can override or extend it
 # using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
-# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
-# Fortran. In the later case the parser tries to guess whether the code is fixed
-# or free formatted code, this is the default for Fortran type files), VHDL. For
-# instance to make doxygen treat .inc files as Fortran files (default is PHP),
-# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+# language is one of the parsers supported by Doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files). For instance to make Doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
 #
 # Note: For files without extension you can use no_extension as a placeholder.
 #
 # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
+# the files are not read by Doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
 
 EXTENSION_MAPPING      =
 
-# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# If the MARKDOWN_SUPPORT tag is enabled then Doxygen pre-processes all comments
 # according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you can
-# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by Doxygen, so you can
+# mix Doxygen, HTML, and XML commands with Markdown formatting. Disable only in
 # case of backward compatibilities issues.
 # The default value is: YES.
 
@@ -307,12 +364,23 @@
 # to that level are automatically included in the table of contents, even if
 # they do not have an id attribute.
 # Note: This feature currently applies only to Markdown headings.
-# Minimum value: 0, maximum value: 99, default value: 0.
+# Minimum value: 0, maximum value: 99, default value: 6.
 # This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
 
 TOC_INCLUDE_HEADINGS   = 0
 
-# When enabled doxygen tries to link words that correspond to documented
+# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to
+# generate identifiers for the Markdown headings. Note: Every identifier is
+# unique.
+# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a
+# sequence number starting at 0 and GITHUB use the lower case version of title
+# with any whitespace replaced by '-' and punctuation characters removed.
+# The default value is: DOXYGEN.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+MARKDOWN_ID_STYLE      = DOXYGEN
+
+# When enabled Doxygen tries to link words that correspond to documented
 # classes, or namespaces to their corresponding documentation. Such a link can
 # be prevented in individual cases by putting a % sign in front of the word or
 # globally by setting AUTOLINK_SUPPORT to NO.
@@ -322,10 +390,10 @@
 
 # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
 # to include (a tag file for) the STL sources as input, then you should set this
-# tag to YES in order to let doxygen match functions declarations and
+# tag to YES in order to let Doxygen match functions declarations and
 # definitions whose arguments contain STL classes (e.g. func(std::string);
-# versus func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
+# versus func(std::string) {}). This also makes the inheritance and
+# collaboration diagrams that involve STL classes more complete and accurate.
 # The default value is: NO.
 
 BUILTIN_STL_SUPPORT    = NO
@@ -337,16 +405,16 @@
 CPP_CLI_SUPPORT        = NO
 
 # Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
-# will parse them like normal C++ but will assume all classes use public instead
-# of private inheritance when no explicit protection keyword is present.
+# https://www.riverbankcomputing.com/software) sources only. Doxygen will parse
+# them like normal C++ but will assume all classes use public instead of private
+# inheritance when no explicit protection keyword is present.
 # The default value is: NO.
 
 SIP_SUPPORT            = NO
 
 # For Microsoft's IDL there are propget and propput attributes to indicate
 # getter and setter methods for a property. Setting this option to YES will make
-# doxygen to replace the get and set methods by a property in the documentation.
+# Doxygen to replace the get and set methods by a property in the documentation.
 # This will only work if the methods are indeed getting or setting a simple
 # type. If this is not the case, or you want to show the methods anyway, you
 # should set this option to NO.
@@ -355,7 +423,7 @@
 IDL_PROPERTY_SUPPORT   = YES
 
 # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES then doxygen will reuse the documentation of the first
+# tag is set to YES then Doxygen will reuse the documentation of the first
 # member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
 # The default value is: NO.
@@ -413,21 +481,42 @@
 # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
 # cache is used to resolve symbols given their name and scope. Since this can be
 # an expensive process and often the same symbol appears multiple times in the
-# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
-# doxygen will become slower. If the cache is too large, memory is wasted. The
+# code, Doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# Doxygen will become slower. If the cache is too large, memory is wasted. The
 # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
 # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
-# symbols. At the end of a run doxygen will report the cache usage and suggest
+# symbols. At the end of a run Doxygen will report the cache usage and suggest
 # the optimal cache size from a speed point of view.
 # Minimum value: 0, maximum value: 9, default value: 0.
 
 LOOKUP_CACHE_SIZE      = 0
 
+# The NUM_PROC_THREADS specifies the number of threads Doxygen is allowed to use
+# during processing. When set to 0 Doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which effectively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS       = 1
+
+# If the TIMESTAMP tag is set different from NO then each generated page will
+# contain the date or date and time when the page was generated. Setting this to
+# NO can help when comparing the output of multiple runs.
+# Possible values are: YES, NO, DATETIME and DATE.
+# The default value is: NO.
+
+TIMESTAMP              = NO
+
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# If the EXTRACT_ALL tag is set to YES, Doxygen will assume all entities in
 # documentation are documented, even if no documentation was available. Private
 # class members and static file members will be hidden unless the
 # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
@@ -443,6 +532,12 @@
 
 EXTRACT_PRIVATE        = NO
 
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL   = NO
+
 # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
 # scope will be included in the documentation.
 # The default value is: NO.
@@ -480,7 +575,14 @@
 
 EXTRACT_ANON_NSPACES   = NO
 
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
 # undocumented members inside documented classes or files. If set to NO these
 # members will be included in the various overviews, but no documentation
 # section is generated. This option has no effect if EXTRACT_ALL is enabled.
@@ -488,22 +590,23 @@
 
 HIDE_UNDOC_MEMBERS     = YES
 
-# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
 # undocumented classes that are normally visible in the class hierarchy. If set
 # to NO, these classes will be included in the various overviews. This option
-# has no effect if EXTRACT_ALL is enabled.
+# will also hide undocumented C++ concepts if enabled. This option has no effect
+# if EXTRACT_ALL is enabled.
 # The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = YES
 
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO, these declarations will be
-# included in the documentation.
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all friend
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
 # The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
-# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
 # documentation blocks found inside the body of a function. If set to NO, these
 # blocks will be appended to the function's detailed documentation block.
 # The default value is: NO.
@@ -517,30 +620,44 @@
 
 INTERNAL_DOCS          = NO
 
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-# The default value is: system dependent.
+# With the correct setting of option CASE_SENSE_NAMES Doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and macOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
+# Possible values are: SYSTEM, NO and YES.
+# The default value is: SYSTEM.
 
 CASE_SENSE_NAMES       = NO
 
-# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# If the HIDE_SCOPE_NAMES tag is set to NO then Doxygen will show members with
 # their full class and namespace scopes in the documentation. If set to YES, the
 # scope will be hidden.
 # The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
-# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then Doxygen will
 # append additional text to a page's title, such as Class Reference. If set to
 # YES the compound reference will be hidden.
 # The default value is: NO.
 
 HIDE_COMPOUND_REFERENCE= NO
 
-# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE        = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then Doxygen will put a list of
 # the files that are included by a file in the documentation of that file.
 # The default value is: YES.
 
@@ -553,7 +670,7 @@
 
 SHOW_GROUPED_MEMB_INC  = NO
 
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen will list include
 # files with double quotes in the documentation rather than with sharp brackets.
 # The default value is: NO.
 
@@ -565,14 +682,14 @@
 
 INLINE_INFO            = YES
 
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# If the SORT_MEMBER_DOCS tag is set to YES then Doxygen will sort the
 # (detailed) documentation of file and class members alphabetically by member
 # name. If set to NO, the members will appear in declaration order.
 # The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# If the SORT_BRIEF_DOCS tag is set to YES then Doxygen will sort the brief
 # descriptions of file, namespace and class members alphabetically by member
 # name. If set to NO, the members will appear in declaration order. Note that
 # this will also influence the order of the classes in the class list.
@@ -580,7 +697,7 @@
 
 SORT_BRIEF_DOCS        = NO
 
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then Doxygen will sort the
 # (brief and detailed) documentation of class members so that constructors and
 # destructors are listed first. If set to NO the constructors will appear in the
 # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
@@ -592,7 +709,7 @@
 
 SORT_MEMBERS_CTORS_1ST = NO
 
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# If the SORT_GROUP_NAMES tag is set to YES then Doxygen will sort the hierarchy
 # of group names into alphabetical order. If set to NO the group names will
 # appear in their defined order.
 # The default value is: NO.
@@ -609,11 +726,11 @@
 
 SORT_BY_SCOPE_NAME     = NO
 
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# If the STRICT_PROTO_MATCHING option is enabled and Doxygen fails to do proper
 # type resolution of all parameters of a function it will reject a match between
 # the prototype and the implementation of a member function even if there is
 # only one candidate or it is obvious which candidate to choose by doing a
-# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# simple string match. By disabling STRICT_PROTO_MATCHING Doxygen will still
 # accept a match between prototype and implementation in such cases.
 # The default value is: NO.
 
@@ -683,24 +800,25 @@
 SHOW_NAMESPACES        = YES
 
 # The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
+# Doxygen should invoke to get the current version for each file (typically from
 # the version control system). Doxygen will invoke the program by executing (via
 # popen()) the command command input-file, where command is the value of the
 # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
-# by doxygen. Whatever the program writes to standard output is used as the file
+# by Doxygen. Whatever the program writes to standard output is used as the file
 # version. For an example see the documentation.
 
 FILE_VERSION_FILTER    =
 
 # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
+# by Doxygen. The layout file controls the global structure of the generated
 # output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option. You can
+# that represents Doxygen's defaults, run Doxygen with the -l option. You can
 # optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
 #
-# Note that if you run doxygen from a directory containing a file called
-# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# Note that if you run Doxygen from a directory containing a file called
+# DoxygenLayout.xml, Doxygen will parse it automatically even if the LAYOUT_FILE
 # tag is left empty.
 
 LAYOUT_FILE            =
@@ -708,26 +826,42 @@
 # The CITE_BIB_FILES tag can be used to specify one or more bib files containing
 # the reference definitions. This must be a list of .bib files. The .bib
 # extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
 # For LaTeX the style of the bibliography can be controlled using
 # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
 # search path. See also \cite for info how to create references.
 
 CITE_BIB_FILES         =
 
+# The EXTERNAL_TOOL_PATH tag can be used to extend the search path (PATH
+# environment variable) so that external tools such as latex and gs can be
+# found.
+# Note: Directories specified with EXTERNAL_TOOL_PATH are added in front of the
+# path already specified by the PATH variable, and are added in the order
+# specified.
+# Note: This option is particularly useful for macOS version 14 (Sonoma) and
+# higher, when running Doxygen from Doxywizard, because in this case any user-
+# defined changes to the PATH are ignored. A typical example on macOS is to set
+# EXTERNAL_TOOL_PATH = /Library/TeX/texbin /usr/local/bin
+# together with the standard path, the full search path used by doxygen when
+# launching external tools will then become
+# PATH=/Library/TeX/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
+
+EXTERNAL_TOOL_PATH     =
+
 #---------------------------------------------------------------------------
 # Configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
 
 # The QUIET tag can be used to turn on/off the messages that are generated to
-# standard output by doxygen. If QUIET is set to YES this implies that the
+# standard output by Doxygen. If QUIET is set to YES this implies that the
 # messages are off.
 # The default value is: NO.
 
 QUIET                  = NO
 
 # The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# generated to standard error (stderr) by Doxygen. If WARNINGS is set to YES
 # this implies that the warnings are on.
 #
 # Tip: Turn warnings on while writing the documentation.
@@ -735,48 +869,89 @@
 
 WARNINGS               = YES
 
-# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then Doxygen will generate
 # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
 # will automatically be disabled.
 # The default value is: YES.
 
 WARN_IF_UNDOCUMENTED   = YES
 
-# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
+# If the WARN_IF_DOC_ERROR tag is set to YES, Doxygen will generate warnings for
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
 # The default value is: YES.
 
 WARN_IF_DOC_ERROR      = YES
 
+# If WARN_IF_INCOMPLETE_DOC is set to YES, Doxygen will warn about incomplete
+# function parameter documentation. If set to NO, Doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
 # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
 # are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation.
+# value. If set to NO, Doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
 # The default value is: NO.
 
 WARN_NO_PARAMDOC       = NO
 
-# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
+# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, Doxygen will warn about
+# undocumented enumeration values. If set to NO, Doxygen will accept
+# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
 # The default value is: NO.
 
-WARN_AS_ERROR          = NO
+WARN_IF_UNDOC_ENUM_VAL = NO
 
-# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# If the WARN_AS_ERROR tag is set to YES then Doxygen will immediately stop when
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then Doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the Doxygen process Doxygen will return with a non-zero status.
+# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then Doxygen behaves
+# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined Doxygen will not
+# write the warning messages in between other messages but write them at the end
+# of a run, in case a WARN_LOGFILE is defined the warning messages will be
+# besides being in the defined file also be shown at the end of a run, unless
+# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case
+# the behavior will remain as with the setting FAIL_ON_WARNINGS.
+# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT.
+# The default value is: NO.
+
+WARN_AS_ERROR          = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that Doxygen
 # can produce. The string should contain the $file, $line, and $text tags, which
 # will be replaced by the file and line number from which the warning originated
 # and the warning text. Optionally the format may contain $version, which will
 # be replaced by the version of the file (if it could be obtained via
 # FILE_VERSION_FILTER)
+# See also: WARN_LINE_FORMAT
 # The default value is: $file:$line: $text.
 
-WARN_FORMAT            = "$file:$line: $text       "
+WARN_FORMAT            = "$file:$line: $text      "
+
+# In the $text part of the WARN_FORMAT command it is possible that a reference
+# to a more specific place is given. To make it easier to jump to this place
+# (outside of Doxygen) the user can define a custom "cut" / "paste" string.
+# Example:
+# WARN_LINE_FORMAT = "'vi $file +$line'"
+# See also: WARN_FORMAT
+# The default value is: at line $line of file $file.
+
+WARN_LINE_FORMAT       = "at line $line of file $file"
 
 # The WARN_LOGFILE tag can be used to specify a file to which warning and error
 # messages should be written. If left blank the output is written to standard
-# error (stderr).
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
 
 WARN_LOGFILE           =
 
@@ -794,27 +969,42 @@
                          ../../src
 
 # This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# that Doxygen parses. Internally Doxygen uses the UTF-8 encoding. Doxygen uses
 # libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: http://www.gnu.org/software/libiconv) for the list of
-# possible encodings.
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# See also: INPUT_FILE_ENCODING
 # The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
 
+# This tag can be used to specify the character encoding of the source files
+# that Doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
+# character encoding on a per file pattern basis. Doxygen will compare the file
+# name with each pattern and apply the encoding instead of the default
+# INPUT_ENCODING) if there is a match. The character encodings are a list of the
+# form: pattern=encoding (like *.php=ISO-8859-1).
+# See also: INPUT_ENCODING for further information on supported encodings.
+
+INPUT_FILE_ENCODING    =
+
 # If the value of the INPUT tag contains directories, you can use the
 # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
 # *.h) to filter out the source-files in the directories.
 #
 # Note that for custom extensions or not directly supported extensions you also
 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# read by doxygen.
+# read by Doxygen.
 #
-# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
-# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
-# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm,
+# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl,
+# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d,
+# *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to
+# be provided as Doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice.
 
 FILE_PATTERNS          = *.c \
                          *.cc \
@@ -849,7 +1039,7 @@
 # excluded from the INPUT source files. This way you can easily exclude a
 # subdirectory from a directory tree whose root is specified with the INPUT tag.
 #
-# Note that relative paths are relative to the directory from which doxygen is
+# Note that relative paths are relative to the directory from which Doxygen is
 # run.
 
 EXCLUDE                = ../../src/include/netif/ppp/polarssl
@@ -874,10 +1064,7 @@
 # (namespaces, classes, functions, etc.) that should be excluded from the
 # output. The symbol name can be a fully qualified name, a word, or if the
 # wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
+# ANamespace::AClass, ANamespace::*Test
 
 EXCLUDE_SYMBOLS        =
 
@@ -908,7 +1095,7 @@
 
 IMAGE_PATH             =
 
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# The INPUT_FILTER tag can be used to specify a program that Doxygen should
 # invoke to filter for each input file. Doxygen will invoke the filter program
 # by executing (via popen()) the command:
 #
@@ -923,9 +1110,14 @@
 # code is scanned, but not when the output code is generated. If lines are added
 # or removed, the anchors will not be placed correctly.
 #
+# Note that Doxygen will use the data processed and written to standard output
+# for further processing, therefore nothing else, like debug statements or used
+# commands (so in case of a Windows batch file always use @echo OFF), should be
+# written to standard output.
+#
 # Note that for custom extensions or not directly supported extensions you also
 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
+# properly processed by Doxygen.
 
 INPUT_FILTER           =
 
@@ -938,7 +1130,7 @@
 #
 # Note that for custom extensions or not directly supported extensions you also
 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
+# properly processed by Doxygen.
 
 FILTER_PATTERNS        =
 
@@ -960,10 +1152,19 @@
 # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
 # is part of the input, its contents will be placed on the main page
 # (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
+# and want to reuse the introduction page also for the Doxygen output.
 
 USE_MDFILE_AS_MAINPAGE = main_page.h
 
+# The Fortran standard specifies that for fixed formatted Fortran code all
+# characters from position 72 are to be considered as comment. A common
+# extension is to allow longer lines before the automatic comment starts. The
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
+# be processed before the automatic comment starts.
+# Minimum value: 7, maximum value: 10000, default value: 72.
+
+FORTRAN_COMMENT_AFTER  = 72
+
 #---------------------------------------------------------------------------
 # Configuration options related to source browsing
 #---------------------------------------------------------------------------
@@ -978,12 +1179,13 @@
 SOURCE_BROWSER         = NO
 
 # Setting the INLINE_SOURCES tag to YES will include the body of functions,
-# classes and enums directly into the documentation.
+# multi-line macros, enums or list initialized variables directly into the
+# documentation.
 # The default value is: NO.
 
 INLINE_SOURCES         = NO
 
-# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct Doxygen to hide any
 # special comment blocks from generated source code fragments. Normal C, C++ and
 # Fortran comments will always remain visible.
 # The default value is: YES.
@@ -991,7 +1193,7 @@
 STRIP_CODE_COMMENTS    = YES
 
 # If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
+# entity all documented functions referencing it will be listed.
 # The default value is: NO.
 
 REFERENCED_BY_RELATION = NO
@@ -1021,28 +1223,28 @@
 SOURCE_TOOLTIPS        = YES
 
 # If the USE_HTAGS tag is set to YES then the references to source code will
-# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# point to the HTML generated by the htags(1) tool instead of Doxygen built-in
 # source browser. The htags tool is part of GNU's global source tagging system
-# (see http://www.gnu.org/software/global/global.html). You will need version
+# (see https://www.gnu.org/software/global/global.html). You will need version
 # 4.8.6 or higher.
 #
 # To use it do the following:
 # - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
 # - Make sure the INPUT points to the root of the source tree
 # - Run doxygen as normal
 #
 # Doxygen will invoke htags (and that will in turn invoke gtags), so these
 # tools must be available from the command line (i.e. in the search path).
 #
-# The result: instead of the source browser generated by doxygen, the links to
+# The result: instead of the source browser generated by Doxygen, the links to
 # source code will now point to the output of htags.
 # The default value is: NO.
 # This tag requires that the tag SOURCE_BROWSER is set to YES.
 
 USE_HTAGS              = NO
 
-# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# If the VERBATIM_HEADERS tag is set the YES then Doxygen will generate a
 # verbatim copy of the header file for each class for which an include is
 # specified. Set to NO to disable this.
 # See also: Section \class.
@@ -1050,25 +1252,46 @@
 
 VERBATIM_HEADERS       = NO
 
-# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
-# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
-# cost of reduced performance. This can be particularly helpful with template
-# rich C++ code for which doxygen's built-in parser lacks the necessary type
-# information.
-# Note: The availability of this option depends on whether or not doxygen was
-# generated with the -Duse-libclang=ON option for CMake.
+# If the CLANG_ASSISTED_PARSING tag is set to YES then Doxygen will use the
+# clang parser (see:
+# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
+# performance. This can be particularly helpful with template rich C++ code for
+# which Doxygen's built-in parser lacks the necessary type information.
+# Note: The availability of this option depends on whether or not Doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
 # The default value is: NO.
 
 CLANG_ASSISTED_PARSING = NO
 
+# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
+# tag is set to YES then Doxygen will add the directory of each input to the
+# include path.
+# The default value is: YES.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_ADD_INC_PATHS    = YES
+
 # If clang assisted parsing is enabled you can provide the compiler with command
 # line options that you would normally use when invoking the compiler. Note that
-# the include paths will already be set by doxygen for the files and directories
+# the include paths will already be set by Doxygen for the files and directories
 # specified with INPUT and INCLUDE_PATH.
 # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
 
 CLANG_OPTIONS          =
 
+# If clang assisted parsing is enabled you can provide the clang parser with the
+# path to the directory containing a file called compile_commands.json. This
+# file is the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
+# options used when the source files were built. This is equivalent to
+# specifying the -p option to a clang tool, such as clang-check. These options
+# will then be passed to the parser. Any options specified with CLANG_OPTIONS
+# will be added as well.
+# Note: The availability of this option depends on whether or not Doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+
+CLANG_DATABASE_PATH    =
+
 #---------------------------------------------------------------------------
 # Configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
@@ -1080,17 +1303,11 @@
 
 ALPHABETICAL_INDEX     = NO
 
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
+# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
+# that should be ignored while generating the index headers. The IGNORE_PREFIX
+# tag works for classes, function and member names. The entity will be placed in
+# the alphabetical list under the first letter of the entity name that remains
+# after removing the prefix.
 # This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 IGNORE_PREFIX          =
@@ -1099,7 +1316,7 @@
 # Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# If the GENERATE_HTML tag is set to YES, Doxygen will generate HTML output
 # The default value is: YES.
 
 GENERATE_HTML          = YES
@@ -1120,40 +1337,40 @@
 HTML_FILE_EXTENSION    = .html
 
 # The HTML_HEADER tag can be used to specify a user-defined HTML header file for
-# each generated HTML page. If the tag is left blank doxygen will generate a
+# each generated HTML page. If the tag is left blank Doxygen will generate a
 # standard header.
 #
 # To get valid HTML the header file that includes any scripts and style sheets
-# that doxygen needs, which is dependent on the configuration options used (e.g.
+# that Doxygen needs, which is dependent on the configuration options used (e.g.
 # the setting GENERATE_TREEVIEW). It is highly recommended to start with a
 # default header using
 # doxygen -w html new_header.html new_footer.html new_stylesheet.css
 # YourConfigFile
 # and then modify the file new_header.html. See also section "Doxygen usage"
-# for information on how to generate the default header that doxygen normally
+# for information on how to generate the default header that Doxygen normally
 # uses.
 # Note: The header is subject to change so you typically have to regenerate the
-# default header when upgrading to a newer version of doxygen. For a description
+# default header when upgrading to a newer version of Doxygen. For a description
 # of the possible markers and block names see the documentation.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_HEADER            =
 
 # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
-# generated HTML page. If the tag is left blank doxygen will generate a standard
+# generated HTML page. If the tag is left blank Doxygen will generate a standard
 # footer. See HTML_HEADER for more information on how to generate a default
 # footer and what special commands can be used inside the footer. See also
 # section "Doxygen usage" for information on how to generate the default footer
-# that doxygen normally uses.
+# that Doxygen normally uses.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_FOOTER            =
 
 # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
 # sheet that is used by each HTML page. It can be used to fine-tune the look of
-# the HTML output. If left blank doxygen will generate a default style sheet.
+# the HTML output. If left blank Doxygen will generate a default style sheet.
 # See also section "Doxygen usage" for information on how to generate the style
-# sheet that doxygen normally uses.
+# sheet that Doxygen normally uses.
 # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
 # it is more robust and this tag (HTML_STYLESHEET) will in the future become
 # obsolete.
@@ -1163,13 +1380,18 @@
 
 # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
 # cascading style sheets that are included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
+# created by Doxygen. Using this option one can overrule certain style aspects.
 # This is preferred over using HTML_STYLESHEET since it does not replace the
 # standard style sheet and is therefore more robust against future updates.
 # Doxygen will copy the style sheet files to the output directory.
 # Note: The order of the extra style sheet files is of importance (e.g. the last
 # style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
+# list).
+# Note: Since the styling of scrollbars can currently not be overruled in
+# Webkit/Chromium, the styling will be left out of the default doxygen.css if
+# one or more extra stylesheets have been specified. So if scrollbar
+# customization is desired it has to be added explicitly. For an example see the
+# documentation.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_EXTRA_STYLESHEET  =
@@ -1184,10 +1406,23 @@
 
 HTML_EXTRA_FILES       =
 
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
+# should be rendered with a dark or light theme.
+# Possible values are: LIGHT always generates light mode output, DARK always
+# generates dark mode output, AUTO_LIGHT automatically sets the mode according
+# to the user preference, uses light mode if no preference is set (the default),
+# AUTO_DARK automatically sets the mode according to the user preference, uses
+# dark mode if no preference is set and TOGGLE allows a user to switch between
+# light and dark mode via a button.
+# The default value is: AUTO_LIGHT.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE        = AUTO_LIGHT
+
 # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
 # will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# this color. Hue is specified as an angle on a color-wheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
 # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
 # purple, and 360 is red again.
 # Minimum value: 0, maximum value: 359, default value: 220.
@@ -1196,7 +1431,7 @@
 HTML_COLORSTYLE_HUE    = 220
 
 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
 # value of 255 will produce the most vivid colors.
 # Minimum value: 0, maximum value: 255, default value: 100.
 # This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1214,14 +1449,16 @@
 
 HTML_COLORSTYLE_GAMMA  = 80
 
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to YES can help to show when doxygen was last run and thus if the
-# documentation is up to date.
-# The default value is: NO.
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_TIMESTAMP         = NO
+HTML_DYNAMIC_MENUS     = YES
 
 # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
 # documentation will contain sections that can be hidden and shown after the
@@ -1231,6 +1468,33 @@
 
 HTML_DYNAMIC_SECTIONS  = NO
 
+# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be
+# dynamically folded and expanded in the generated HTML source code.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_CODE_FOLDING      = YES
+
+# If the HTML_COPY_CLIPBOARD tag is set to YES then Doxygen will show an icon in
+# the top right corner of code and text fragments that allows the user to copy
+# its content to the clipboard. Note this only works if supported by the browser
+# and the web page is served via a secure context (see:
+# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file:
+# protocol.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COPY_CLIPBOARD    = YES
+
+# Doxygen stores a couple of settings persistently in the browser (via e.g.
+# cookies). By default these settings apply to all HTML pages generated by
+# Doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store
+# the settings under a project specific key, such that the user preferences will
+# be stored separately.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_PROJECT_COOKIE    =
+
 # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
 # shown in the various tree structured indices initially; the user can expand
 # and collapse entries dynamically later on. Doxygen will expand the tree to
@@ -1246,13 +1510,14 @@
 
 # If the GENERATE_DOCSET tag is set to YES, additional index files will be
 # generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: http://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, Doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
 # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
@@ -1266,6 +1531,13 @@
 
 DOCSET_FEEDNAME        = "Doxygen generated docs"
 
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL         =
+
 # This tag specifies a string that should uniquely identify the documentation
 # set bundle. This should be a reverse domain-name style string, e.g.
 # com.mycompany.MyDocSet. Doxygen will append .docset to the name.
@@ -1288,14 +1560,18 @@
 
 DOCSET_PUBLISHER_NAME  = Publisher
 
-# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# If the GENERATE_HTMLHELP tag is set to YES then Doxygen generates three
 # additional HTML index files: index.hhp, index.hhc, and index.hhk. The
 # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline the HTML help workshop was already many years
+# in maintenance mode). You can download the HTML help workshop from the web
+# archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
 #
 # The HTML Help Workshop contains a compiler that can convert all HTML output
-# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# generated by Doxygen into a single compiled HTML file (.chm). Compiled HTML
 # files are now used as the Windows 98 help format, and will replace the old
 # Windows help format (.hlp) on all Windows platforms in the future. Compressed
 # HTML files also contain an index, a table of contents, and you can search for
@@ -1315,14 +1591,14 @@
 
 # The HHC_LOCATION tag can be used to specify the location (absolute path
 # including file name) of the HTML help compiler (hhc.exe). If non-empty,
-# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# Doxygen will try to run the HTML help compiler on the generated index.hhp.
 # The file has to be specified with full path.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 HHC_LOCATION           =
 
 # The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
+# (YES) or that it should be included in the main .chm file (NO).
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
@@ -1349,6 +1625,16 @@
 
 TOC_EXPAND             = NO
 
+# The SITEMAP_URL tag is used to specify the full URL of the place where the
+# generated documentation will be placed on the server by the user during the
+# deployment of the documentation. The generated sitemap is called sitemap.xml
+# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL
+# is specified no sitemap is generated. For information about the sitemap
+# protocol see https://www.sitemaps.org
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SITEMAP_URL            =
+
 # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
 # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
 # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
@@ -1367,7 +1653,8 @@
 
 # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
 # Project output. For more information please see Qt Help Project / Namespace
-# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
 # The default value is: org.doxygen.Project.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1375,8 +1662,8 @@
 
 # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
 # Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
-# folders).
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
 # The default value is: doc.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1384,30 +1671,30 @@
 
 # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
 # filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_NAME   =
 
 # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
 # custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_ATTRS  =
 
 # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
 # project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_SECT_FILTER_ATTRS  =
 
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty Doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHG_LOCATION           =
@@ -1450,18 +1737,30 @@
 # to work a browser that supports JavaScript, DHTML, CSS and frames is required
 # (i.e. any modern browser). Windows users are probably better off using the
 # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by Doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has the same information as the tab index, you could
+# consider setting DISABLE_INDEX to YES when enabling this option.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_TREEVIEW      = YES
 
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
+# area (value NO) or if it should extend to the full height of the window (value
+# YES). Setting this to YES gives a layout similar to
+# https://docs.readthedocs.io with more room for contents, but less room for the
+# project logo, title, and description. If either GENERATE_TREEVIEW or
+# DISABLE_INDEX is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR           = NO
+
 # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
-# doxygen will group on one line in the generated HTML documentation.
+# Doxygen will group on one line in the generated HTML documentation.
 #
 # Note that a value of 0 will completely suppress the enum values from appearing
 # in the overview section.
@@ -1470,6 +1769,12 @@
 
 ENUM_VALUES_PER_LINE   = 4
 
+# When the SHOW_ENUM_VALUES tag is set doxygen will show the specified
+# enumeration values besides the enumeration mnemonics.
+# The default value is: NO.
+
+SHOW_ENUM_VALUES       = NO
+
 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
 # to set the initial width (in pixels) of the frame in which the tree is shown.
 # Minimum value: 0, maximum value: 1500, default value: 250.
@@ -1477,35 +1782,48 @@
 
 TREEVIEW_WIDTH         = 250
 
-# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# If the EXT_LINKS_IN_WINDOW option is set to YES, Doxygen will open links to
 # external symbols imported via tag files in a separate window.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 EXT_LINKS_IN_WINDOW    = NO
 
+# If the OBFUSCATE_EMAILS tag is set to YES, Doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS       = YES
+
+# If the HTML_FORMULA_FORMAT option is set to svg, Doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT    = png
+
 # Use this tag to change the font size of LaTeX formulas included as images in
 # the HTML documentation. When you change the font size after a successful
-# doxygen run you need to manually remove any form_*.png images from the HTML
+# Doxygen run you need to manually remove any form_*.png images from the HTML
 # output directory to force them to be regenerated.
 # Minimum value: 8, maximum value: 50, default value: 10.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 FORMULA_FONTSIZE       = 10
 
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
 
-FORMULA_TRANSPARENT    = YES
+FORMULA_MACROFILE      =
 
 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# http://www.mathjax.org) which uses client side Javascript for the rendering
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
 # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
 # installed or if you want to formulas look prettier in the HTML output. When
 # enabled you may also need to install MathJax separately and configure the path
@@ -1515,11 +1833,29 @@
 
 USE_MATHJAX            = NO
 
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2 and MathJax_3.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION        = MathJax_2
+
 # When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
+# (see:
+# http://docs.mathjax.org/en/latest/web/components/output.html).
 # Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for MathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
 # The default value is: HTML-CSS.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
@@ -1532,33 +1868,40 @@
 # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
 # Content Delivery Network so you can quickly see the result without installing
 # MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# MathJax from https://www.mathjax.org before deployment. The default value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
 
 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
 # extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
 # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
+# MATHJAX_EXTENSIONS = ams
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_EXTENSIONS     =
 
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# The MATHJAX_CODEFILE tag can be used to specify a file with JavaScript pieces
 # of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
 # example see the documentation.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_CODEFILE       =
 
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
-# the HTML output. The underlying search engine uses javascript and DHTML and
+# When the SEARCHENGINE tag is enabled Doxygen will generate a search box for
+# the HTML output. The underlying search engine uses JavaScript and DHTML and
 # should work on any modern browser. Note that when using HTML help
 # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
 # there is already a search function so this one should typically be disabled.
-# For large projects the javascript based search engine can be slow, then
+# For large projects the JavaScript based search engine can be slow, then
 # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
 # search using the keyboard; to jump to the search box use <access key> + S
 # (what the <access key> is depends on the OS and browser, but it is typically
@@ -1575,9 +1918,9 @@
 SEARCHENGINE           = YES
 
 # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
+# implemented using a web server instead of a web client using JavaScript. There
 # are two flavors of web server based searching depending on the EXTERNAL_SEARCH
-# setting. When disabled, doxygen will generate a PHP script for searching and
+# setting. When disabled, Doxygen will generate a PHP script for searching and
 # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
 # and searching needs to be provided by external tools. See the section
 # "External Indexing and Searching" for details.
@@ -1586,7 +1929,7 @@
 
 SERVER_BASED_SEARCH    = NO
 
-# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# When EXTERNAL_SEARCH tag is enabled Doxygen will no longer generate the PHP
 # script for searching. Instead the search results are written to an XML file
 # which needs to be processed by an external indexer. Doxygen will invoke an
 # external search engine pointed to by the SEARCHENGINE_URL option to obtain the
@@ -1594,7 +1937,8 @@
 #
 # Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
+# Xapian (see:
+# https://xapian.org/).
 #
 # See the section "External Indexing and Searching" for details.
 # The default value is: NO.
@@ -1607,8 +1951,9 @@
 #
 # Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
-# Searching" for details.
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
 # This tag requires that the tag SEARCHENGINE is set to YES.
 
 SEARCHENGINE_URL       =
@@ -1629,7 +1974,7 @@
 
 EXTERNAL_SEARCH_ID     =
 
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through Doxygen
 # projects other than the one defined by this configuration file, but that are
 # all added to the same external search index. Each project needs to have a
 # unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
@@ -1643,7 +1988,7 @@
 # Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# If the GENERATE_LATEX tag is set to YES, Doxygen will generate LaTeX output.
 # The default value is: YES.
 
 GENERATE_LATEX         = NO
@@ -1659,22 +2004,36 @@
 # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
 # invoked.
 #
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_CMD_NAME         = latex
 
 # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
 # index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
 # The default file is: makeindex.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD    = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, Doxygen generates more compact LaTeX
 # documents. This may be useful for small projects and may help to save some
 # trees in general.
 # The default value is: NO.
@@ -1703,36 +2062,38 @@
 
 EXTRA_PACKAGES         =
 
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank Doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that Doxygen normally uses.
 #
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of Doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HEADER           =
 
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank Doxygen will generate a standard footer. See
 # LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that Doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_FOOTER           =
 
 # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
 # LaTeX style sheets that are included after the standard style sheets created
-# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# by Doxygen. Using this option one can overrule certain style aspects. Doxygen
 # will copy the style sheet files to the output directory.
 # Note: The order of the extra style sheet files is of importance (e.g. the last
 # style sheet in the list overrules the setting of the previous ones in the
@@ -1758,61 +2119,59 @@
 
 PDF_HYPERLINKS         = NO
 
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
+# If the USE_PDFLATEX tag is set to YES, Doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
 # The default value is: YES.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 USE_PDFLATEX           = NO
 
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
+# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error.
+# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch
+# mode nothing is printed on the terminal, errors are scrolled as if <return> is
+# hit at every error; missing files that TeX tries to input or request from
+# keyboard input (\read on a not open input stream) cause the job to abort,
+# NON_STOP In nonstop mode the diagnostic message will appear on the terminal,
+# but there is no possibility of user interaction just like in batch mode,
+# SCROLL In scroll mode, TeX will stop only for missing files to input or if
+# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at
+# each error, asking for user intervention.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BATCHMODE        = NO
 
-# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# If the LATEX_HIDE_INDICES tag is set to YES then Doxygen will not include the
 # index chapters (such as File Index, Compound Index, etc.) in the output.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HIDE_INDICES     = NO
 
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE      = NO
-
 # The LATEX_BIB_STYLE tag can be used to specify the style to use for the
 # bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
 # The default value is: plain.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BIB_STYLE        = plain
 
-# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: NO.
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_TIMESTAMP        = NO
+LATEX_EMOJI_DIRECTORY  =
 
 #---------------------------------------------------------------------------
 # Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# If the GENERATE_RTF tag is set to YES, Doxygen will generate RTF output. The
 # RTF output is optimized for Word 97 and may not look too pretty with other RTF
 # readers/editors.
 # The default value is: NO.
@@ -1827,7 +2186,7 @@
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# If the COMPACT_RTF tag is set to YES, Doxygen generates more compact RTF
 # documents. This may be useful for small projects and may help to save some
 # trees in general.
 # The default value is: NO.
@@ -1847,38 +2206,36 @@
 
 RTF_HYPERLINKS         = NO
 
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to Doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
 #
 # See also section "Doxygen usage" for information on how to generate the
-# default style sheet that doxygen normally uses.
+# default style sheet that Doxygen normally uses.
 # This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_STYLESHEET_FILE    =
 
 # Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
+# similar to Doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
 # This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_EXTENSIONS_FILE    =
 
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
+# The RTF_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the RTF_OUTPUT output directory.
+# Note that the files will be copied as-is; there are no commands or markers
+# available.
 # This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_SOURCE_CODE        = NO
+RTF_EXTRA_FILES        =
 
 #---------------------------------------------------------------------------
 # Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# If the GENERATE_MAN tag is set to YES, Doxygen will generate man pages for
 # classes and files.
 # The default value is: NO.
 
@@ -1909,7 +2266,7 @@
 
 MAN_SUBDIR             =
 
-# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, then it
 # will generate one additional man file for each entity documented in the real
 # man page(s). These additional files only source the real man page, but without
 # them the man command would be unable to find the correct page.
@@ -1922,7 +2279,7 @@
 # Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# If the GENERATE_XML tag is set to YES, Doxygen will generate an XML file that
 # captures the structure of the code including all documentation.
 # The default value is: NO.
 
@@ -1936,7 +2293,7 @@
 
 XML_OUTPUT             = xml
 
-# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# If the XML_PROGRAMLISTING tag is set to YES, Doxygen will dump the program
 # listings (including syntax highlighting and cross-referencing information) to
 # the XML output. Note that enabling this will significantly increase the size
 # of the XML output.
@@ -1945,11 +2302,18 @@
 
 XML_PROGRAMLISTING     = YES
 
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, Doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
 #---------------------------------------------------------------------------
 # Configuration options related to the DOCBOOK output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# If the GENERATE_DOCBOOK tag is set to YES, Doxygen will generate Docbook files
 # that can be used to generate PDF.
 # The default value is: NO.
 
@@ -1963,32 +2327,49 @@
 
 DOCBOOK_OUTPUT         = docbook
 
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_PROGRAMLISTING = NO
-
 #---------------------------------------------------------------------------
 # Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
-# AutoGen Definitions (see http://autogen.sf.net) file that captures the
-# structure of the code including all documentation. Note that this feature is
-# still experimental and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, Doxygen will generate an
+# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
 # The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
 
 #---------------------------------------------------------------------------
+# Configuration options related to Sqlite3 output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_SQLITE3 tag is set to YES Doxygen will generate a Sqlite3
+# database with symbols found by Doxygen stored in tables.
+# The default value is: NO.
+
+GENERATE_SQLITE3       = NO
+
+# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be
+# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put
+# in front of it.
+# The default directory is: sqlite3.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_OUTPUT         = sqlite3
+
+# The SQLITE3_RECREATE_DB tag is set to YES, the existing doxygen_sqlite3.db
+# database file will be recreated with each Doxygen run. If set to NO, Doxygen
+# will warn if a database file is already found and not modify it.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_RECREATE_DB    = YES
+
+#---------------------------------------------------------------------------
 # Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# If the GENERATE_PERLMOD tag is set to YES, Doxygen will generate a Perl module
 # file that captures the structure of the code including all documentation.
 #
 # Note that this feature is still experimental and incomplete at the moment.
@@ -1996,7 +2377,7 @@
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# If the PERLMOD_LATEX tag is set to YES, Doxygen will generate the necessary
 # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
 # output from the Perl module output.
 # The default value is: NO.
@@ -2026,13 +2407,13 @@
 # Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# If the ENABLE_PREPROCESSING tag is set to YES, Doxygen will evaluate all
 # C-preprocessor directives found in the sources and include files.
 # The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# If the MACRO_EXPANSION tag is set to YES, Doxygen will expand all macro names
 # in the source code. If set to NO, only conditional compilation will be
 # performed. Macro expansion can be done in a controlled way by setting
 # EXPAND_ONLY_PREDEF to YES.
@@ -2058,7 +2439,8 @@
 
 # The INCLUDE_PATH tag can be used to specify one or more directories that
 # contain include files that are not input files but should be processed by the
-# preprocessor.
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
+# RECURSIVE has no effect here.
 # This tag requires that the tag SEARCH_INCLUDES is set to YES.
 
 INCLUDE_PATH           = ../../src/include
@@ -2149,7 +2531,7 @@
 
 EXPAND_AS_DEFINED      =
 
-# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# If the SKIP_FUNCTION_MACROS tag is set to YES then Doxygen's preprocessor will
 # remove all references to function-like macros that are alone on a line, have
 # an all uppercase name, and do not end with a semicolon. Such function macros
 # are typically used for boiler-plate code, and will confuse the parser if not
@@ -2173,26 +2555,26 @@
 # section "Linking to external documentation" for more information about the use
 # of tag files.
 # Note: Each tag file must have a unique name (where the name does NOT include
-# the path). If a tag file is not located in the directory in which doxygen is
+# the path). If a tag file is not located in the directory in which Doxygen is
 # run, you must also specify the path to the tagfile here.
 
 TAGFILES               =
 
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# When a file name is specified after GENERATE_TAGFILE, Doxygen will create a
 # tag file that is based on the input files it reads. See section "Linking to
 # external documentation" for more information about the usage of tag files.
 
 GENERATE_TAGFILE       =
 
-# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
-# the class index. If set to NO, only the inherited external classes will be
-# listed.
+# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces
+# will be listed in the class and namespace index. If set to NO, only the
+# inherited external classes will be listed.
 # The default value is: NO.
 
 ALLEXTERNALS           = NO
 
 # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will be
+# in the topic index. If set to NO, only the current project's groups will be
 # listed.
 # The default value is: YES.
 
@@ -2205,58 +2587,27 @@
 
 EXTERNAL_PAGES         = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH              = /usr/bin/perl
-
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to diagram generator tools
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS         = YES
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH            =
-
-# You can include diagrams made with dia in doxygen documentation. Doxygen will
-# then run dia to produce the diagram and insert it in the documentation. The
-# DIA_PATH tag allows you to specify the directory where the dia binary resides.
-# If left empty dia is assumed to be found in the default search path.
-
-DIA_PATH               =
-
 # If set to YES the inheritance and collaboration graphs will hide inheritance
 # and usage relations if the target is undocumented or is not a class.
 # The default value is: YES.
 
 HIDE_UNDOC_RELATIONS   = YES
 
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# If you set the HAVE_DOT tag to YES then Doxygen will assume the dot tool is
 # available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
 # Bell Labs. The other options in this section have no effect if this option is
 # set to NO
 # The default value is: NO.
 
 HAVE_DOT               = NO
 
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
-# to run in parallel. When set to 0 doxygen will base this on the number of
+# The DOT_NUM_THREADS specifies the number of dot invocations Doxygen is allowed
+# to run in parallel. When set to 0 Doxygen will base this on the number of
 # processors available in the system. You can set it explicitly to a value
 # larger than 0 to get control over the balance between CPU load and processing
 # speed.
@@ -2265,55 +2616,83 @@
 
 DOT_NUM_THREADS        = 0
 
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
+# subgraphs. When you want a differently looking font in the dot files that
+# Doxygen generates you can specify fontname, fontcolor and fontsize attributes.
+# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
+# Edge and Graph Attributes specification</a> You need to make sure dot is able
+# to find the font, which can be done by putting it in a standard location or by
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font. Default graphviz fontsize is 14.
+# The default value is: fontname=Helvetica,fontsize=10.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
-DOT_FONTNAME           = Helvetica
+DOT_COMMON_ATTR        = "fontname=Helvetica,fontsize=10"
 
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
+# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
+# arrows shapes.</a>
+# The default value is: labelfontname=Helvetica,labelfontsize=10.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
-DOT_FONTSIZE           = 10
+DOT_EDGE_ATTR          = "labelfontname=Helvetica,labelfontsize=10"
 
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
+# around nodes set 'shape=plain' or 'shape=plaintext' <a
+# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
+# The default value is: shape=box,height=0.2,width=0.4.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NODE_ATTR          = "shape=box,height=0.2,width=0.4"
+
+# You can set the path where dot can find font specified with fontname in
+# DOT_COMMON_ATTR and others dot attributes.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_FONTPATH           =
 
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then Doxygen will
+# generate a graph for each documented class showing the direct and indirect
+# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and
+# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case
+# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the
+# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used.
+# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance
+# relations will be shown as texts / links. Explicit enabling an inheritance
+# graph or choosing a different representation for an inheritance graph of a
+# specific class, can be accomplished by means of the command \inheritancegraph.
+# Disabling an inheritance graph can be accomplished by means of the command
+# \hideinheritancegraph.
+# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN.
 # The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
 
 CLASS_GRAPH            = YES
 
-# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# If the COLLABORATION_GRAPH tag is set to YES then Doxygen will generate a
 # graph for each documented class showing the direct and indirect implementation
 # dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
+# class with other documented classes. Explicit enabling a collaboration graph,
+# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the
+# command \collaborationgraph. Disabling a collaboration graph can be
+# accomplished by means of the command \hidecollaborationgraph.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 COLLABORATION_GRAPH    = YES
 
-# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
+# If the GROUP_GRAPHS tag is set to YES then Doxygen will generate a graph for
+# groups, showing the direct groups dependencies. Explicit enabling a group
+# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means
+# of the command \groupgraph. Disabling a directory graph can be accomplished by
+# means of the command \hidegroupgraph. See also the chapter Grouping in the
+# manual.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# If the UML_LOOK tag is set to YES, Doxygen will generate inheritance and
 # collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
 # The default value is: NO.
@@ -2330,10 +2709,32 @@
 # but if the number exceeds 15, the total amount of fields shown is limited to
 # 10.
 # Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
+# This tag requires that the tag UML_LOOK is set to YES.
 
 UML_LIMIT_NUM_FIELDS   = 10
 
+# If the DOT_UML_DETAILS tag is set to NO, Doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, Doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, Doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS        = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will be wrapped across multiple lines. Some heuristics are
+# applied to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD     = 17
+
 # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
 # collaboration graphs will show the relations between templates and their
 # instances.
@@ -2343,24 +2744,29 @@
 TEMPLATE_RELATIONS     = NO
 
 # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
-# YES then doxygen will generate a graph for each documented file showing the
+# YES then Doxygen will generate a graph for each documented file showing the
 # direct and indirect include dependencies of the file with other documented
-# files.
+# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO,
+# can be accomplished by means of the command \includegraph. Disabling an
+# include graph can be accomplished by means of the command \hideincludegraph.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDE_GRAPH          = YES
 
 # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
-# set to YES then doxygen will generate a graph for each documented file showing
+# set to YES then Doxygen will generate a graph for each documented file showing
 # the direct and indirect include dependencies of the file with other documented
-# files.
+# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set
+# to NO, can be accomplished by means of the command \includedbygraph. Disabling
+# an included by graph can be accomplished by means of the command
+# \hideincludedbygraph.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDED_BY_GRAPH      = YES
 
-# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# If the CALL_GRAPH tag is set to YES then Doxygen will generate a call
 # dependency graph for every global function or class method.
 #
 # Note that enabling this option will significantly increase the time of a run.
@@ -2372,7 +2778,7 @@
 
 CALL_GRAPH             = NO
 
-# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# If the CALLER_GRAPH tag is set to YES then Doxygen will generate a caller
 # dependency graph for every global function or class method.
 #
 # Note that enabling this option will significantly increase the time of a run.
@@ -2384,26 +2790,36 @@
 
 CALLER_GRAPH           = NO
 
-# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# If the GRAPHICAL_HIERARCHY tag is set to YES then Doxygen will graphical
 # hierarchy of all classes instead of a textual one.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 GRAPHICAL_HIERARCHY    = YES
 
-# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# If the DIRECTORY_GRAPH tag is set to YES then Doxygen will show the
 # dependencies a directory has on other directories in a graphical way. The
 # dependency relations are determined by the #include relations between the
-# files in the directories.
+# files in the directories. Explicit enabling a directory graph, when
+# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command
+# \directorygraph. Disabling a directory graph can be accomplished by means of
+# the command \hidedirectorygraph.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 DIRECTORY_GRAPH        = YES
 
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH    = 1
+
 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
 # generated by dot. For an explanation of the image formats see the section
 # output formats in the documentation of the dot tool (Graphviz (see:
-# http://www.graphviz.org/)).
+# https://www.graphviz.org/)).
 # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
 # to make the SVG files visible in IE 9+ (other browsers do not have this
 # requirement).
@@ -2440,11 +2856,12 @@
 
 DOTFILE_DIRS           =
 
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
+# You can include diagrams made with dia in Doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
 
-MSCFILE_DIRS           =
+DIA_PATH               =
 
 # The DIAFILE_DIRS tag can be used to specify one or more directories that
 # contain dia files that are included in the documentation (see the \diafile
@@ -2452,28 +2869,28 @@
 
 DIAFILE_DIRS           =
 
-# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
+# When using PlantUML, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
 
 PLANTUML_JAR_PATH      =
 
-# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
-# configuration file for plantuml.
+# When using PlantUML, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for PlantUML.
 
 PLANTUML_CFG_FILE      =
 
-# When using plantuml, the specified paths are searched for files specified by
-# the !include statement in a plantuml block.
+# When using PlantUML, the specified paths are searched for files specified by
+# the !include statement in a PlantUML block.
 
 PLANTUML_INCLUDE_PATH  =
 
 # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
 # that will be shown in the graph. If the number of nodes in a graph becomes
-# larger than this value, doxygen will truncate the graph, which is visualized
-# by representing a node as a red box. Note that doxygen if the number of direct
+# larger than this value, Doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that if the number of direct
 # children of the root node in a graph is already larger than
 # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
 # the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
@@ -2494,18 +2911,6 @@
 
 MAX_DOT_GRAPH_DEPTH    = 1000
 
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT        = NO
-
 # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
 # files in one run (i.e. multiple -o and -T options on the command line). This
 # makes dot run faster, but since only newer versions of dot (>1.8.10) support
@@ -2515,17 +2920,37 @@
 
 DOT_MULTI_TARGETS      = NO
 
-# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# If the GENERATE_LEGEND tag is set to YES Doxygen will generate a legend page
 # explaining the meaning of the various boxes and arrows in the dot generated
 # graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the Doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# If the DOT_CLEANUP tag is set to YES, Doxygen will remove the intermediate
 # files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
 # The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
+
+# You can define message sequence charts within Doxygen comments using the \msc
+# command. If the MSCGEN_TOOL tag is left empty (the default), then Doxygen will
+# use a built-in version of mscgen tool to produce the charts. Alternatively,
+# the MSCGEN_TOOL tag can also specify the name an external tool. For instance,
+# specifying prog as the value, Doxygen will call the tool as prog -T
+# <outfile_format> -o <outputfile> <inputfile>. The external tool should support
+# output file formats "png", "eps", "svg", and "ismap".
+
+MSCGEN_TOOL            =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
diff --git a/doc/doxygen/lwip.Doxyfile.cmake.in b/doc/doxygen/lwip.Doxyfile.cmake.in
index 063c288..7bc0ce0 100644
--- a/doc/doxygen/lwip.Doxyfile.cmake.in
+++ b/doc/doxygen/lwip.Doxyfile.cmake.in
@@ -762,7 +762,7 @@
 # a warning is encountered.
 # The default value is: NO.
 
-WARN_AS_ERROR          = NO
+WARN_AS_ERROR          = YES
 
 # The WARN_FORMAT tag determines the format of the warning messages that doxygen
 # can produce. The string should contain the $file, $line, and $text tags, which
@@ -2205,12 +2205,6 @@
 
 EXTERNAL_PAGES         = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH              = /usr/bin/perl
-
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
@@ -2224,15 +2218,6 @@
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH            =
-
 # You can include diagrams made with dia in doxygen documentation. Doxygen will
 # then run dia to produce the diagram and insert it in the documentation. The
 # DIA_PATH tag allows you to specify the directory where the dia binary resides.
diff --git a/doc/doxygen/main_page.h b/doc/doxygen/main_page.h
index 06b7937..4766c3a 100644
--- a/doc/doxygen/main_page.h
+++ b/doc/doxygen/main_page.h
@@ -2,14 +2,14 @@
  * @defgroup lwip lwIP
  *
  * @defgroup infrastructure Infrastructure
- * 
+ *
  * @defgroup api APIs
  * lwIP provides three Application Program's Interfaces (APIs) for programs
  * to use for communication with the TCP/IP code:
  * - low-level "core" / "callback" or @ref callbackstyle_api.
  * - higher-level @ref sequential_api.
  * - BSD-style @ref socket.
- * 
+ *
  * The raw TCP/IP interface allows the application program to integrate
  * better with the TCP/IP code. Program execution is event based by
  * having callback functions being called from within the TCP/IP
@@ -17,23 +17,23 @@
  * thread. The sequential API has a much higher overhead and is not very
  * well suited for small systems since it forces a multithreaded paradigm
  * on the application.
- * 
+ *
  * The raw TCP/IP interface is not only faster in terms of code execution
  * time but is also less memory intensive. The drawback is that program
  * development is somewhat harder and application programs written for
  * the raw TCP/IP interface are more difficult to understand. Still, this
  * is the preferred way of writing applications that should be small in
  * code size and memory usage.
- * 
+ *
  * All APIs can be used simultaneously by different application
  * programs. In fact, the sequential API is implemented as an application
  * program using the raw TCP/IP interface.
- * 
+ *
  * Do not confuse the lwIP raw API with raw Ethernet or IP sockets.
  * The former is a way of interfacing the lwIP network stack (including
  * TCP and UDP), the latter refers to processing raw Ethernet or IP data
  * instead of TCP connections or UDP packets.
- * 
+ *
  * Raw API applications may never block since all packet processing
  * (input and output) as well as timer processing (TCP mainly) is done
  * in a single execution context.
@@ -59,7 +59,7 @@
  * receive. This API is also used by the core stack for interaction between
  * the various protocols. It is the only API available when running lwIP
  * without an operating system.
- * 
+ *
  * @defgroup sequential_api Sequential-style APIs
  * @ingroup api
  * Sequential-style APIs, blocking functions. More overhead, but can be called
@@ -70,22 +70,22 @@
  * paradigm. Since the TCP/IP stack is event based by nature, the TCP/IP
  * code and the application program must reside in different execution
  * contexts (threads).
- * 
+ *
  * @defgroup socket Socket API
  * @ingroup api
- * BSD-style socket API.\n
- * Thread-safe, to be called from non-TCPIP threads only.\n
- * Can be activated by defining @ref LWIP_SOCKET to 1.\n
- * Header is in posix/sys/socket.h\n
+ * BSD-style socket API.<br>
+ * Thread-safe, to be called from non-TCPIP threads only.<br>
+ * Can be activated by defining @ref LWIP_SOCKET to 1.<br>
+ * Header is in posix/sys/socket.h<br>
  * The socket API is a compatibility API for existing applications,
  * currently it is built on top of the sequential API. It is meant to
  * provide all functions needed to run socket API applications running
  * on other platforms (e.g. unix / windows etc.). However, due to limitations
  * in the specification of this API, there might be incompatibilities
  * that require small modifications of existing programs.
- * 
+ *
  * @defgroup netifs NETIFs
- * 
+ *
  * @defgroup apps Applications
  */
 
@@ -112,7 +112,7 @@
  * * Add sys_mbox_trypost_fromisr() and tcpip_callbackmsg_trycallback_fromisr()
  *   (for FreeRTOS, mainly)
  * * socket API: support poll(), sendmsg() and recvmsg(); fix problems on close
- * 
+ *
  * Detailed Changelog
  * ------------------
  * @verbinclude "CHANGELOG"
@@ -124,6 +124,11 @@
  */
 
 /**
+ * @page cmake CMake build system
+ * @verbinclude "BUILDING"
+ */
+
+/**
  * @page pitfalls Common pitfalls
  *
  * Multiple Execution Contexts in lwIP code
@@ -131,21 +136,21 @@
  *
  * The most common source of lwIP problems is to have multiple execution contexts
  * inside the lwIP code.
- * 
- * lwIP can be used in two basic modes: @ref lwip_nosys (no OS/RTOS 
+ *
+ * lwIP can be used in two basic modes: @ref lwip_nosys (no OS/RTOS
  * running on target system) or @ref lwip_os (there is an OS running
  * on the target system).
- * 
+ *
  * See also: @ref multithreading (especially the part about @ref LWIP_ASSERT_CORE_LOCKED()!)
  *
  * Mainloop Mode
  * -------------
  * In mainloop mode, only @ref callbackstyle_api can be used.
- * The user has two possibilities to ensure there is only one 
- * exection context at a time in lwIP:
+ * The user has two possibilities to ensure there is only one
+ * execution context at a time in lwIP:
  *
  * 1) Deliver RX ethernet packets directly in interrupt context to lwIP
- *    by calling netif->input directly in interrupt. This implies all lwIP 
+ *    by calling netif->input directly in interrupt. This implies all lwIP
  *    callback functions are called in IRQ context, which may cause further
  *    problems in application code: IRQ is blocked for a long time, multiple
  *    execution contexts in application code etc. When the application wants
@@ -171,12 +176,12 @@
  * implemented in tcpip_input().​​
  * Again, ensure lwIP is _NEVER_ called from an interrupt, e.g.
  * some SPI IRQ wants to forward data to udp_send() or tcp_write()!
- * 
+ *
  * 1) tcpip_callback() can be used get called back from TCPIP thread,
  *    it is safe to call any @ref callbackstyle_api from there.
  *
  * 2) Use @ref LWIP_TCPIP_CORE_LOCKING. All @ref callbackstyle_api
- *    functions can be called when lwIP core lock is aquired, see
+ *    functions can be called when lwIP core lock is acquired, see
  *    @ref LOCK_TCPIP_CORE() and @ref UNLOCK_TCPIP_CORE().
  *    These macros cannot be used in an interrupt context!
  *    Note the OS must correctly handle priority inversion for this.
@@ -186,7 +191,7 @@
  *
  * DMA-capable ethernet hardware and zero-copy RX
  * ----------------------------------------------
- * 
+ *
  * lwIP changes the content of RECEIVED pbufs in the TCP code path.
  * This implies one or more cacheline(s) of the RX pbuf become dirty
  * and need to be flushed before the memory is handed over to the
@@ -207,7 +212,7 @@
 /**
  * @page mem_err Debugging memory pool sizes
  * If you have issues with lwIP and you are using memory pools, check that your pools
- * are correctly sized.\n
+ * are correctly sized.<br>
  * To debug pool sizes, \#define LWIP_STATS and MEMP_STATS to 1. Check the global variable
  * lwip_stats.memp[] using a debugger. If the "err" member of a pool is > 0, the pool
  * may be too small for your application and you need to increase its size.
@@ -215,8 +220,8 @@
 
 /**
  * @page bugs Reporting bugs
- * Please report bugs in the lwIP bug tracker at savannah.\n
- * BEFORE submitting, please check if the bug has already been reported!\n
+ * Please report bugs in the lwIP bug tracker at savannah.<br>
+ * BEFORE submitting, please check if the bug has already been reported!<br>
  * https://savannah.nongnu.org/bugs/?group=lwip
  */
 
@@ -232,12 +237,12 @@
  * Use this mode if you do not run an OS on your system. \#define NO_SYS to 1.
  * Feed incoming packets to netif->input(pbuf, netif) function from mainloop,
  * *not* *from* *interrupt* *context*. You can allocate a @ref pbuf in interrupt
- * context and put them into a queue which is processed from mainloop.\n
- * Call sys_check_timeouts() periodically in the mainloop.\n
- * Porting: implement all functions in @ref sys_time, @ref sys_prot and 
- * @ref compiler_abstraction.\n
- * You can only use @ref callbackstyle_api in this mode.\n
- * Sample code:\n
+ * context and put them into a queue which is processed from mainloop.<br>
+ * Call sys_check_timeouts() periodically in the mainloop.<br>
+ * Porting: implement all functions in @ref sys_time, @ref sys_prot and
+ * @ref compiler_abstraction.<br>
+ * You can only use @ref callbackstyle_api in this mode.<br>
+ * Sample code:
  * @include NO_SYS_SampleCode.c
  */
 
@@ -246,14 +251,14 @@
  * @ingroup lwip
  * Use this mode if you run an OS on your system. It is recommended to
  * use an RTOS that correctly handles priority inversion and
- * to use @ref LWIP_TCPIP_CORE_LOCKING.\n
- * Porting: implement all functions in @ref sys_layer.\n
+ * to use @ref LWIP_TCPIP_CORE_LOCKING.<br>
+ * Porting: implement all functions in @ref sys_layer.<br>
  * You can use @ref callbackstyle_api together with @ref tcpip_callback,
  * and all @ref sequential_api.
  */
 
 /**
- * @page sys_init System initalization
+ * @page sys_init System initialization
 A truly complete and generic sequence for initializing the lwIP stack
 cannot be given because it depends on additional initializations for
 your runtime environment (e.g. timers).
@@ -274,12 +279,12 @@
 
   The init function pointer must point to a initialization function for
   your Ethernet netif interface. The following code illustrates its use.
-  
+
 @code{.c}
   err_t netif_if_init(struct netif *netif)
   {
     u8_t i;
-    
+
     for (i = 0; i < ETHARP_HWADDR_LEN; i++) {
       netif->hwaddr[i] = some_eth_addr[i];
     }
@@ -287,11 +292,11 @@
     return ERR_OK;
   }
 @endcode
-  
+
   For Ethernet drivers, the input function pointer must point to the lwIP
   function ethernet_input() declared in "netif/etharp.h". Other drivers
   must use ip_input() declared in "lwip/ip.h".
-  
+
 - netif_set_default(struct netif *netif)
   Registers the default network interface.
 
@@ -326,7 +331,7 @@
  * from pbuf- and memory management functions). Application threads using
  * the sequential- or socket API communicate with this main thread through
  * message passing.
- * 
+ *
  * As such, the list of functions that may be called from
  * other threads or an ISR is very limited! Only functions
  * from these API header files are thread-safe:
@@ -337,43 +342,43 @@
  * - pppapi.h
  * - sockets.h
  * - sys.h
- * 
- * Additionaly, memory (de-)allocation functions may be
+ *
+ * Additionally, memory (de-)allocation functions may be
  * called from multiple threads (not ISR!) with NO_SYS=0
  * since they are protected by @ref SYS_LIGHTWEIGHT_PROT and/or
  * semaphores.
- * 
+ *
  * Netconn or Socket API functions are thread safe against the
  * core thread but they are not reentrant at the control block
  * granularity level. That is, a UDP or TCP control block must
  * not be shared among multiple threads without proper locking.
- * 
+ *
  * If @ref SYS_LIGHTWEIGHT_PROT is set to 1 and
  * @ref LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT is set to 1,
  * pbuf_free() may also be called from another thread or
  * an ISR (since only then, mem_free - for PBUF_RAM - may
  * be called from an ISR: otherwise, the HEAP is only
  * protected by semaphores).
- * 
+ *
  * How to get threading done right
  * -------------------------------
- * 
+ *
  * It is strongly recommended to implement the LWIP_ASSERT_CORE_LOCKED()
  * macro in an application that uses multithreading. lwIP code has
  * several places where a check for a correct thread context is
  * implemented which greatly helps the user to get threading done right.
- * See the example sys_arch.c files in unix and Win32 port 
- * in the contrib repository.
- * 
- * In short: Copy the functions sys_mark_tcpip_thread() and 
+ * See the example sys_arch.c files in unix and Win32 port
+ * in the lwIP/contrib subdirectory.
+ *
+ * In short: Copy the functions sys_mark_tcpip_thread() and
  * sys_check_core_locking() to your port and modify them to work with your OS.
  * Then let @ref LWIP_ASSERT_CORE_LOCKED() and @ref LWIP_MARK_TCPIP_THREAD()
  * point to these functions.
- * 
+ *
  * If you use @ref LWIP_TCPIP_CORE_LOCKING, you also need to copy and adapt
  * the functions sys_lock_tcpip_core() and sys_unlock_tcpip_core().
- * Let @ref LOCK_TCPIP_CORE() and @ref UNLOCK_TCPIP_CORE() point 
- * to these functions. 
+ * Let @ref LOCK_TCPIP_CORE() and @ref UNLOCK_TCPIP_CORE() point
+ * to these functions.
  */
 
 /**
diff --git a/doc/doxygen/output/html/acd_8c.html b/doc/doxygen/output/html/acd_8c.html
new file mode 100644
index 0000000..c277af3
--- /dev/null
+++ b/doc/doxygen/output/html/acd_8c.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/core/ipv4/acd.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('acd_8c.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle"><div class="title">acd.c File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="acd_8h.html">lwip/acd.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2acd_8h.html">lwip/prot/acd.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga158856bf139cb2761837ddfa07303bdc" id="r_ga158856bf139cb2761837ddfa07303bdc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga158856bf139cb2761837ddfa07303bdc">acd_add</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>, <a class="el" href="acd_8h.html#abb446404752f56b028eafa8302db955f">acd_conflict_callback_t</a> acd_conflict_callback)</td></tr>
+<tr class="separator:ga158856bf139cb2761837ddfa07303bdc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga70503696bca25e1cfb61fad38b4327da" id="r_ga70503696bca25e1cfb61fad38b4327da"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga70503696bca25e1cfb61fad38b4327da">acd_remove</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>)</td></tr>
+<tr class="separator:ga70503696bca25e1cfb61fad38b4327da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2ca2e2dbb9713f90515d443dc691b5cb" id="r_ga2ca2e2dbb9713f90515d443dc691b5cb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb">acd_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>, <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> ipaddr)</td></tr>
+<tr class="separator:ga2ca2e2dbb9713f90515d443dc691b5cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga36da2b23951a14ca3c92f5e78db2f1b7" id="r_ga36da2b23951a14ca3c92f5e78db2f1b7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7">acd_stop</a> (struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>)</td></tr>
+<tr class="separator:ga36da2b23951a14ca3c92f5e78db2f1b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2872fa375f9cd8f5b095639d652f6bff" id="r_ga2872fa375f9cd8f5b095639d652f6bff"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff">acd_network_changed_link_down</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga2872fa375f9cd8f5b095639d652f6bff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ddf3e1cfa8f5d674d6ce00c2f7d841e" id="r_a8ddf3e1cfa8f5d674d6ce00c2f7d841e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8ddf3e1cfa8f5d674d6ce00c2f7d841e">acd_tmr</a> (void)</td></tr>
+<tr class="separator:a8ddf3e1cfa8f5d674d6ce00c2f7d841e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa92e21410d0f0d357ab9166cda24937a" id="r_aa92e21410d0f0d357ab9166cda24937a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa92e21410d0f0d357ab9166cda24937a">acd_arp_reply</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *hdr)</td></tr>
+<tr class="separator:aa92e21410d0f0d357ab9166cda24937a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga18b444f6fc69325416b463208a754c97" id="r_ga18b444f6fc69325416b463208a754c97"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga18b444f6fc69325416b463208a754c97">acd_netif_ip_addr_changed</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *old_addr, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *new_addr)</td></tr>
+<tr class="separator:ga18b444f6fc69325416b463208a754c97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>ACD IPv4 Address Conflict Detection</p>
+<p>This is an IPv4 address conflict detection implementation for the lwIP TCP/IP stack. It aims to be conform to RFC5227. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="aa92e21410d0f0d357ab9166cda24937a" name="aa92e21410d0f0d357ab9166cda24937a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa92e21410d0f0d357ab9166cda24937a">&#9670;&#160;</a></span>acd_arp_reply()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void acd_arp_reply </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *</td>          <td class="paramname"><span class="paramname"><em>hdr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Handles every incoming ARP Packet, called by <a class="el" href="etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6">etharp_input()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface to use for acd processing </td></tr>
+    <tr><td class="paramname">hdr</td><td>Incoming ARP packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a8ddf3e1cfa8f5d674d6ce00c2f7d841e" name="a8ddf3e1cfa8f5d674d6ce00c2f7d841e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ddf3e1cfa8f5d674d6ce00c2f7d841e">&#9670;&#160;</a></span>acd_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void acd_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void</td>          <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Has to be called in loop every ACD_TMR_INTERVAL milliseconds </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li><li class="navelem"><a class="el" href="dir_a32e111ee6805cfc63488fd2d37f2390.html">ipv4</a></li><li class="navelem"><a class="el" href="acd_8c.html">acd.c</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/acd_8c.js b/doc/doxygen/output/html/acd_8c.js
new file mode 100644
index 0000000..dd1739c
--- /dev/null
+++ b/doc/doxygen/output/html/acd_8c.js
@@ -0,0 +1,11 @@
+var acd_8c =
+[
+    [ "acd_add", "group__acd.html#ga158856bf139cb2761837ddfa07303bdc", null ],
+    [ "acd_arp_reply", "acd_8c.html#aa92e21410d0f0d357ab9166cda24937a", null ],
+    [ "acd_netif_ip_addr_changed", "group__acd.html#ga18b444f6fc69325416b463208a754c97", null ],
+    [ "acd_network_changed_link_down", "group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff", null ],
+    [ "acd_remove", "group__acd.html#ga70503696bca25e1cfb61fad38b4327da", null ],
+    [ "acd_start", "group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb", null ],
+    [ "acd_stop", "group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7", null ],
+    [ "acd_tmr", "acd_8c.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/acd_8h.html b/doc/doxygen/output/html/acd_8h.html
new file mode 100644
index 0000000..e0c2b8a
--- /dev/null
+++ b/doc/doxygen/output/html/acd_8h.html
@@ -0,0 +1,246 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/acd.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('acd_8h.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle"><div class="title">acd.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2acd_8h.html">lwip/prot/acd.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structacd.html">acd</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aace6da0b0dacd77a9d6bd11f424ffa82" id="r_aace6da0b0dacd77a9d6bd11f424ffa82"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aace6da0b0dacd77a9d6bd11f424ffa82">ACD_TMR_INTERVAL</a>&#160;&#160;&#160;100</td></tr>
+<tr class="separator:aace6da0b0dacd77a9d6bd11f424ffa82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:abb446404752f56b028eafa8302db955f" id="r_abb446404752f56b028eafa8302db955f"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#abb446404752f56b028eafa8302db955f">acd_conflict_callback_t</a>) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, acd_callback_enum_t state)</td></tr>
+<tr class="separator:abb446404752f56b028eafa8302db955f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga158856bf139cb2761837ddfa07303bdc" id="r_ga158856bf139cb2761837ddfa07303bdc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga158856bf139cb2761837ddfa07303bdc">acd_add</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>, <a class="el" href="#abb446404752f56b028eafa8302db955f">acd_conflict_callback_t</a> acd_conflict_callback)</td></tr>
+<tr class="separator:ga158856bf139cb2761837ddfa07303bdc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga70503696bca25e1cfb61fad38b4327da" id="r_ga70503696bca25e1cfb61fad38b4327da"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga70503696bca25e1cfb61fad38b4327da">acd_remove</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>)</td></tr>
+<tr class="separator:ga70503696bca25e1cfb61fad38b4327da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2ca2e2dbb9713f90515d443dc691b5cb" id="r_ga2ca2e2dbb9713f90515d443dc691b5cb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb">acd_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>, <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> ipaddr)</td></tr>
+<tr class="separator:ga2ca2e2dbb9713f90515d443dc691b5cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga36da2b23951a14ca3c92f5e78db2f1b7" id="r_ga36da2b23951a14ca3c92f5e78db2f1b7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7">acd_stop</a> (struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>)</td></tr>
+<tr class="separator:ga36da2b23951a14ca3c92f5e78db2f1b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa92e21410d0f0d357ab9166cda24937a" id="r_aa92e21410d0f0d357ab9166cda24937a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa92e21410d0f0d357ab9166cda24937a">acd_arp_reply</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *hdr)</td></tr>
+<tr class="separator:aa92e21410d0f0d357ab9166cda24937a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ddf3e1cfa8f5d674d6ce00c2f7d841e" id="r_a8ddf3e1cfa8f5d674d6ce00c2f7d841e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8ddf3e1cfa8f5d674d6ce00c2f7d841e">acd_tmr</a> (void)</td></tr>
+<tr class="separator:a8ddf3e1cfa8f5d674d6ce00c2f7d841e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2872fa375f9cd8f5b095639d652f6bff" id="r_ga2872fa375f9cd8f5b095639d652f6bff"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff">acd_network_changed_link_down</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga2872fa375f9cd8f5b095639d652f6bff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga18b444f6fc69325416b463208a754c97" id="r_ga18b444f6fc69325416b463208a754c97"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html#ga18b444f6fc69325416b463208a754c97">acd_netif_ip_addr_changed</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *old_addr, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *new_addr)</td></tr>
+<tr class="separator:ga18b444f6fc69325416b463208a754c97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>ACD IPv4 Address Conflict Detection </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aace6da0b0dacd77a9d6bd11f424ffa82" name="aace6da0b0dacd77a9d6bd11f424ffa82"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aace6da0b0dacd77a9d6bd11f424ffa82">&#9670;&#160;</a></span>ACD_TMR_INTERVAL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ACD_TMR_INTERVAL&#160;&#160;&#160;100</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ACD Timing ACD_TMR_INTERVAL msecs, I recommend a value of 100. The value must divide 1000 with a remainder almost 0. Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 .... </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="abb446404752f56b028eafa8302db955f" name="abb446404752f56b028eafa8302db955f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abb446404752f56b028eafa8302db955f">&#9670;&#160;</a></span>acd_conflict_callback_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* acd_conflict_callback_t) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, acd_callback_enum_t state)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Callback function: Handle conflict information from ACD module</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface to handle conflict information on </td></tr>
+    <tr><td class="paramname">state</td><td>acd_callback_enum_t </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aa92e21410d0f0d357ab9166cda24937a" name="aa92e21410d0f0d357ab9166cda24937a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa92e21410d0f0d357ab9166cda24937a">&#9670;&#160;</a></span>acd_arp_reply()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void acd_arp_reply </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *</td>          <td class="paramname"><span class="paramname"><em>hdr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Handles every incoming ARP Packet, called by <a class="el" href="etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6">etharp_input()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface to use for acd processing </td></tr>
+    <tr><td class="paramname">hdr</td><td>Incoming ARP packet </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a8ddf3e1cfa8f5d674d6ce00c2f7d841e" name="a8ddf3e1cfa8f5d674d6ce00c2f7d841e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ddf3e1cfa8f5d674d6ce00c2f7d841e">&#9670;&#160;</a></span>acd_tmr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void acd_tmr </td>
+          <td>(</td>
+          <td class="paramtype">void</td>          <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Has to be called in loop every ACD_TMR_INTERVAL milliseconds </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li><li class="navelem"><a class="el" href="dir_4e6b3cf33a61b6caac9c8ac30c866f37.html">lwip</a></li><li class="navelem"><a class="el" href="acd_8h.html">acd.h</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/acd_8h.js b/doc/doxygen/output/html/acd_8h.js
new file mode 100644
index 0000000..a0b4aa6
--- /dev/null
+++ b/doc/doxygen/output/html/acd_8h.js
@@ -0,0 +1,14 @@
+var acd_8h =
+[
+    [ "acd", "structacd.html", "structacd" ],
+    [ "ACD_TMR_INTERVAL", "acd_8h.html#aace6da0b0dacd77a9d6bd11f424ffa82", null ],
+    [ "acd_conflict_callback_t", "acd_8h.html#abb446404752f56b028eafa8302db955f", null ],
+    [ "acd_add", "group__acd.html#ga158856bf139cb2761837ddfa07303bdc", null ],
+    [ "acd_arp_reply", "acd_8h.html#aa92e21410d0f0d357ab9166cda24937a", null ],
+    [ "acd_netif_ip_addr_changed", "group__acd.html#ga18b444f6fc69325416b463208a754c97", null ],
+    [ "acd_network_changed_link_down", "group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff", null ],
+    [ "acd_remove", "group__acd.html#ga70503696bca25e1cfb61fad38b4327da", null ],
+    [ "acd_start", "group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb", null ],
+    [ "acd_stop", "group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7", null ],
+    [ "acd_tmr", "acd_8h.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp_8c.html b/doc/doxygen/output/html/altcp_8c.html
index 95d2760..0e8d0f0 100644
--- a/doc/doxygen/output/html/altcp_8c.html
+++ b/doc/doxygen/output/html/altcp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -116,11 +116,11 @@
 <tr class="separator:aa74c9fc358cffeeb7311b4212b0d6fc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:afd7f6b6602e89cff51f8a8ea0315321d" id="r_afd7f6b6602e89cff51f8a8ea0315321d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#afd7f6b6602e89cff51f8a8ea0315321d">altcp_free</a> (struct altcp_pcb *conn)</td></tr>
 <tr class="separator:afd7f6b6602e89cff51f8a8ea0315321d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaffc72b9dc85bb0a9e83d04921d4c7bcd" id="r_gaffc72b9dc85bb0a9e83d04921d4c7bcd"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd">altcp_new_ip6</a> (altcp_allocator_t *allocator)</td></tr>
+<tr class="memitem:gaffc72b9dc85bb0a9e83d04921d4c7bcd" id="r_gaffc72b9dc85bb0a9e83d04921d4c7bcd"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd">altcp_new_ip6</a> (<a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *allocator)</td></tr>
 <tr class="separator:gaffc72b9dc85bb0a9e83d04921d4c7bcd"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga6b0fc20cce40364aa821c07dc34cb908" id="r_ga6b0fc20cce40364aa821c07dc34cb908"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a> (altcp_allocator_t *allocator)</td></tr>
+<tr class="memitem:ga6b0fc20cce40364aa821c07dc34cb908" id="r_ga6b0fc20cce40364aa821c07dc34cb908"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a> (<a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *allocator)</td></tr>
 <tr class="separator:ga6b0fc20cce40364aa821c07dc34cb908"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaba885062fe43d317e66c25feb9f7f71d" id="r_gaba885062fe43d317e66c25feb9f7f71d"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d">altcp_new_ip_type</a> (altcp_allocator_t *allocator, u8_t ip_type)</td></tr>
+<tr class="memitem:gaba885062fe43d317e66c25feb9f7f71d" id="r_gaba885062fe43d317e66c25feb9f7f71d"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d">altcp_new_ip_type</a> (<a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *allocator, u8_t ip_type)</td></tr>
 <tr class="separator:gaba885062fe43d317e66c25feb9f7f71d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga197a33af038556a04d8f27c7033d771f" id="r_ga197a33af038556a04d8f27c7033d771f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga197a33af038556a04d8f27c7033d771f">altcp_arg</a> (struct altcp_pcb *conn, void *arg)</td></tr>
 <tr class="separator:ga197a33af038556a04d8f27c7033d771f"><td class="memSeparator" colspan="2">&#160;</td></tr>
diff --git a/doc/doxygen/output/html/altcp_8h.html b/doc/doxygen/output/html/altcp_8h.html
index 408e7b9..2dc701a 100644
--- a/doc/doxygen/output/html/altcp_8h.html
+++ b/doc/doxygen/output/html/altcp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -98,6 +98,8 @@
 
 <div class="header">
   <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle"><div class="title">altcp.h File Reference</div></div>
 </div><!--header-->
@@ -108,13 +110,23 @@
 <code>#include &quot;<a class="el" href="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
 </div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaltcp__allocator__s.html">altcp_allocator_s</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga04a328f67359ee03d1ec6824978b7209" id="r_ga04a328f67359ee03d1ec6824978b7209"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structaltcp__allocator__s.html">altcp_allocator_s</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a></td></tr>
+<tr class="separator:ga04a328f67359ee03d1ec6824978b7209"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:ga6b0fc20cce40364aa821c07dc34cb908" id="r_ga6b0fc20cce40364aa821c07dc34cb908"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a> (altcp_allocator_t *allocator)</td></tr>
+<tr class="memitem:ga6b0fc20cce40364aa821c07dc34cb908" id="r_ga6b0fc20cce40364aa821c07dc34cb908"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a> (<a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *allocator)</td></tr>
 <tr class="separator:ga6b0fc20cce40364aa821c07dc34cb908"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaffc72b9dc85bb0a9e83d04921d4c7bcd" id="r_gaffc72b9dc85bb0a9e83d04921d4c7bcd"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd">altcp_new_ip6</a> (altcp_allocator_t *allocator)</td></tr>
+<tr class="memitem:gaffc72b9dc85bb0a9e83d04921d4c7bcd" id="r_gaffc72b9dc85bb0a9e83d04921d4c7bcd"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd">altcp_new_ip6</a> (<a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *allocator)</td></tr>
 <tr class="separator:gaffc72b9dc85bb0a9e83d04921d4c7bcd"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaba885062fe43d317e66c25feb9f7f71d" id="r_gaba885062fe43d317e66c25feb9f7f71d"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d">altcp_new_ip_type</a> (altcp_allocator_t *allocator, u8_t ip_type)</td></tr>
+<tr class="memitem:gaba885062fe43d317e66c25feb9f7f71d" id="r_gaba885062fe43d317e66c25feb9f7f71d"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d">altcp_new_ip_type</a> (<a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *allocator, u8_t ip_type)</td></tr>
 <tr class="separator:gaba885062fe43d317e66c25feb9f7f71d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga197a33af038556a04d8f27c7033d771f" id="r_ga197a33af038556a04d8f27c7033d771f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp.html#ga197a33af038556a04d8f27c7033d771f">altcp_arg</a> (struct altcp_pcb *conn, void *arg)</td></tr>
 <tr class="separator:ga197a33af038556a04d8f27c7033d771f"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -156,8 +168,8 @@
 <tr class="separator:ga5040b0a4646bca718d3611ba7fa558c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Application layered TCP connection API (to be used from TCPIP thread)<br  />
- This file contains the generic API. For more details see <a class="el" href="group__altcp__api.html">Application layered TCP Introduction</a>. </p>
+<div class="textblock"><p>Application layered TCP connection API (to be used from TCPIP thread)</p>
+<p>This file contains the generic API. For more details see <a class="el" href="group__altcp__api.html">Application layered TCP Introduction</a>. </p>
 </div></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/doxygen/output/html/altcp_8h.js b/doc/doxygen/output/html/altcp_8h.js
index 86f603f..b6c176b 100644
--- a/doc/doxygen/output/html/altcp_8h.js
+++ b/doc/doxygen/output/html/altcp_8h.js
@@ -1,5 +1,6 @@
 var altcp_8h =
 [
+    [ "altcp_allocator_t", "group__altcp.html#ga04a328f67359ee03d1ec6824978b7209", null ],
     [ "altcp_abort", "group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab", null ],
     [ "altcp_accept", "group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9", null ],
     [ "altcp_arg", "group__altcp.html#ga197a33af038556a04d8f27c7033d771f", null ],
diff --git a/doc/doxygen/output/html/altcp__alloc_8c.html b/doc/doxygen/output/html/altcp__alloc_8c.html
index f4e6555..2aff99e 100644
--- a/doc/doxygen/output/html/altcp__alloc_8c.html
+++ b/doc/doxygen/output/html/altcp__alloc_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -119,7 +119,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Application layered TCP connection API (to be used from TCPIP thread)<br  />
-This interface mimics the tcp callback API to the application while preventing direct linking (much like virtual functions). This way, an application can make use of other application layer protocols on top of TCP without knowing the details (e.g. TLS, proxy connection).</p>
+ This interface mimics the tcp callback API to the application while preventing direct linking (much like virtual functions). This way, an application can make use of other application layer protocols on top of TCP without knowing the details (e.g. TLS, proxy connection).</p>
 <p>This file contains allocation implementation that combine several layers. </p>
 </div></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/altcp__priv_8h.html b/doc/doxygen/output/html/altcp__priv_8h.html
index 88d57af..74a6e6f 100644
--- a/doc/doxygen/output/html/altcp__priv_8h.html
+++ b/doc/doxygen/output/html/altcp__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -115,7 +115,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Application layered TCP connection API (to be used from TCPIP thread)<br  />
-This interface mimics the tcp callback API to the application while preventing direct linking (much like virtual functions). This way, an application can make use of other application layer protocols on top of TCP without knowing the details (e.g. TLS, proxy connection). </p>
+ This interface mimics the tcp callback API to the application while preventing direct linking (much like virtual functions). This way, an application can make use of other application layer protocols on top of TCP without knowing the details (e.g. TLS, proxy connection). </p>
 </div><h2 class="groupheader">Function Documentation</h2>
 <a id="aa74c9fc358cffeeb7311b4212b0d6fc7" name="aa74c9fc358cffeeb7311b4212b0d6fc7"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aa74c9fc358cffeeb7311b4212b0d6fc7">&#9670;&#160;</a></span>altcp_alloc()</h2>
diff --git a/doc/doxygen/output/html/altcp__proxyconnect_8c.html b/doc/doxygen/output/html/altcp__proxyconnect_8c.html
index f550b06..17d7acb 100644
--- a/doc/doxygen/output/html/altcp__proxyconnect_8c.html
+++ b/doc/doxygen/output/html/altcp__proxyconnect_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/altcp__proxyconnect_8h.html b/doc/doxygen/output/html/altcp__proxyconnect_8h.html
index bf63424..1705f18 100644
--- a/doc/doxygen/output/html/altcp__proxyconnect_8h.html
+++ b/doc/doxygen/output/html/altcp__proxyconnect_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/altcp__tcp_8c.html b/doc/doxygen/output/html/altcp__tcp_8c.html
index cfb66b5..de0af79 100644
--- a/doc/doxygen/output/html/altcp__tcp_8c.html
+++ b/doc/doxygen/output/html/altcp__tcp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -117,8 +117,8 @@
 <tr class="separator:a77582c93bb8a0aa2719e86b8c8505e8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Application layered TCP connection API (to be used from TCPIP thread)<br  />
-This interface mimics the tcp callback API to the application while preventing direct linking (much like virtual functions). This way, an application can make use of other application layer protocols on top of TCP without knowing the details (e.g. TLS, proxy connection).</p>
+<div class="textblock"><p>Application layered TCP connection API (to be used from TCPIP thread)</p>
+<p>This interface mimics the tcp callback API to the application while preventing direct linking (much like virtual functions). This way, an application can make use of other application layer protocols on top of TCP without knowing the details (e.g. TLS, proxy connection).</p>
 <p>This file contains the base implementation calling into tcp. </p>
 </div><h2 class="groupheader">Function Documentation</h2>
 <a id="a77582c93bb8a0aa2719e86b8c8505e8a" name="a77582c93bb8a0aa2719e86b8c8505e8a"></a>
@@ -139,7 +139,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>altcp_tcp allocator function fitting to altcp_allocator_t / <a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a>.</p>
+<p>altcp_tcp allocator function fitting to <a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> / <a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a>.</p>
 <p>arg pointer is not used for TCP. </p>
 
 </div>
diff --git a/doc/doxygen/output/html/altcp__tcp_8h.html b/doc/doxygen/output/html/altcp__tcp_8h.html
index 0c965bc..03e82b7 100644
--- a/doc/doxygen/output/html/altcp__tcp_8h.html
+++ b/doc/doxygen/output/html/altcp__tcp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -112,7 +112,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Application layered TCP connection API (to be used from TCPIP thread)<br  />
-This interface mimics the tcp callback API to the application while preventing direct linking (much like virtual functions). This way, an application can make use of other application layer protocols on top of TCP without knowing the details (e.g. TLS, proxy connection).</p>
+ This interface mimics the tcp callback API to the application while preventing direct linking (much like virtual functions). This way, an application can make use of other application layer protocols on top of TCP without knowing the details (e.g. TLS, proxy connection).</p>
 <p>This file contains the base implementation calling into tcp. </p>
 </div><h2 class="groupheader">Function Documentation</h2>
 <a id="a77582c93bb8a0aa2719e86b8c8505e8a" name="a77582c93bb8a0aa2719e86b8c8505e8a"></a>
@@ -133,7 +133,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>altcp_tcp allocator function fitting to altcp_allocator_t / <a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a>.</p>
+<p>altcp_tcp allocator function fitting to <a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> / <a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a>.</p>
 <p>arg pointer is not used for TCP. </p>
 
 </div>
diff --git a/doc/doxygen/output/html/altcp__tls_8h.html b/doc/doxygen/output/html/altcp__tls_8h.html
index 14bd90b..f166454 100644
--- a/doc/doxygen/output/html/altcp__tls_8h.html
+++ b/doc/doxygen/output/html/altcp__tls_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -104,11 +104,12 @@
 <div class="contents">
 <div class="textblock"><code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="altcp_8h.html">lwip/altcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="altcp__tls__mbedtls__opts_8h.html">lwip/apps/altcp_tls_mbedtls_opts.h</a>&quot;</code><br />
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:gaf6ed13271394371cc89d70ef5128c411" id="r_gaf6ed13271394371cc89d70ef5128c411"><td class="memItemLeft" align="right" valign="top">struct altcp_tls_config *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#gaf6ed13271394371cc89d70ef5128c411">altcp_tls_create_config_server</a> (uint8_t cert_count)</td></tr>
-<tr class="separator:gaf6ed13271394371cc89d70ef5128c411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa37649bf24ebea235a8e3e8f50b9831f" id="r_gaa37649bf24ebea235a8e3e8f50b9831f"><td class="memItemLeft" align="right" valign="top">struct altcp_tls_config *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#gaa37649bf24ebea235a8e3e8f50b9831f">altcp_tls_create_config_server</a> (u8_t cert_count)</td></tr>
+<tr class="separator:gaa37649bf24ebea235a8e3e8f50b9831f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gae6f52370b62b0f4ba8d373c5186c9e7e" id="r_gae6f52370b62b0f4ba8d373c5186c9e7e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e">altcp_tls_config_server_add_privkey_cert</a> (struct altcp_tls_config *config, const u8_t *privkey, size_t privkey_len, const u8_t *privkey_pass, size_t privkey_pass_len, const u8_t *cert, size_t cert_len)</td></tr>
 <tr class="separator:gae6f52370b62b0f4ba8d373c5186c9e7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga60b4635c80b832a8c3b332fdede69d5e" id="r_ga60b4635c80b832a8c3b332fdede69d5e"><td class="memItemLeft" align="right" valign="top">struct altcp_tls_config *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e">altcp_tls_create_config_server_privkey_cert</a> (const u8_t *privkey, size_t privkey_len, const u8_t *privkey_pass, size_t privkey_pass_len, const u8_t *cert, size_t cert_len)</td></tr>
@@ -117,6 +118,8 @@
 <tr class="separator:ga7b3c11c8a273d68acc332c55e6b38170"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga4dccbd861c03a9c09eae6799da004597" id="r_ga4dccbd861c03a9c09eae6799da004597"><td class="memItemLeft" align="right" valign="top">struct altcp_tls_config *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597">altcp_tls_create_config_client_2wayauth</a> (const u8_t *ca, size_t ca_len, const u8_t *privkey, size_t privkey_len, const u8_t *privkey_pass, size_t privkey_pass_len, const u8_t *cert, size_t cert_len)</td></tr>
 <tr class="separator:ga4dccbd861c03a9c09eae6799da004597"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1f60b12a6a4440214b7bcf2e3ba43126" id="r_ga1f60b12a6a4440214b7bcf2e3ba43126"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga1f60b12a6a4440214b7bcf2e3ba43126">altcp_tls_configure_alpn_protocols</a> (struct altcp_tls_config *conf, const char **protos)</td></tr>
+<tr class="separator:ga1f60b12a6a4440214b7bcf2e3ba43126"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga8fb8a92fa3f84170050ddab2888b9145" id="r_ga8fb8a92fa3f84170050ddab2888b9145"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145">altcp_tls_free_config</a> (struct altcp_tls_config *conf)</td></tr>
 <tr class="separator:ga8fb8a92fa3f84170050ddab2888b9145"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga75675ccec142d17fc0695b425f3ec1c2" id="r_ga75675ccec142d17fc0695b425f3ec1c2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2">altcp_tls_free_entropy</a> (void)</td></tr>
@@ -129,6 +132,14 @@
 <tr class="separator:gab0bdfd2ede0df4d47b6e12ccac2b14bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga85d20b4dc321342cf09ad93086309bb7" id="r_ga85d20b4dc321342cf09ad93086309bb7"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7">altcp_tls_context</a> (struct altcp_pcb *conn)</td></tr>
 <tr class="separator:ga85d20b4dc321342cf09ad93086309bb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae6c3cf72fcd29e6ea4c74181370420c3" id="r_gae6c3cf72fcd29e6ea4c74181370420c3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#gae6c3cf72fcd29e6ea4c74181370420c3">altcp_tls_init_session</a> (struct altcp_tls_session *dest)</td></tr>
+<tr class="separator:gae6c3cf72fcd29e6ea4c74181370420c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga827c76a0bddc4923b9a17c813e13891e" id="r_ga827c76a0bddc4923b9a17c813e13891e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga827c76a0bddc4923b9a17c813e13891e">altcp_tls_get_session</a> (struct altcp_pcb *conn, struct altcp_tls_session *dest)</td></tr>
+<tr class="separator:ga827c76a0bddc4923b9a17c813e13891e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4aed4aa55d0e1b15f4118863cea06d18" id="r_ga4aed4aa55d0e1b15f4118863cea06d18"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga4aed4aa55d0e1b15f4118863cea06d18">altcp_tls_set_session</a> (struct altcp_pcb *conn, struct altcp_tls_session *from)</td></tr>
+<tr class="separator:ga4aed4aa55d0e1b15f4118863cea06d18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga906eefcef66e9dd2b43c3392704905f5" id="r_ga906eefcef66e9dd2b43c3392704905f5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html#ga906eefcef66e9dd2b43c3392704905f5">altcp_tls_free_session</a> (struct altcp_tls_session *dest)</td></tr>
+<tr class="separator:ga906eefcef66e9dd2b43c3392704905f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Application layered TCP/TLS connection API (to be used from TCPIP thread) </p>
diff --git a/doc/doxygen/output/html/altcp__tls_8h.js b/doc/doxygen/output/html/altcp__tls_8h.js
index b532fee..8480489 100644
--- a/doc/doxygen/output/html/altcp__tls_8h.js
+++ b/doc/doxygen/output/html/altcp__tls_8h.js
@@ -2,13 +2,18 @@
 [
     [ "altcp_tls_alloc", "group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc", null ],
     [ "altcp_tls_config_server_add_privkey_cert", "group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e", null ],
+    [ "altcp_tls_configure_alpn_protocols", "group__altcp__tls.html#ga1f60b12a6a4440214b7bcf2e3ba43126", null ],
     [ "altcp_tls_context", "group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7", null ],
     [ "altcp_tls_create_config_client", "group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170", null ],
     [ "altcp_tls_create_config_client_2wayauth", "group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597", null ],
-    [ "altcp_tls_create_config_server", "group__altcp__tls.html#gaf6ed13271394371cc89d70ef5128c411", null ],
+    [ "altcp_tls_create_config_server", "group__altcp__tls.html#gaa37649bf24ebea235a8e3e8f50b9831f", null ],
     [ "altcp_tls_create_config_server_privkey_cert", "group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e", null ],
     [ "altcp_tls_free_config", "group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145", null ],
     [ "altcp_tls_free_entropy", "group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2", null ],
+    [ "altcp_tls_free_session", "group__altcp__tls.html#ga906eefcef66e9dd2b43c3392704905f5", null ],
+    [ "altcp_tls_get_session", "group__altcp__tls.html#ga827c76a0bddc4923b9a17c813e13891e", null ],
+    [ "altcp_tls_init_session", "group__altcp__tls.html#gae6c3cf72fcd29e6ea4c74181370420c3", null ],
     [ "altcp_tls_new", "group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8", null ],
+    [ "altcp_tls_set_session", "group__altcp__tls.html#ga4aed4aa55d0e1b15f4118863cea06d18", null ],
     [ "altcp_tls_wrap", "group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls_8c.html b/doc/doxygen/output/html/altcp__tls__mbedtls_8c.html
index ed48632..b4f91f2 100644
--- a/doc/doxygen/output/html/altcp__tls__mbedtls_8c.html
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,10 +101,12 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sys_8h.html">lwip/sys.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="altcp__tls__mbedtls__opts_8h.html">lwip/apps/altcp_tls_mbedtls_opts.h</a>&quot;</code><br />
 </div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Application layered TCP/TLS connection API (to be used from TCPIP thread)</p>
-<p>This file provides a TLS layer using mbedTLS </p>
+<p>This file provides a TLS layer using mbedTLS</p>
+<p>This version is currently compatible with the 2.x.x branch (current LTS). </p>
 </div></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8c.html b/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8c.html
index b58f518..f4037b4 100644
--- a/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8c.html
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8h.html b/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8h.html
index fd89317..9763492 100644
--- a/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8h.html
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__mem_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.html b/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.html
index fb51eb8..6cdc407 100644
--- a/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.html
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -126,11 +126,28 @@
 <tr class="separator:a4917dbc00f43f88eb703c8ba89bd37f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a66eff71890153166578b0b78d780ac50" id="r_a66eff71890153166578b0b78d780ac50"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a66eff71890153166578b0b78d780ac50">ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS</a>&#160;&#160;&#160;(60 * 60 * 24)</td></tr>
 <tr class="separator:a66eff71890153166578b0b78d780ac50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a12aba61586bd71cb42b0925b9211b366" id="r_a12aba61586bd71cb42b0925b9211b366"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a12aba61586bd71cb42b0925b9211b366">ALTCP_MBEDTLS_AUTHMODE</a>&#160;&#160;&#160;MBEDTLS_SSL_VERIFY_OPTIONAL</td></tr>
+<tr class="separator:a12aba61586bd71cb42b0925b9211b366"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Application layered TCP/TLS connection API (to be used from TCPIP thread)</p>
 <p>This file contains options for an mbedtls port of the TLS layer. </p>
 </div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a12aba61586bd71cb42b0925b9211b366" name="a12aba61586bd71cb42b0925b9211b366"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a12aba61586bd71cb42b0925b9211b366">&#9670;&#160;</a></span>ALTCP_MBEDTLS_AUTHMODE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ALTCP_MBEDTLS_AUTHMODE&#160;&#160;&#160;MBEDTLS_SSL_VERIFY_OPTIONAL</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Certificate verification mode: MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL (default), MBEDTLS_SSL_VERIFY_REQUIRED (recommended) </p>
+
+</div>
+</div>
 <a id="a7727456eeb0b3311213936413d238989" name="a7727456eeb0b3311213936413d238989"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a7727456eeb0b3311213936413d238989">&#9670;&#160;</a></span>ALTCP_MBEDTLS_DEBUG</h2>
 
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.js b/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.js
index 230953d..36d43be 100644
--- a/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.js
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__opts_8h.js
@@ -1,5 +1,6 @@
 var altcp__tls__mbedtls__opts_8h =
 [
+    [ "ALTCP_MBEDTLS_AUTHMODE", "altcp__tls__mbedtls__opts_8h.html#a12aba61586bd71cb42b0925b9211b366", null ],
     [ "ALTCP_MBEDTLS_DEBUG", "altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989", null ],
     [ "ALTCP_MBEDTLS_LIB_DEBUG", "altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308", null ],
     [ "ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN", "altcp__tls__mbedtls__opts_8h.html#ad8561bbfabb4ec81ad1c4d7304d16bb5", null ],
diff --git a/doc/doxygen/output/html/altcp__tls__mbedtls__structs_8h.html b/doc/doxygen/output/html/altcp__tls__mbedtls__structs_8h.html
index 602441c..10b763e 100644
--- a/doc/doxygen/output/html/altcp__tls__mbedtls__structs_8h.html
+++ b/doc/doxygen/output/html/altcp__tls__mbedtls__structs_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/annotated.html b/doc/doxygen/output/html/annotated.html
index 59f634c..57e2675 100644
--- a/doc/doxygen/output/html/annotated.html
+++ b/doc/doxygen/output/html/annotated.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -104,128 +104,134 @@
 <div class="levels">[detail level <span onclick="javascript:dynsection.toggleLevel(1);">1</span><span onclick="javascript:dynsection.toggleLevel(2);">2</span>]</div><table class="directory">
 <tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct__lwiperf__settings.html" target="_self">_lwiperf_settings</a></td><td class="desc"></td></tr>
 <tr id="row_1_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct__lwiperf__state__tcp.html" target="_self">_lwiperf_state_tcp</a></td><td class="desc"></td></tr>
-<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structapi__msg.html" target="_self">api_msg</a></td><td class="desc"></td></tr>
-<tr id="row_3_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structautoip.html" target="_self">autoip</a></td><td class="desc"></td></tr>
-<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structbridgeif__initdata__s.html" target="_self">bridgeif_initdata_s</a></td><td class="desc"></td></tr>
-<tr id="row_5_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdhcp6__msg.html" target="_self">dhcp6_msg</a></td><td class="desc"></td></tr>
-<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdhcp__msg.html" target="_self">dhcp_msg</a></td><td class="desc"></td></tr>
-<tr id="row_7_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__answer.html" target="_self">dns_answer</a></td><td class="desc"></td></tr>
-<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__api__msg.html" target="_self">dns_api_msg</a></td><td class="desc"></td></tr>
-<tr id="row_9_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__hdr.html" target="_self">dns_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__query.html" target="_self">dns_query</a></td><td class="desc"></td></tr>
-<tr id="row_11_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__req__entry.html" target="_self">dns_req_entry</a></td><td class="desc"></td></tr>
-<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__table__entry.html" target="_self">dns_table_entry</a></td><td class="desc"></td></tr>
-<tr id="row_13_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structeth__addr.html" target="_self">eth_addr</a></td><td class="desc"></td></tr>
-<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structeth__hdr.html" target="_self">eth_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_15_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structeth__vlan__hdr.html" target="_self">eth_vlan_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_16_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structetharp__hdr.html" target="_self">etharp_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_17_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structetharp__q__entry.html" target="_self">etharp_q_entry</a></td><td class="desc"></td></tr>
-<tr id="row_18_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structgethostbyname__r__helper.html" target="_self">gethostbyname_r_helper</a></td><td class="desc"></td></tr>
-<tr id="row_19_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structicmp6__echo__hdr.html" target="_self">icmp6_echo_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_20_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structicmp6__hdr.html" target="_self">icmp6_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_21_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structicmp__echo__hdr.html" target="_self">icmp_echo_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_22_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structieee__802154__hdr.html" target="_self">ieee_802154_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_23_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structigmp__group.html" target="_self">igmp_group</a></td><td class="desc"></td></tr>
-<tr id="row_24_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structigmp__msg.html" target="_self">igmp_msg</a></td><td class="desc"></td></tr>
-<tr id="row_25_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip4__addr.html" target="_self">ip4_addr</a></td><td class="desc"></td></tr>
-<tr id="row_26_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip4__addr__packed.html" target="_self">ip4_addr_packed</a></td><td class="desc"></td></tr>
-<tr id="row_27_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip4__addr__wordaligned.html" target="_self">ip4_addr_wordaligned</a></td><td class="desc"></td></tr>
-<tr id="row_28_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__addr.html" target="_self">ip6_addr</a></td><td class="desc"></td></tr>
-<tr id="row_29_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__addr__packed.html" target="_self">ip6_addr_packed</a></td><td class="desc"></td></tr>
-<tr id="row_30_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__hdr.html" target="_self">ip6_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_31_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__reass__helper.html" target="_self">ip6_reass_helper</a></td><td class="desc"></td></tr>
-<tr id="row_32_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__reassdata.html" target="_self">ip6_reassdata</a></td><td class="desc"></td></tr>
-<tr id="row_33_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip__addr.html" target="_self">ip_addr</a></td><td class="desc"></td></tr>
-<tr id="row_34_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip__globals.html" target="_self">ip_globals</a></td><td class="desc"></td></tr>
-<tr id="row_35_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip__reass__helper.html" target="_self">ip_reass_helper</a></td><td class="desc"></td></tr>
-<tr id="row_36_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip__reassdata.html" target="_self">ip_reassdata</a></td><td class="desc"></td></tr>
-<tr id="row_37_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlowpan6__ieee802154__data.html" target="_self">lowpan6_ieee802154_data</a></td><td class="desc"></td></tr>
-<tr id="row_38_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlowpan6__link__addr.html" target="_self">lowpan6_link_addr</a></td><td class="desc"></td></tr>
-<tr id="row_39_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlowpan6__reass__helper.html" target="_self">lowpan6_reass_helper</a></td><td class="desc"></td></tr>
-<tr id="row_40_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwip__cyclic__timer.html" target="_self">lwip_cyclic_timer</a></td><td class="desc"></td></tr>
-<tr id="row_41_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwip__select__cb.html" target="_self">lwip_select_cb</a></td><td class="desc"></td></tr>
-<tr id="row_42_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwip__sock.html" target="_self">lwip_sock</a></td><td class="desc"></td></tr>
-<tr id="row_43_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__host.html" target="_self">mdns_host</a></td><td class="desc"></td></tr>
-<tr id="row_44_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__outpacket.html" target="_self">mdns_outpacket</a></td><td class="desc"></td></tr>
-<tr id="row_45_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__packet.html" target="_self">mdns_packet</a></td><td class="desc"></td></tr>
-<tr id="row_46_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__rr__info.html" target="_self">mdns_rr_info</a></td><td class="desc"></td></tr>
-<tr id="row_47_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__service.html" target="_self">mdns_service</a></td><td class="desc"></td></tr>
-<tr id="row_48_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmem.html" target="_self">mem</a></td><td class="desc"></td></tr>
-<tr id="row_49_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmemp__desc.html" target="_self">memp_desc</a></td><td class="desc"></td></tr>
-<tr id="row_50_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmld__group.html" target="_self">mld_group</a></td><td class="desc"></td></tr>
-<tr id="row_51_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmld__header.html" target="_self">mld_header</a></td><td class="desc"></td></tr>
-<tr id="row_52_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmqtt__client__s.html" target="_self">mqtt_client_s</a></td><td class="desc"></td></tr>
-<tr id="row_53_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmqtt__connect__client__info__t.html" target="_self">mqtt_connect_client_info_t</a></td><td class="desc"></td></tr>
-<tr id="row_54_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmqtt__request__t.html" target="_self">mqtt_request_t</a></td><td class="desc"></td></tr>
-<tr id="row_55_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmqtt__ringbuf__t.html" target="_self">mqtt_ringbuf_t</a></td><td class="desc"></td></tr>
-<tr id="row_56_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structna__header.html" target="_self">na_header</a></td><td class="desc"></td></tr>
-<tr id="row_57_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnd6__neighbor__cache__entry.html" target="_self">nd6_neighbor_cache_entry</a></td><td class="desc"></td></tr>
-<tr id="row_58_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnd6__q__entry.html" target="_self">nd6_q_entry</a></td><td class="desc"></td></tr>
-<tr id="row_59_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__answer.html" target="_self">netbios_answer</a></td><td class="desc"></td></tr>
-<tr id="row_60_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__hdr.html" target="_self">netbios_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_61_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__name__hdr.html" target="_self">netbios_name_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_62_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__question__hdr.html" target="_self">netbios_question_hdr</a></td><td class="desc"></td></tr>
-<tr id="row_63_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__resp.html" target="_self">netbios_resp</a></td><td class="desc"></td></tr>
-<tr id="row_64_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbuf.html" target="_self">netbuf</a></td><td class="desc"></td></tr>
-<tr id="row_65_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetconn.html" target="_self">netconn</a></td><td class="desc"></td></tr>
-<tr id="row_66_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif.html" target="_self">netif</a></td><td class="desc"></td></tr>
-<tr id="row_67_" class="odd"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_67_" class="arrow" onclick="dynsection.toggleFolder('67_')">&#9658;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="unionnetif__ext__callback__args__t.html" target="_self">netif_ext_callback_args_t</a></td><td class="desc"></td></tr>
-<tr id="row_67_0_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html" target="_self">ipv4_changed_s</a></td><td class="desc"></td></tr>
-<tr id="row_67_1_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html" target="_self">ipv6_addr_state_changed_s</a></td><td class="desc"></td></tr>
-<tr id="row_67_2_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html" target="_self">ipv6_set_s</a></td><td class="desc"></td></tr>
-<tr id="row_67_3_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html" target="_self">link_changed_s</a></td><td class="desc"></td></tr>
-<tr id="row_67_4_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1status__changed__s.html" target="_self">status_changed_s</a></td><td class="desc"></td></tr>
-<tr id="row_68_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetvector.html" target="_self">netvector</a></td><td class="desc"></td></tr>
-<tr id="row_69_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structns__header.html" target="_self">ns_header</a></td><td class="desc"></td></tr>
-<tr id="row_70_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpbuf.html" target="_self">pbuf</a></td><td class="desc"></td></tr>
-<tr id="row_71_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpbuf__custom.html" target="_self">pbuf_custom</a></td><td class="desc"></td></tr>
-<tr id="row_72_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpbuf__custom__ref.html" target="_self">pbuf_custom_ref</a></td><td class="desc"></td></tr>
-<tr id="row_73_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpbuf__rom.html" target="_self">pbuf_rom</a></td><td class="desc"></td></tr>
-<tr id="row_74_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structraw__pcb.html" target="_self">raw_pcb</a></td><td class="desc"></td></tr>
-<tr id="row_75_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structredirect__header.html" target="_self">redirect_header</a></td><td class="desc"></td></tr>
-<tr id="row_76_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structrs__header.html" target="_self">rs_header</a></td><td class="desc"></td></tr>
-<tr id="row_77_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsmtp__send__request.html" target="_self">smtp_send_request</a></td><td class="desc"></td></tr>
-<tr id="row_78_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsmtp__session.html" target="_self">smtp_session</a></td><td class="desc"></td></tr>
-<tr id="row_79_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__leaf__node.html" target="_self">snmp_leaf_node</a></td><td class="desc"></td></tr>
-<tr id="row_80_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__mib.html" target="_self">snmp_mib</a></td><td class="desc"></td></tr>
-<tr id="row_81_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__next__oid__state.html" target="_self">snmp_next_oid_state</a></td><td class="desc"></td></tr>
-<tr id="row_82_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__node.html" target="_self">snmp_node</a></td><td class="desc"></td></tr>
-<tr id="row_83_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__node__instance.html" target="_self">snmp_node_instance</a></td><td class="desc"></td></tr>
-<tr id="row_84_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__obj__id.html" target="_self">snmp_obj_id</a></td><td class="desc"></td></tr>
-<tr id="row_85_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__oid__range.html" target="_self">snmp_oid_range</a></td><td class="desc"></td></tr>
-<tr id="row_86_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__scalar__array__node.html" target="_self">snmp_scalar_array_node</a></td><td class="desc"></td></tr>
-<tr id="row_87_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__scalar__array__node__def.html" target="_self">snmp_scalar_array_node_def</a></td><td class="desc"></td></tr>
-<tr id="row_88_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__scalar__node.html" target="_self">snmp_scalar_node</a></td><td class="desc"></td></tr>
-<tr id="row_89_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__table__col__def.html" target="_self">snmp_table_col_def</a></td><td class="desc"></td></tr>
-<tr id="row_90_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__table__node.html" target="_self">snmp_table_node</a></td><td class="desc"></td></tr>
-<tr id="row_91_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__table__simple__node.html" target="_self">snmp_table_simple_node</a></td><td class="desc"></td></tr>
-<tr id="row_92_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__threadsync__instance.html" target="_self">snmp_threadsync_instance</a></td><td class="desc"></td></tr>
-<tr id="row_93_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__threadsync__node.html" target="_self">snmp_threadsync_node</a></td><td class="desc"></td></tr>
-<tr id="row_94_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__tree__node.html" target="_self">snmp_tree_node</a></td><td class="desc"></td></tr>
-<tr id="row_95_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__varbind.html" target="_self">snmp_varbind</a></td><td class="desc"></td></tr>
-<tr id="row_96_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__varbind__len.html" target="_self">snmp_varbind_len</a></td><td class="desc"></td></tr>
-<tr id="row_97_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="unionsnmp__variant__value.html" target="_self">snmp_variant_value</a></td><td class="desc"></td></tr>
-<tr id="row_98_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsntp__msg.html" target="_self">sntp_msg</a></td><td class="desc"></td></tr>
-<tr id="row_99_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsntp__server.html" target="_self">sntp_server</a></td><td class="desc"></td></tr>
-<tr id="row_100_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsntp__time.html" target="_self">sntp_time</a></td><td class="desc"></td></tr>
-<tr id="row_101_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsntp__timestamps.html" target="_self">sntp_timestamps</a></td><td class="desc"></td></tr>
-<tr id="row_102_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="unionsockaddr__aligned.html" target="_self">sockaddr_aligned</a></td><td class="desc"></td></tr>
-<tr id="row_103_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__.html" target="_self">stats_</a></td><td class="desc"></td></tr>
-<tr id="row_104_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__igmp.html" target="_self">stats_igmp</a></td><td class="desc"></td></tr>
-<tr id="row_105_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__mem.html" target="_self">stats_mem</a></td><td class="desc"></td></tr>
-<tr id="row_106_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__mib2.html" target="_self">stats_mib2</a></td><td class="desc"></td></tr>
-<tr id="row_107_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__mib2__netif__ctrs.html" target="_self">stats_mib2_netif_ctrs</a></td><td class="desc"></td></tr>
-<tr id="row_108_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__proto.html" target="_self">stats_proto</a></td><td class="desc"></td></tr>
-<tr id="row_109_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__sys.html" target="_self">stats_sys</a></td><td class="desc"></td></tr>
-<tr id="row_110_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__syselem.html" target="_self">stats_syselem</a></td><td class="desc"></td></tr>
-<tr id="row_111_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structt_c_g_i.html" target="_self">tCGI</a></td><td class="desc"></td></tr>
-<tr id="row_112_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtcp__ext__arg__callbacks.html" target="_self">tcp_ext_arg_callbacks</a></td><td class="desc"></td></tr>
-<tr id="row_113_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtcp__pcb.html" target="_self">tcp_pcb</a></td><td class="desc"></td></tr>
-<tr id="row_114_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtcp__pcb__listen.html" target="_self">tcp_pcb_listen</a></td><td class="desc"></td></tr>
-<tr id="row_115_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtftp__context.html" target="_self">tftp_context</a></td><td class="desc"></td></tr>
-<tr id="row_116_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structthreadsync__data.html" target="_self">threadsync_data</a></td><td class="desc"></td></tr>
-<tr id="row_117_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structudp__pcb.html" target="_self">udp_pcb</a></td><td class="desc"></td></tr>
-<tr id="row_118_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structzepif__init.html" target="_self">zepif_init</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structacd.html" target="_self">acd</a></td><td class="desc"></td></tr>
+<tr id="row_3_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structaltcp__allocator__s.html" target="_self">altcp_allocator_s</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structapi__msg.html" target="_self">api_msg</a></td><td class="desc"></td></tr>
+<tr id="row_5_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structautoip.html" target="_self">autoip</a></td><td class="desc"></td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structbridgeif__initdata__s.html" target="_self">bridgeif_initdata_s</a></td><td class="desc"></td></tr>
+<tr id="row_7_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdhcp6__msg.html" target="_self">dhcp6_msg</a></td><td class="desc"></td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdhcp__msg.html" target="_self">dhcp_msg</a></td><td class="desc"></td></tr>
+<tr id="row_9_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__answer.html" target="_self">dns_answer</a></td><td class="desc"></td></tr>
+<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__api__msg.html" target="_self">dns_api_msg</a></td><td class="desc"></td></tr>
+<tr id="row_11_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__hdr.html" target="_self">dns_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__query.html" target="_self">dns_query</a></td><td class="desc"></td></tr>
+<tr id="row_13_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__req__entry.html" target="_self">dns_req_entry</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structdns__table__entry.html" target="_self">dns_table_entry</a></td><td class="desc"></td></tr>
+<tr id="row_15_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structeth__addr.html" target="_self">eth_addr</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structeth__hdr.html" target="_self">eth_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_17_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structeth__vlan__hdr.html" target="_self">eth_vlan_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_18_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structetharp__hdr.html" target="_self">etharp_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_19_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structetharp__q__entry.html" target="_self">etharp_q_entry</a></td><td class="desc"></td></tr>
+<tr id="row_20_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structgethostbyname__r__helper.html" target="_self">gethostbyname_r_helper</a></td><td class="desc"></td></tr>
+<tr id="row_21_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structicmp6__echo__hdr.html" target="_self">icmp6_echo_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_22_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structicmp6__hdr.html" target="_self">icmp6_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_23_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structicmp__echo__hdr.html" target="_self">icmp_echo_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_24_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structicmp__hdr.html" target="_self">icmp_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_25_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structieee__802154__hdr.html" target="_self">ieee_802154_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_26_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structigmp__group.html" target="_self">igmp_group</a></td><td class="desc"></td></tr>
+<tr id="row_27_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structigmp__msg.html" target="_self">igmp_msg</a></td><td class="desc"></td></tr>
+<tr id="row_28_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip4__addr.html" target="_self">ip4_addr</a></td><td class="desc"></td></tr>
+<tr id="row_29_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip4__addr__packed.html" target="_self">ip4_addr_packed</a></td><td class="desc"></td></tr>
+<tr id="row_30_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip4__addr__wordaligned.html" target="_self">ip4_addr_wordaligned</a></td><td class="desc"></td></tr>
+<tr id="row_31_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__addr.html" target="_self">ip6_addr</a></td><td class="desc"></td></tr>
+<tr id="row_32_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__addr__packed.html" target="_self">ip6_addr_packed</a></td><td class="desc"></td></tr>
+<tr id="row_33_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__hdr.html" target="_self">ip6_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_34_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__reass__helper.html" target="_self">ip6_reass_helper</a></td><td class="desc"></td></tr>
+<tr id="row_35_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip6__reassdata.html" target="_self">ip6_reassdata</a></td><td class="desc"></td></tr>
+<tr id="row_36_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip__addr.html" target="_self">ip_addr</a></td><td class="desc"></td></tr>
+<tr id="row_37_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip__globals.html" target="_self">ip_globals</a></td><td class="desc"></td></tr>
+<tr id="row_38_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip__reass__helper.html" target="_self">ip_reass_helper</a></td><td class="desc"></td></tr>
+<tr id="row_39_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structip__reassdata.html" target="_self">ip_reassdata</a></td><td class="desc"></td></tr>
+<tr id="row_40_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlowpan6__ieee802154__data.html" target="_self">lowpan6_ieee802154_data</a></td><td class="desc"></td></tr>
+<tr id="row_41_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlowpan6__link__addr.html" target="_self">lowpan6_link_addr</a></td><td class="desc"></td></tr>
+<tr id="row_42_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlowpan6__reass__helper.html" target="_self">lowpan6_reass_helper</a></td><td class="desc"></td></tr>
+<tr id="row_43_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwip__cyclic__timer.html" target="_self">lwip_cyclic_timer</a></td><td class="desc"></td></tr>
+<tr id="row_44_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwip__select__cb.html" target="_self">lwip_select_cb</a></td><td class="desc"></td></tr>
+<tr id="row_45_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwip__sock.html" target="_self">lwip_sock</a></td><td class="desc"></td></tr>
+<tr id="row_46_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__delayed__msg.html" target="_self">mdns_delayed_msg</a></td><td class="desc"></td></tr>
+<tr id="row_47_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__host.html" target="_self">mdns_host</a></td><td class="desc"></td></tr>
+<tr id="row_48_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__outmsg.html" target="_self">mdns_outmsg</a></td><td class="desc"></td></tr>
+<tr id="row_49_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__outpacket.html" target="_self">mdns_outpacket</a></td><td class="desc"></td></tr>
+<tr id="row_50_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__packet.html" target="_self">mdns_packet</a></td><td class="desc"></td></tr>
+<tr id="row_51_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__request.html" target="_self">mdns_request</a></td><td class="desc"></td></tr>
+<tr id="row_52_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__rr__info.html" target="_self">mdns_rr_info</a></td><td class="desc"></td></tr>
+<tr id="row_53_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmdns__service.html" target="_self">mdns_service</a></td><td class="desc"></td></tr>
+<tr id="row_54_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmem.html" target="_self">mem</a></td><td class="desc"></td></tr>
+<tr id="row_55_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmemp__desc.html" target="_self">memp_desc</a></td><td class="desc"></td></tr>
+<tr id="row_56_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmld__group.html" target="_self">mld_group</a></td><td class="desc"></td></tr>
+<tr id="row_57_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmld__header.html" target="_self">mld_header</a></td><td class="desc"></td></tr>
+<tr id="row_58_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmqtt__client__s.html" target="_self">mqtt_client_s</a></td><td class="desc"></td></tr>
+<tr id="row_59_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmqtt__connect__client__info__t.html" target="_self">mqtt_connect_client_info_t</a></td><td class="desc"></td></tr>
+<tr id="row_60_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmqtt__request__t.html" target="_self">mqtt_request_t</a></td><td class="desc"></td></tr>
+<tr id="row_61_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structmqtt__ringbuf__t.html" target="_self">mqtt_ringbuf_t</a></td><td class="desc"></td></tr>
+<tr id="row_62_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structna__header.html" target="_self">na_header</a></td><td class="desc"></td></tr>
+<tr id="row_63_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnd6__neighbor__cache__entry.html" target="_self">nd6_neighbor_cache_entry</a></td><td class="desc"></td></tr>
+<tr id="row_64_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnd6__q__entry.html" target="_self">nd6_q_entry</a></td><td class="desc"></td></tr>
+<tr id="row_65_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__answer.html" target="_self">netbios_answer</a></td><td class="desc"></td></tr>
+<tr id="row_66_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__hdr.html" target="_self">netbios_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_67_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__name__hdr.html" target="_self">netbios_name_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_68_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__question__hdr.html" target="_self">netbios_question_hdr</a></td><td class="desc"></td></tr>
+<tr id="row_69_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbios__resp.html" target="_self">netbios_resp</a></td><td class="desc"></td></tr>
+<tr id="row_70_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetbuf.html" target="_self">netbuf</a></td><td class="desc"></td></tr>
+<tr id="row_71_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetconn.html" target="_self">netconn</a></td><td class="desc"></td></tr>
+<tr id="row_72_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif.html" target="_self">netif</a></td><td class="desc"></td></tr>
+<tr id="row_73_" class="odd"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_73_" class="arrow" onclick="dynsection.toggleFolder('73_')">&#9658;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="unionnetif__ext__callback__args__t.html" target="_self">netif_ext_callback_args_t</a></td><td class="desc"></td></tr>
+<tr id="row_73_0_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html" target="_self">ipv4_changed_s</a></td><td class="desc"></td></tr>
+<tr id="row_73_1_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html" target="_self">ipv6_addr_state_changed_s</a></td><td class="desc"></td></tr>
+<tr id="row_73_2_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html" target="_self">ipv6_set_s</a></td><td class="desc"></td></tr>
+<tr id="row_73_3_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html" target="_self">link_changed_s</a></td><td class="desc"></td></tr>
+<tr id="row_73_4_" class="even" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetif__ext__callback__args__t_1_1status__changed__s.html" target="_self">status_changed_s</a></td><td class="desc"></td></tr>
+<tr id="row_74_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structnetvector.html" target="_self">netvector</a></td><td class="desc"></td></tr>
+<tr id="row_75_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structns__header.html" target="_self">ns_header</a></td><td class="desc"></td></tr>
+<tr id="row_76_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpbuf.html" target="_self">pbuf</a></td><td class="desc"></td></tr>
+<tr id="row_77_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpbuf__custom.html" target="_self">pbuf_custom</a></td><td class="desc"></td></tr>
+<tr id="row_78_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpbuf__custom__ref.html" target="_self">pbuf_custom_ref</a></td><td class="desc"></td></tr>
+<tr id="row_79_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpbuf__rom.html" target="_self">pbuf_rom</a></td><td class="desc"></td></tr>
+<tr id="row_80_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structraw__pcb.html" target="_self">raw_pcb</a></td><td class="desc"></td></tr>
+<tr id="row_81_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structredirect__header.html" target="_self">redirect_header</a></td><td class="desc"></td></tr>
+<tr id="row_82_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structrs__header.html" target="_self">rs_header</a></td><td class="desc"></td></tr>
+<tr id="row_83_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsmtp__send__request.html" target="_self">smtp_send_request</a></td><td class="desc"></td></tr>
+<tr id="row_84_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsmtp__session.html" target="_self">smtp_session</a></td><td class="desc"></td></tr>
+<tr id="row_85_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__leaf__node.html" target="_self">snmp_leaf_node</a></td><td class="desc"></td></tr>
+<tr id="row_86_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__mib.html" target="_self">snmp_mib</a></td><td class="desc"></td></tr>
+<tr id="row_87_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__next__oid__state.html" target="_self">snmp_next_oid_state</a></td><td class="desc"></td></tr>
+<tr id="row_88_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__node.html" target="_self">snmp_node</a></td><td class="desc"></td></tr>
+<tr id="row_89_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__node__instance.html" target="_self">snmp_node_instance</a></td><td class="desc"></td></tr>
+<tr id="row_90_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__obj__id.html" target="_self">snmp_obj_id</a></td><td class="desc"></td></tr>
+<tr id="row_91_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__oid__range.html" target="_self">snmp_oid_range</a></td><td class="desc"></td></tr>
+<tr id="row_92_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__scalar__array__node.html" target="_self">snmp_scalar_array_node</a></td><td class="desc"></td></tr>
+<tr id="row_93_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__scalar__array__node__def.html" target="_self">snmp_scalar_array_node_def</a></td><td class="desc"></td></tr>
+<tr id="row_94_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__scalar__node.html" target="_self">snmp_scalar_node</a></td><td class="desc"></td></tr>
+<tr id="row_95_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__table__col__def.html" target="_self">snmp_table_col_def</a></td><td class="desc"></td></tr>
+<tr id="row_96_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__table__node.html" target="_self">snmp_table_node</a></td><td class="desc"></td></tr>
+<tr id="row_97_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__table__simple__node.html" target="_self">snmp_table_simple_node</a></td><td class="desc"></td></tr>
+<tr id="row_98_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__threadsync__instance.html" target="_self">snmp_threadsync_instance</a></td><td class="desc"></td></tr>
+<tr id="row_99_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__threadsync__node.html" target="_self">snmp_threadsync_node</a></td><td class="desc"></td></tr>
+<tr id="row_100_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__tree__node.html" target="_self">snmp_tree_node</a></td><td class="desc"></td></tr>
+<tr id="row_101_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__varbind.html" target="_self">snmp_varbind</a></td><td class="desc"></td></tr>
+<tr id="row_102_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsnmp__varbind__len.html" target="_self">snmp_varbind_len</a></td><td class="desc"></td></tr>
+<tr id="row_103_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="unionsnmp__variant__value.html" target="_self">snmp_variant_value</a></td><td class="desc"></td></tr>
+<tr id="row_104_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsntp__msg.html" target="_self">sntp_msg</a></td><td class="desc"></td></tr>
+<tr id="row_105_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsntp__server.html" target="_self">sntp_server</a></td><td class="desc"></td></tr>
+<tr id="row_106_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsntp__time.html" target="_self">sntp_time</a></td><td class="desc"></td></tr>
+<tr id="row_107_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsntp__timestamps.html" target="_self">sntp_timestamps</a></td><td class="desc"></td></tr>
+<tr id="row_108_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="unionsockaddr__aligned.html" target="_self">sockaddr_aligned</a></td><td class="desc"></td></tr>
+<tr id="row_109_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__.html" target="_self">stats_</a></td><td class="desc"></td></tr>
+<tr id="row_110_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__igmp.html" target="_self">stats_igmp</a></td><td class="desc"></td></tr>
+<tr id="row_111_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__mem.html" target="_self">stats_mem</a></td><td class="desc"></td></tr>
+<tr id="row_112_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__mib2.html" target="_self">stats_mib2</a></td><td class="desc"></td></tr>
+<tr id="row_113_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__mib2__netif__ctrs.html" target="_self">stats_mib2_netif_ctrs</a></td><td class="desc"></td></tr>
+<tr id="row_114_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__proto.html" target="_self">stats_proto</a></td><td class="desc"></td></tr>
+<tr id="row_115_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__sys.html" target="_self">stats_sys</a></td><td class="desc"></td></tr>
+<tr id="row_116_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structstats__syselem.html" target="_self">stats_syselem</a></td><td class="desc"></td></tr>
+<tr id="row_117_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structt_c_g_i.html" target="_self">tCGI</a></td><td class="desc"></td></tr>
+<tr id="row_118_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtcp__ext__arg__callbacks.html" target="_self">tcp_ext_arg_callbacks</a></td><td class="desc"></td></tr>
+<tr id="row_119_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtcp__pcb.html" target="_self">tcp_pcb</a></td><td class="desc"></td></tr>
+<tr id="row_120_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtcp__pcb__listen.html" target="_self">tcp_pcb_listen</a></td><td class="desc"></td></tr>
+<tr id="row_121_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtftp__context.html" target="_self">tftp_context</a></td><td class="desc"></td></tr>
+<tr id="row_122_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structthreadsync__data.html" target="_self">threadsync_data</a></td><td class="desc"></td></tr>
+<tr id="row_123_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structudp__pcb.html" target="_self">udp_pcb</a></td><td class="desc"></td></tr>
+<tr id="row_124_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structzepif__init.html" target="_self">zepif_init</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/annotated_dup.js b/doc/doxygen/output/html/annotated_dup.js
index 36465ce..b2d70f4 100644
--- a/doc/doxygen/output/html/annotated_dup.js
+++ b/doc/doxygen/output/html/annotated_dup.js
@@ -2,6 +2,8 @@
 [
     [ "_lwiperf_settings", "struct__lwiperf__settings.html", null ],
     [ "_lwiperf_state_tcp", "struct__lwiperf__state__tcp.html", null ],
+    [ "acd", "structacd.html", "structacd" ],
+    [ "altcp_allocator_s", "structaltcp__allocator__s.html", "structaltcp__allocator__s" ],
     [ "api_msg", "structapi__msg.html", "structapi__msg" ],
     [ "autoip", "structautoip.html", "structautoip" ],
     [ "bridgeif_initdata_s", "structbridgeif__initdata__s.html", "structbridgeif__initdata__s" ],
@@ -22,6 +24,7 @@
     [ "icmp6_echo_hdr", "structicmp6__echo__hdr.html", null ],
     [ "icmp6_hdr", "structicmp6__hdr.html", null ],
     [ "icmp_echo_hdr", "structicmp__echo__hdr.html", null ],
+    [ "icmp_hdr", "structicmp__hdr.html", null ],
     [ "ieee_802154_hdr", "structieee__802154__hdr.html", "structieee__802154__hdr" ],
     [ "igmp_group", "structigmp__group.html", "structigmp__group" ],
     [ "igmp_msg", "structigmp__msg.html", null ],
@@ -43,9 +46,12 @@
     [ "lwip_cyclic_timer", "structlwip__cyclic__timer.html", null ],
     [ "lwip_select_cb", "structlwip__select__cb.html", "structlwip__select__cb" ],
     [ "lwip_sock", "structlwip__sock.html", "structlwip__sock" ],
+    [ "mdns_delayed_msg", "structmdns__delayed__msg.html", "structmdns__delayed__msg" ],
     [ "mdns_host", "structmdns__host.html", "structmdns__host" ],
+    [ "mdns_outmsg", "structmdns__outmsg.html", "structmdns__outmsg" ],
     [ "mdns_outpacket", "structmdns__outpacket.html", "structmdns__outpacket" ],
     [ "mdns_packet", "structmdns__packet.html", "structmdns__packet" ],
+    [ "mdns_request", "structmdns__request.html", "structmdns__request" ],
     [ "mdns_rr_info", "structmdns__rr__info.html", null ],
     [ "mdns_service", "structmdns__service.html", "structmdns__service" ],
     [ "mem", "structmem.html", "structmem" ],
diff --git a/doc/doxygen/output/html/api_8h.html b/doc/doxygen/output/html/api_8h.html
index df3c8d8..541d858 100644
--- a/doc/doxygen/output/html/api_8h.html
+++ b/doc/doxygen/output/html/api_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/api__lib_8c.html b/doc/doxygen/output/html/api__lib_8c.html
index 3708937..48cdd3b 100644
--- a/doc/doxygen/output/html/api__lib_8c.html
+++ b/doc/doxygen/output/html/api__lib_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/api__msg_8c.html b/doc/doxygen/output/html/api__msg_8c.html
index 048c186..cb18486 100644
--- a/doc/doxygen/output/html/api__msg_8c.html
+++ b/doc/doxygen/output/html/api__msg_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/api__msg_8h.html b/doc/doxygen/output/html/api__msg_8h.html
index 7195cdf..d6015b9 100644
--- a/doc/doxygen/output/html/api__msg_8h.html
+++ b/doc/doxygen/output/html/api__msg_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/apps_2snmp_8h.html b/doc/doxygen/output/html/apps_2snmp_8h.html
index 0d69f20..6867193 100644
--- a/doc/doxygen/output/html/apps_2snmp_8h.html
+++ b/doc/doxygen/output/html/apps_2snmp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -148,8 +148,20 @@
 <tr class="separator:ga0e044259289cb690197173f93c17607d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga56bdce04e9e77cb3f8a872718cd273d1" id="r_ga56bdce04e9e77cb3f8a872718cd273d1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1">snmp_send_trap_specific</a> (s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds)</td></tr>
 <tr class="separator:ga56bdce04e9e77cb3f8a872718cd273d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga96cc7af0118d75049609872ea41187cd" id="r_ga96cc7af0118d75049609872ea41187cd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd">snmp_send_trap</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *oid, s32_t generic_trap, s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds)</td></tr>
-<tr class="separator:ga96cc7af0118d75049609872ea41187cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga21974b1f6b626bce1e006f09db712e9c" id="r_ga21974b1f6b626bce1e006f09db712e9c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c">snmp_send_trap</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *oid, s32_t generic_trap, s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds)</td></tr>
+<tr class="separator:ga21974b1f6b626bce1e006f09db712e9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7e4b943a9758010b02371b876abc275" id="r_gab7e4b943a9758010b02371b876abc275"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275">snmp_send_inform_generic</a> (s32_t generic_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds, s32_t *ptr_request_id)</td></tr>
+<tr class="separator:gab7e4b943a9758010b02371b876abc275"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7492bb861ba73923221a8ab49ea79210" id="r_ga7492bb861ba73923221a8ab49ea79210"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210">snmp_send_inform_specific</a> (s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds, s32_t *ptr_request_id)</td></tr>
+<tr class="separator:ga7492bb861ba73923221a8ab49ea79210"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae450dd71ad91f6c0bc243493a913f692" id="r_gae450dd71ad91f6c0bc243493a913f692"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692">snmp_send_inform</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *oid, s32_t generic_trap, s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds, s32_t *ptr_request_id)</td></tr>
+<tr class="separator:gae450dd71ad91f6c0bc243493a913f692"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga323ed081cc9903ceb6ebb26a046e0838" id="r_ga323ed081cc9903ceb6ebb26a046e0838"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838">snmp_set_inform_callback</a> (snmp_inform_callback_fct inform_callback, void *callback_arg)</td></tr>
+<tr class="separator:ga323ed081cc9903ceb6ebb26a046e0838"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6d411c0ba7a8fb1ed3777ebde5b5f455" id="r_ga6d411c0ba7a8fb1ed3777ebde5b5f455"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455">snmp_set_default_trap_version</a> (u8_t snmp_version)</td></tr>
+<tr class="separator:ga6d411c0ba7a8fb1ed3777ebde5b5f455"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf6d83aae6464852427a812f573a40359" id="r_gaf6d83aae6464852427a812f573a40359"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359">snmp_get_default_trap_version</a> (void)</td></tr>
+<tr class="separator:gaf6d83aae6464852427a812f573a40359"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gacaf816ff917f7b7e5d00ed6c9f79b51c" id="r_gacaf816ff917f7b7e5d00ed6c9f79b51c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c">snmp_set_auth_traps_enabled</a> (u8_t enable)</td></tr>
 <tr class="separator:gacaf816ff917f7b7e5d00ed6c9f79b51c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga7804a22615bd9b3a323a3f48a9fb8cb7" id="r_ga7804a22615bd9b3a323a3f48a9fb8cb7"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7">snmp_get_auth_traps_enabled</a> (void)</td></tr>
diff --git a/doc/doxygen/output/html/apps_2snmp_8h.js b/doc/doxygen/output/html/apps_2snmp_8h.js
index 4ce2156..c84f9a2 100644
--- a/doc/doxygen/output/html/apps_2snmp_8h.js
+++ b/doc/doxygen/output/html/apps_2snmp_8h.js
@@ -14,16 +14,22 @@
     [ "snmp_get_community", "group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8", null ],
     [ "snmp_get_community_trap", "group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba", null ],
     [ "snmp_get_community_write", "group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e", null ],
+    [ "snmp_get_default_trap_version", "group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359", null ],
     [ "snmp_get_device_enterprise_oid", "group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8", null ],
     [ "snmp_init", "group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5", null ],
-    [ "snmp_send_trap", "group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd", null ],
+    [ "snmp_send_inform", "group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692", null ],
+    [ "snmp_send_inform_generic", "group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275", null ],
+    [ "snmp_send_inform_specific", "group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210", null ],
+    [ "snmp_send_trap", "group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c", null ],
     [ "snmp_send_trap_generic", "group__snmp__traps.html#ga0e044259289cb690197173f93c17607d", null ],
     [ "snmp_send_trap_specific", "group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1", null ],
     [ "snmp_set_auth_traps_enabled", "group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c", null ],
     [ "snmp_set_community", "group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1", null ],
     [ "snmp_set_community_trap", "group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760", null ],
     [ "snmp_set_community_write", "group__snmp__core.html#ga341461766863cff46a44e5f431f2da01", null ],
+    [ "snmp_set_default_trap_version", "group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455", null ],
     [ "snmp_set_device_enterprise_oid", "group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a", null ],
+    [ "snmp_set_inform_callback", "group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838", null ],
     [ "snmp_set_mibs", "group__snmp__core.html#ga29c76474971f25d038fd486447c70e21", null ],
     [ "snmp_set_write_callback", "group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b", null ],
     [ "snmp_trap_dst_enable", "group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32", null ],
diff --git a/doc/doxygen/output/html/arch_8h.html b/doc/doxygen/output/html/arch_8h.html
index 738ec25..e961acb 100644
--- a/doc/doxygen/output/html/arch_8h.html
+++ b/doc/doxygen/output/html/arch_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/autoip_8c.html b/doc/doxygen/output/html/autoip_8c.html
index 2c6303a..1f1013b 100644
--- a/doc/doxygen/output/html/autoip_8c.html
+++ b/doc/doxygen/output/html/autoip_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -108,14 +108,13 @@
 <code>#include &quot;<a class="el" href="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="autoip_8h.html">lwip/autoip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="acd_8h.html">lwip/acd.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="prot_2autoip_8h.html">lwip/prot/autoip.h</a>&quot;</code><br />
 <code>#include &lt;string.h&gt;</code><br />
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
 Macros</h2></td></tr>
-<tr class="memitem:a634535156cc1a8cf9f04d3d5c74f8a59" id="r_a634535156cc1a8cf9f04d3d5c74f8a59"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a634535156cc1a8cf9f04d3d5c74f8a59">LWIP_AUTOIP_RAND</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
-<tr class="separator:a634535156cc1a8cf9f04d3d5c74f8a59"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:acec75069f6e6ecbe200c5691e56ecd43" id="r_acec75069f6e6ecbe200c5691e56ecd43"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#acec75069f6e6ecbe200c5691e56ecd43">LWIP_AUTOIP_CREATE_SEED_ADDR</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:acec75069f6e6ecbe200c5691e56ecd43"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
@@ -123,22 +122,22 @@
 Functions</h2></td></tr>
 <tr class="memitem:ga2122c0b2518b371559fef5ec1d2aed90" id="r_ga2122c0b2518b371559fef5ec1d2aed90"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90">autoip_set_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structautoip.html">autoip</a> *<a class="el" href="structautoip.html">autoip</a>)</td></tr>
 <tr class="separator:ga2122c0b2518b371559fef5ec1d2aed90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac0c98035795500ede464aa4af2515f30" id="r_gac0c98035795500ede464aa4af2515f30"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__autoip.html#gac0c98035795500ede464aa4af2515f30">autoip_remove_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gac0c98035795500ede464aa4af2515f30"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga1461f5826ebefc050e0d63013818d1e8" id="r_ga1461f5826ebefc050e0d63013818d1e8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga1461f5826ebefc050e0d63013818d1e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a11df7a20d52680cd8c1c18fba2b91e9e" id="r_a11df7a20d52680cd8c1c18fba2b91e9e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a11df7a20d52680cd8c1c18fba2b91e9e">autoip_network_changed</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
-<tr class="separator:a11df7a20d52680cd8c1c18fba2b91e9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2a36aee96cbdf8f4a8f1e69c91ff425" id="r_af2a36aee96cbdf8f4a8f1e69c91ff425"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af2a36aee96cbdf8f4a8f1e69c91ff425">autoip_network_changed_link_up</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af2a36aee96cbdf8f4a8f1e69c91ff425"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af93544c49f2c24b95a3981351d023056" id="r_af93544c49f2c24b95a3981351d023056"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af93544c49f2c24b95a3981351d023056">autoip_network_changed_link_down</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af93544c49f2c24b95a3981351d023056"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga58a4dce658dd1263e84eb982f62587d4" id="r_ga58a4dce658dd1263e84eb982f62587d4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga58a4dce658dd1263e84eb982f62587d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a746fc1d7db1bf1617afae166c9d92c2d" id="r_a746fc1d7db1bf1617afae166c9d92c2d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a746fc1d7db1bf1617afae166c9d92c2d">autoip_tmr</a> (void)</td></tr>
-<tr class="separator:a746fc1d7db1bf1617afae166c9d92c2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:acaf2793325c60dc4531c21a3fd55c16e" id="r_acaf2793325c60dc4531c21a3fd55c16e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#acaf2793325c60dc4531c21a3fd55c16e">autoip_arp_reply</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *hdr)</td></tr>
-<tr class="separator:acaf2793325c60dc4531c21a3fd55c16e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1b4f0c53da17395d9de92a85708a1bb9" id="r_a1b4f0c53da17395d9de92a85708a1bb9"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1b4f0c53da17395d9de92a85708a1bb9">autoip_supplied_address</a> (const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
-<tr class="separator:a1b4f0c53da17395d9de92a85708a1bb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6de97b7dcd98f9039d5c1ad11c257d62" id="r_a6de97b7dcd98f9039d5c1ad11c257d62"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a6de97b7dcd98f9039d5c1ad11c257d62">autoip_supplied_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a6de97b7dcd98f9039d5c1ad11c257d62"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>AutoIP Automatic LinkLocal IP Configuration</p>
-<p>This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform with RFC 3927. </p>
+<p>This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform with RFC 3927. It uses IPv4 address conflict detection to evaluate the chosen address. The ACD module aims to be conform to RFC 5227. RFC 5227 is extracted out of RFC 3927 so the acd module fits nicely in autoip. </p>
 </div><h2 class="groupheader">Macro Definition Documentation</h2>
 <a id="acec75069f6e6ecbe200c5691e56ecd43" name="acec75069f6e6ecbe200c5691e56ecd43"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#acec75069f6e6ecbe200c5691e56ecd43">&#9670;&#160;</a></span>LWIP_AUTOIP_CREATE_SEED_ADDR</h2>
@@ -157,86 +156,53 @@
 <b>Value:</b><div class="fragment"><div class="line">  <a class="code hl_function" href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl</a>(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(<a class="code hl_struct" href="structnetif.html">netif</a>-&gt;<a class="code hl_variable" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[4])) | \</div>
 <div class="line">                 ((u32_t)((u8_t)(<a class="code hl_struct" href="structnetif.html">netif</a>-&gt;<a class="code hl_variable" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[5]))) &lt;&lt; 8)))</div>
 <div class="ttc" id="adef_8c_html_a14f94347a5b9b9e3602705b75b7ae524"><div class="ttname"><a href="def_8c.html#a14f94347a5b9b9e3602705b75b7ae524">lwip_htonl</a></div><div class="ttdeci">u32_t lwip_htonl(u32_t n)</div><div class="ttdef"><b>Definition</b> def.c:90</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
-<div class="ttc" id="astructnetif_html_aee967965d999fc1a4c40a66709304e69"><div class="ttname"><a href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif::hwaddr</a></div><div class="ttdeci">u8_t hwaddr[6U]</div><div class="ttdef"><b>Definition</b> netif.h:341</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
+<div class="ttc" id="astructnetif_html_aee967965d999fc1a4c40a66709304e69"><div class="ttname"><a href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif::hwaddr</a></div><div class="ttdeci">u8_t hwaddr[6U]</div><div class="ttdef"><b>Definition</b> netif.h:350</div></div>
 </div><!-- fragment --><p>Macro that generates the initial IP address to be tried by AUTOIP. If you want to override this, define it to something else in lwipopts.h. </p>
 
 </div>
 </div>
-<a id="a634535156cc1a8cf9f04d3d5c74f8a59" name="a634535156cc1a8cf9f04d3d5c74f8a59"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a634535156cc1a8cf9f04d3d5c74f8a59">&#9670;&#160;</a></span>LWIP_AUTOIP_RAND</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">#define LWIP_AUTOIP_RAND</td>
-          <td>(</td>
-          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em><a class="el" href="structnetif.html">netif</a></em></span></td><td>)</td>
-          <td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line">                                   ( (((u32_t)((<a class="code hl_struct" href="structnetif.html">netif</a>-&gt;<a class="code hl_variable" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[5]) &amp; 0xff) &lt;&lt; 24) | \</div>
-<div class="line">                                   ((u32_t)((<a class="code hl_struct" href="structnetif.html">netif</a>-&gt;<a class="code hl_variable" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[3]) &amp; 0xff) &lt;&lt; 16) | \</div>
-<div class="line">                                   ((u32_t)((<a class="code hl_struct" href="structnetif.html">netif</a>-&gt;<a class="code hl_variable" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[2]) &amp; 0xff) &lt;&lt; 8) | \</div>
-<div class="line">                                   ((u32_t)((<a class="code hl_struct" href="structnetif.html">netif</a>-&gt;<a class="code hl_variable" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[4]) &amp; 0xff))) + \</div>
-<div class="line">                                   (netif_autoip_data(<a class="code hl_struct" href="structnetif.html">netif</a>)? netif_autoip_data(<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;tried_llipaddr : 0))</div>
-</div><!-- fragment --><p>Pseudo random macro based on netif informations. You could use "rand()" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h </p>
-
-</div>
-</div>
 <h2 class="groupheader">Function Documentation</h2>
-<a id="acaf2793325c60dc4531c21a3fd55c16e" name="acaf2793325c60dc4531c21a3fd55c16e"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#acaf2793325c60dc4531c21a3fd55c16e">&#9670;&#160;</a></span>autoip_arp_reply()</h2>
+<a id="af93544c49f2c24b95a3981351d023056" name="af93544c49f2c24b95a3981351d023056"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af93544c49f2c24b95a3981351d023056">&#9670;&#160;</a></span>autoip_network_changed_link_down()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void autoip_arp_reply </td>
-          <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *</td>          <td class="paramname"><span class="paramname"><em>hdr</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Handles every incoming ARP Packet, called by <a class="el" href="etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6">etharp_input()</a>.</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">netif</td><td>network interface to use for autoip processing </td></tr>
-    <tr><td class="paramname">hdr</td><td>Incoming ARP packet </td></tr>
-  </table>
-  </dd>
-</dl>
-
-</div>
-</div>
-<a id="a11df7a20d52680cd8c1c18fba2b91e9e" name="a11df7a20d52680cd8c1c18fba2b91e9e"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a11df7a20d52680cd8c1c18fba2b91e9e">&#9670;&#160;</a></span>autoip_network_changed()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void autoip_network_changed </td>
+          <td class="memname">void autoip_network_changed_link_down </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
           <td></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Handle a possible change in the network configuration.</p>
-<p>If there is an AutoIP address configured, take the interface down and begin probing with the same address. </p>
+<p>Handle a possible change in the network configuration: link down</p>
+<p>If there is an AutoIP address configured and AutoIP is in cooperation with DHCP, then stop the autoip module. When the link goes up, we do not want the autoip module to start again. DHCP will initiate autoip when needed. </p>
 
 </div>
 </div>
-<a id="a1b4f0c53da17395d9de92a85708a1bb9" name="a1b4f0c53da17395d9de92a85708a1bb9"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a1b4f0c53da17395d9de92a85708a1bb9">&#9670;&#160;</a></span>autoip_supplied_address()</h2>
+<a id="af2a36aee96cbdf8f4a8f1e69c91ff425" name="af2a36aee96cbdf8f4a8f1e69c91ff425"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2a36aee96cbdf8f4a8f1e69c91ff425">&#9670;&#160;</a></span>autoip_network_changed_link_up()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void autoip_network_changed_link_up </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Handle a possible change in the network configuration: link up</p>
+<p>If there is an AutoIP address configured and AutoIP is not in cooperation with DHCP, start probing for previous address. </p>
+
+</div>
+</div>
+<a id="a6de97b7dcd98f9039d5c1ad11c257d62" name="a6de97b7dcd98f9039d5c1ad11c257d62"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6de97b7dcd98f9039d5c1ad11c257d62">&#9670;&#160;</a></span>autoip_supplied_address()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -244,7 +210,7 @@
         <tr>
           <td class="memname">u8_t autoip_supplied_address </td>
           <td>(</td>
-          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
           <td></td>
         </tr>
       </table>
@@ -256,25 +222,7 @@
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>1 if AutoIP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a> (state BOUND or ANNOUNCING), 0 otherwise </dd></dl>
-
-</div>
-</div>
-<a id="a746fc1d7db1bf1617afae166c9d92c2d" name="a746fc1d7db1bf1617afae166c9d92c2d"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a746fc1d7db1bf1617afae166c9d92c2d">&#9670;&#160;</a></span>autoip_tmr()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void autoip_tmr </td>
-          <td>(</td>
-          <td class="paramtype">void</td>          <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
-          <td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds </p>
+<dl class="section return"><dt>Returns</dt><dd>1 if AutoIP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a> (state BOUND), 0 otherwise </dd></dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/autoip_8c.js b/doc/doxygen/output/html/autoip_8c.js
index 5d43343..8ce9b37 100644
--- a/doc/doxygen/output/html/autoip_8c.js
+++ b/doc/doxygen/output/html/autoip_8c.js
@@ -1,12 +1,11 @@
 var autoip_8c =
 [
     [ "LWIP_AUTOIP_CREATE_SEED_ADDR", "autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43", null ],
-    [ "LWIP_AUTOIP_RAND", "autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59", null ],
-    [ "autoip_arp_reply", "autoip_8c.html#acaf2793325c60dc4531c21a3fd55c16e", null ],
-    [ "autoip_network_changed", "autoip_8c.html#a11df7a20d52680cd8c1c18fba2b91e9e", null ],
+    [ "autoip_network_changed_link_down", "autoip_8c.html#af93544c49f2c24b95a3981351d023056", null ],
+    [ "autoip_network_changed_link_up", "autoip_8c.html#af2a36aee96cbdf8f4a8f1e69c91ff425", null ],
+    [ "autoip_remove_struct", "group__autoip.html#gac0c98035795500ede464aa4af2515f30", null ],
     [ "autoip_set_struct", "group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90", null ],
     [ "autoip_start", "group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8", null ],
     [ "autoip_stop", "group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4", null ],
-    [ "autoip_supplied_address", "autoip_8c.html#a1b4f0c53da17395d9de92a85708a1bb9", null ],
-    [ "autoip_tmr", "autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d", null ]
+    [ "autoip_supplied_address", "autoip_8c.html#a6de97b7dcd98f9039d5c1ad11c257d62", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/autoip_8h.html b/doc/doxygen/output/html/autoip_8h.html
index d98b7a8..b8cf878 100644
--- a/doc/doxygen/output/html/autoip_8h.html
+++ b/doc/doxygen/output/html/autoip_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -99,7 +99,6 @@
 <div class="header">
   <div class="summary">
 <a href="#nested-classes">Data Structures</a> &#124;
-<a href="#define-members">Macros</a> &#124;
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle"><div class="title">autoip.h File Reference</div></div>
 </div><!--header-->
@@ -107,126 +106,73 @@
 <div class="textblock"><code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="acd_8h.html">lwip/acd.h</a>&quot;</code><br />
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
 Data Structures</h2></td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structautoip.html">autoip</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
-<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
-Macros</h2></td></tr>
-<tr class="memitem:a8986919a452ab77eec9a199ff6668e92" id="r_a8986919a452ab77eec9a199ff6668e92"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8986919a452ab77eec9a199ff6668e92">AUTOIP_TMR_INTERVAL</a>&#160;&#160;&#160;100</td></tr>
-<tr class="separator:a8986919a452ab77eec9a199ff6668e92"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aaeb4b778fce078bee84144ab50916b15" id="r_aaeb4b778fce078bee84144ab50916b15"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aaeb4b778fce078bee84144ab50916b15">autoip_remove_struct</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
-<tr class="separator:aaeb4b778fce078bee84144ab50916b15"><td class="memSeparator" colspan="2">&#160;</td></tr>
-</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
 <tr class="memitem:ga2122c0b2518b371559fef5ec1d2aed90" id="r_ga2122c0b2518b371559fef5ec1d2aed90"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90">autoip_set_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structautoip.html">autoip</a> *<a class="el" href="structautoip.html">autoip</a>)</td></tr>
 <tr class="separator:ga2122c0b2518b371559fef5ec1d2aed90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac0c98035795500ede464aa4af2515f30" id="r_gac0c98035795500ede464aa4af2515f30"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__autoip.html#gac0c98035795500ede464aa4af2515f30">autoip_remove_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gac0c98035795500ede464aa4af2515f30"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga1461f5826ebefc050e0d63013818d1e8" id="r_ga1461f5826ebefc050e0d63013818d1e8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga1461f5826ebefc050e0d63013818d1e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga58a4dce658dd1263e84eb982f62587d4" id="r_ga58a4dce658dd1263e84eb982f62587d4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga58a4dce658dd1263e84eb982f62587d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:acaf2793325c60dc4531c21a3fd55c16e" id="r_acaf2793325c60dc4531c21a3fd55c16e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#acaf2793325c60dc4531c21a3fd55c16e">autoip_arp_reply</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *hdr)</td></tr>
-<tr class="separator:acaf2793325c60dc4531c21a3fd55c16e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a746fc1d7db1bf1617afae166c9d92c2d" id="r_a746fc1d7db1bf1617afae166c9d92c2d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a746fc1d7db1bf1617afae166c9d92c2d">autoip_tmr</a> (void)</td></tr>
-<tr class="separator:a746fc1d7db1bf1617afae166c9d92c2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a11df7a20d52680cd8c1c18fba2b91e9e" id="r_a11df7a20d52680cd8c1c18fba2b91e9e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a11df7a20d52680cd8c1c18fba2b91e9e">autoip_network_changed</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
-<tr class="separator:a11df7a20d52680cd8c1c18fba2b91e9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1b4f0c53da17395d9de92a85708a1bb9" id="r_a1b4f0c53da17395d9de92a85708a1bb9"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1b4f0c53da17395d9de92a85708a1bb9">autoip_supplied_address</a> (const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
-<tr class="separator:a1b4f0c53da17395d9de92a85708a1bb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2a36aee96cbdf8f4a8f1e69c91ff425" id="r_af2a36aee96cbdf8f4a8f1e69c91ff425"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af2a36aee96cbdf8f4a8f1e69c91ff425">autoip_network_changed_link_up</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af2a36aee96cbdf8f4a8f1e69c91ff425"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af93544c49f2c24b95a3981351d023056" id="r_af93544c49f2c24b95a3981351d023056"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af93544c49f2c24b95a3981351d023056">autoip_network_changed_link_down</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af93544c49f2c24b95a3981351d023056"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6de97b7dcd98f9039d5c1ad11c257d62" id="r_a6de97b7dcd98f9039d5c1ad11c257d62"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a6de97b7dcd98f9039d5c1ad11c257d62">autoip_supplied_address</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a6de97b7dcd98f9039d5c1ad11c257d62"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>AutoIP Automatic LinkLocal IP Configuration </p>
-</div><h2 class="groupheader">Macro Definition Documentation</h2>
-<a id="aaeb4b778fce078bee84144ab50916b15" name="aaeb4b778fce078bee84144ab50916b15"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aaeb4b778fce078bee84144ab50916b15">&#9670;&#160;</a></span>autoip_remove_struct</h2>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="af93544c49f2c24b95a3981351d023056" name="af93544c49f2c24b95a3981351d023056"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af93544c49f2c24b95a3981351d023056">&#9670;&#160;</a></span>autoip_network_changed_link_down()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">#define autoip_remove_struct</td>
-          <td>(</td>
-          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em><a class="el" href="structnetif.html">netif</a></em></span></td><td>)</td>
-          <td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">do</span> { (<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;<a class="code hl_struct" href="structautoip.html">autoip</a> = NULL; } <span class="keywordflow">while</span> (0)</div>
-<div class="ttc" id="astructautoip_html"><div class="ttname"><a href="structautoip.html">autoip</a></div><div class="ttdef"><b>Definition</b> autoip.h:62</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
-</div><!-- fragment --><p>Remove a struct autoip previously set to the netif using <a class="el" href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90">autoip_set_struct()</a> </p>
-
-</div>
-</div>
-<a id="a8986919a452ab77eec9a199ff6668e92" name="a8986919a452ab77eec9a199ff6668e92"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a8986919a452ab77eec9a199ff6668e92">&#9670;&#160;</a></span>AUTOIP_TMR_INTERVAL</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">#define AUTOIP_TMR_INTERVAL&#160;&#160;&#160;100</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>AutoIP Timing </p>
-
-</div>
-</div>
-<h2 class="groupheader">Function Documentation</h2>
-<a id="acaf2793325c60dc4531c21a3fd55c16e" name="acaf2793325c60dc4531c21a3fd55c16e"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#acaf2793325c60dc4531c21a3fd55c16e">&#9670;&#160;</a></span>autoip_arp_reply()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void autoip_arp_reply </td>
-          <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">struct <a class="el" href="structetharp__hdr.html">etharp_hdr</a> *</td>          <td class="paramname"><span class="paramname"><em>hdr</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Handles every incoming ARP Packet, called by <a class="el" href="etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6">etharp_input()</a>.</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">netif</td><td>network interface to use for autoip processing </td></tr>
-    <tr><td class="paramname">hdr</td><td>Incoming ARP packet </td></tr>
-  </table>
-  </dd>
-</dl>
-
-</div>
-</div>
-<a id="a11df7a20d52680cd8c1c18fba2b91e9e" name="a11df7a20d52680cd8c1c18fba2b91e9e"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a11df7a20d52680cd8c1c18fba2b91e9e">&#9670;&#160;</a></span>autoip_network_changed()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void autoip_network_changed </td>
+          <td class="memname">void autoip_network_changed_link_down </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
           <td></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Handle a possible change in the network configuration.</p>
-<p>If there is an AutoIP address configured, take the interface down and begin probing with the same address. </p>
+<p>Handle a possible change in the network configuration: link down</p>
+<p>If there is an AutoIP address configured and AutoIP is in cooperation with DHCP, then stop the autoip module. When the link goes up, we do not want the autoip module to start again. DHCP will initiate autoip when needed. </p>
 
 </div>
 </div>
-<a id="a1b4f0c53da17395d9de92a85708a1bb9" name="a1b4f0c53da17395d9de92a85708a1bb9"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a1b4f0c53da17395d9de92a85708a1bb9">&#9670;&#160;</a></span>autoip_supplied_address()</h2>
+<a id="af2a36aee96cbdf8f4a8f1e69c91ff425" name="af2a36aee96cbdf8f4a8f1e69c91ff425"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2a36aee96cbdf8f4a8f1e69c91ff425">&#9670;&#160;</a></span>autoip_network_changed_link_up()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void autoip_network_changed_link_up </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Handle a possible change in the network configuration: link up</p>
+<p>If there is an AutoIP address configured and AutoIP is not in cooperation with DHCP, start probing for previous address. </p>
+
+</div>
+</div>
+<a id="a6de97b7dcd98f9039d5c1ad11c257d62" name="a6de97b7dcd98f9039d5c1ad11c257d62"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6de97b7dcd98f9039d5c1ad11c257d62">&#9670;&#160;</a></span>autoip_supplied_address()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -234,7 +180,7 @@
         <tr>
           <td class="memname">u8_t autoip_supplied_address </td>
           <td>(</td>
-          <td class="paramtype">const struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
           <td></td>
         </tr>
       </table>
@@ -246,25 +192,7 @@
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>1 if AutoIP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a> (state BOUND or ANNOUNCING), 0 otherwise </dd></dl>
-
-</div>
-</div>
-<a id="a746fc1d7db1bf1617afae166c9d92c2d" name="a746fc1d7db1bf1617afae166c9d92c2d"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a746fc1d7db1bf1617afae166c9d92c2d">&#9670;&#160;</a></span>autoip_tmr()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void autoip_tmr </td>
-          <td>(</td>
-          <td class="paramtype">void</td>          <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
-          <td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds </p>
+<dl class="section return"><dt>Returns</dt><dd>1 if AutoIP supplied netif-&gt;<a class="el" href="structip__addr.html">ip_addr</a> (state BOUND), 0 otherwise </dd></dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/autoip_8h.js b/doc/doxygen/output/html/autoip_8h.js
index 121e938..0aee3c1 100644
--- a/doc/doxygen/output/html/autoip_8h.js
+++ b/doc/doxygen/output/html/autoip_8h.js
@@ -1,13 +1,11 @@
 var autoip_8h =
 [
     [ "autoip", "structautoip.html", "structautoip" ],
-    [ "autoip_remove_struct", "autoip_8h.html#aaeb4b778fce078bee84144ab50916b15", null ],
-    [ "AUTOIP_TMR_INTERVAL", "autoip_8h.html#a8986919a452ab77eec9a199ff6668e92", null ],
-    [ "autoip_arp_reply", "autoip_8h.html#acaf2793325c60dc4531c21a3fd55c16e", null ],
-    [ "autoip_network_changed", "autoip_8h.html#a11df7a20d52680cd8c1c18fba2b91e9e", null ],
+    [ "autoip_network_changed_link_down", "autoip_8h.html#af93544c49f2c24b95a3981351d023056", null ],
+    [ "autoip_network_changed_link_up", "autoip_8h.html#af2a36aee96cbdf8f4a8f1e69c91ff425", null ],
+    [ "autoip_remove_struct", "group__autoip.html#gac0c98035795500ede464aa4af2515f30", null ],
     [ "autoip_set_struct", "group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90", null ],
     [ "autoip_start", "group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8", null ],
     [ "autoip_stop", "group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4", null ],
-    [ "autoip_supplied_address", "autoip_8h.html#a1b4f0c53da17395d9de92a85708a1bb9", null ],
-    [ "autoip_tmr", "autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d", null ]
+    [ "autoip_supplied_address", "autoip_8h.html#a6de97b7dcd98f9039d5c1ad11c257d62", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/bridgeif_8c.html b/doc/doxygen/output/html/bridgeif_8c.html
index 21da620..25f760b 100644
--- a/doc/doxygen/output/html/bridgeif_8c.html
+++ b/doc/doxygen/output/html/bridgeif_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/bridgeif_8h.html b/doc/doxygen/output/html/bridgeif_8h.html
index 6349350..f86dbe9 100644
--- a/doc/doxygen/output/html/bridgeif_8h.html
+++ b/doc/doxygen/output/html/bridgeif_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/bridgeif__fdb_8c.html b/doc/doxygen/output/html/bridgeif__fdb_8c.html
index 3202711..4d9aab5 100644
--- a/doc/doxygen/output/html/bridgeif__fdb_8c.html
+++ b/doc/doxygen/output/html/bridgeif__fdb_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/bridgeif__opts_8h.html b/doc/doxygen/output/html/bridgeif__opts_8h.html
index d741339..360d213 100644
--- a/doc/doxygen/output/html/bridgeif__opts_8h.html
+++ b/doc/doxygen/output/html/bridgeif__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/bugs.html b/doc/doxygen/output/html/bugs.html
index a9b3eff..fb3b401 100644
--- a/doc/doxygen/output/html/bugs.html
+++ b/doc/doxygen/output/html/bugs.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,8 +101,8 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><p>Please report bugs in the lwIP bug tracker at savannah.<br  />
-BEFORE submitting, please check if the bug has already been reported!<br  />
-<a href="https://savannah.nongnu.org/bugs/?group=lwip">https://savannah.nongnu.org/bugs/?group=lwip</a> </p>
+ BEFORE submitting, please check if the bug has already been reported!<br  />
+ <a href="https://savannah.nongnu.org/bugs/?group=lwip">https://savannah.nongnu.org/bugs/?group=lwip</a> </p>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/changelog.html b/doc/doxygen/output/html/changelog.html
index 698eb41..61d1c15 100644
--- a/doc/doxygen/output/html/changelog.html
+++ b/doc/doxygen/output/html/changelog.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -118,6 +118,93 @@
 
   * [Enter new changes just after this line - do not remove this line]
 
+(STABLE-2.2.0):
+
+  2018-10-02: Dirk Ziegelmeier
+  * Integrate contrib repository into main lwIP repository
+
+  ++ New features:
+
+  2022-04-05: David Cermak
+  * contrib/addons: Add example of using DHCP extra options hooks
+
+  2023-05-11: David Cermak
+  * dhcp: Add macro for appending extra client's request options
+
+  2023-05-11: xueyunfei
+  * dhcp: Enable custom config for timeouts, thresholds, backoff time
+
+  2021-04-26
+  * test/unit: added more unit tests
+
+  2020-03-27: Simon Goldschmidt
+  * test/fuzz: improve fuzz test
+
+  2019-12-11: Simon Goldschmidt
+  * ip6addr_aton: support scoped address strings (via '%')
+
+  2019-08-28: Joan Lledó
+  * Contrib: Add kFreeBSD to the Unix port
+
+  2019-07-14: Joan Lledó
+  * Unix port: improve support for the Hurd
+
+  ++ Bugfixes:
+
+  2019-12-11: David Girault
+  * altcp_tls: support for saving/restoring session information
+
+  2018-11-16: Craig McQUeen
+  * dns: allow a DNS look-up with a trailing dot in the name
+
+  2018-10-19: Timmy Brolin
+  * Add outgoing VLAN PCP support for Ethernet level QoS
+
+  2018-10-08: Ben Wijen
+  * apps/tftp: added TFTP client
+
+  2018-10-04: Jasper Verschueren
+  * Implement IPv4 ACD (Address Conflict Detection)
+
+  2023-05-10
+  * altcp_tls_mbedtls: note which version of mbedtls we are compatible to
+  * altcp_tls_mbedtls: multiple compatibility fixes
+
+  2023-04-26: Jan Breuer, Harrold Spier, Ognjen Bjelica, Dirk Ziegelmeier, Simon Goldschmidt
+  * apps/snmp: multiple fixes and improvements to snmp
+
+  2022-01-12: Simon Goldschmidt
+  * httpd: clean up custom file handling
+
+  2021-11-25: quanjia
+  * ping: fix sockaddr len in ping_send() for PING_USE_SOCKETS==1
+
+  2021-11-12: Bas Prins
+  * http_client: reset timeout when receiving data
+
+  2020-07-07: Erik Ekman
+  * Rename IP and Ethernet equality checkers from _cmp to _eq
+
+  2020-03-05: Simon Goldschmidt
+  * tcp: tighten up checks for received SYN
+
+  2020-01-30: Simon Goldschmidt, David Girault, David J. Fiddes, Tom Ferrin
+  * apps/sntp: multiple fixes and improvements for sntp
+
+  2020-01-30: Simon Goldschmidt
+  * ip_forward: fix IPv4 forwarding with multiple netifs/offloading
+
+  2019-06-11: David Girault, Giuseppe Modugno
+  * apps/mqtt: multiple fixes for mqtt
+
+  2019-05-19: Joan Lledó
+  * New function tcpip_callback_wait()
+    Call a function inside the tcpip thread and block the calling thread until
+    the callback finishes
+
+  2018-08-15: Jasper Verschueren, David Girault, Our Air Quality
+  * apps/mdns: greatly improved the mdns client
+
 (STABLE-2.1.2):
 
   ++ Bugfixes:
@@ -289,7 +376,7 @@
 
   2017-01-20: Joel Cunningham
   * sockets: add interface name/index APIs (task #14314)
-  
+
   2017-01-08: David van Moolenbroek
   * Extensions to RAW API (patch #9208)
     - Connected RAW PCBs
@@ -378,7 +465,7 @@
 
   2017-08-02: Abroz Bizjak/Simon Goldschmidt
   * multiple fixes in IPv4 reassembly (leading to corrupted datagrams received)
-  
+
   2017-03-30: Simon Goldschmidt
   * dhcp.c: return ERR_VAL instead of asserting on offset-out-of-pbuf
 
@@ -523,7 +610,7 @@
 
   2016-11-14: Joel Cunningham
   * tcp_out.c: fixed bug #49533 (start persist timer when unsent seg can't fit
-    in window) 
+    in window)
 
   2016-11-16: Roberto Barbieri Carrera
   * autoip.c: fixed bug #49610 (sometimes AutoIP fails to reuse the same address)
@@ -798,7 +885,7 @@
       implementation which is under a BSD-ish license.
     - Also switched to PolarSSL MD4,MD5,SHA1 implementations, which are meant to be
       used in embedded devices with reduced memory footprint.
-    - Removed PPP configuration file parsing support. 
+    - Removed PPP configuration file parsing support.
     - Added macro definition EAP_SUPPORT to make EAP support optional.
     - Added macro definition CHAP_SUPPORT to make CHAP support optional.
     - Added macro definition MSCHAP_SUPPORT to make MSCHAP support optional.
@@ -1330,7 +1417,7 @@
   2012-03-25: Simon Goldschmidt (idea by Mason)
   * posix/*: added posix-compatibility include files posix/netdb.h and posix/sys/socket.h
     which are a simple wrapper to the correct lwIP include files.
- 
+
   2012-01-16: Simon Goldschmidt
   * opt.h, icmp.c: Added option CHECKSUM_GEN_ICMP
 
@@ -1412,10 +1499,10 @@
 
   2012-03-22: Simon Goldschmidt
   * ip4.c: fixed bug #35927: missing refragmentaion in ip_forward
- 
+
   2012-03-20: Simon Goldschmidt (patch by Mason)
   * netdb.c: fixed bug #35907: lwip_gethostbyname_r returns an invalid h_addr_list
- 
+
   2012-03-12: Simon Goldschmidt (patch by Bostjan Meglic)
   * ppp.c: fixed bug #35809: PPP GetMask(): Compiler warning on big endian,
     possible bug on little endian system
@@ -1870,7 +1957,7 @@
   2011-03-27: Simon Goldschmidt
   * sockets.c: Fixed bug #32906: lwip_connect+lwip_send did not work for udp and
     raw pcbs with LWIP_TCPIP_CORE_LOCKING==1.
-  
+
   2011-03-27: Simon Goldschmidt
   * tcp_out.c: Fixed bug #32820 (Outgoing TCP connections created before route
     is present never times out) by starting retransmission timer before checking
@@ -1923,7 +2010,7 @@
   2010-11-23: Simon Goldschmidt
   * tcp_in.c: Fixed bug #30577: tcp_input: don't discard ACK-only packets after
     refusing 'refused_data' again.
-  
+
   2010-11-22: Simon Goldschmidt
   * sockets.c: Fixed bug #31590: getsockopt(... SO_ERROR ...) gives EINPROGRESS
     after a successful nonblocking connection.
@@ -1968,21 +2055,21 @@
   2010-08-01: Simon Goldschmidt (patch by Greg Renda)
   * ppp.c: Applied patch #7264 (PPP protocols are rejected incorrectly on big
     endian architectures)
-  
+
   2010-07-28: Simon Goldschmidt
   * api_lib.c, api_msg.c, sockets.c, mib2.c: Fixed compilation with TCP or UDP
     disabled.
-  
+
   2010-07-27: Simon Goldschmidt
   * tcp.c: Fixed bug #30565 (tcp_connect() check bound list): that check did no
     harm but never did anything
-  
+
   2010-07-21: Simon Goldschmidt
   * ip.c: Fixed invalid fix for bug #30402 (CHECKSUM_GEN_IP_INLINE does not
     add IP options)
 
   2010-07-16: Kieran Mansley
-  * msg_in.c: Fixed SNMP ASN constant defines to not use ! operator 
+  * msg_in.c: Fixed SNMP ASN constant defines to not use ! operator
 
   2010-07-10: Simon Goldschmidt
   * ip.c: Fixed bug #30402: CHECKSUM_GEN_IP_INLINE does not add IP options
@@ -2086,7 +2173,7 @@
 
   2010-03-05: Simon Goldschmidt
   * api_msg.c: Correctly set TCP_WRITE_FLAG_MORE when netconn_write is split
-    into multiple calls to tcp_write.    
+    into multiple calls to tcp_write.
 
   2010-02-21: Simon Goldschmidt
   * opt.h, mem.h, dns.c: task #10140: Remove DNS_USES_STATIC_BUF (keep
@@ -2546,7 +2633,7 @@
     sent to mbox
 
   2009-06-25 Kieran Mansley
-  * api_msg.c api.h: BUG26722: initialise netconn write variables 
+  * api_msg.c api.h: BUG26722: initialise netconn write variables
     in netconn_alloc
 
   2009-06-25 Kieran Mansley
@@ -2554,7 +2641,7 @@
 
   2009-06-25 Kieran Mansley
   * tcp.c, tcp_in.c, tcp_out.c, tcp.h: BUG26301 and BUG26267: correct
-    simultaneous close behaviour, and make snd_nxt have the same meaning 
+    simultaneous close behaviour, and make snd_nxt have the same meaning
     as in the RFCs.
 
   2009-05-12 Simon Goldschmidt
@@ -2690,7 +2777,7 @@
   * tcp.c, tcp_in.c, tcp.h: add tcp_abandon() to cope with dropping
     connections where no reset required (bug #25622)
 
-  * tcp_out.c: set TCP_ACK flag on keepalive and zero window probes 
+  * tcp_out.c: set TCP_ACK flag on keepalive and zero window probes
     (bug #20779)
 
   2009-02-18 Simon Goldschmidt (Jonathan Larmour and Bill Auerbach)
@@ -2726,7 +2813,7 @@
     out of pool pbufs.
 
   2008-12-19 Simon Goldschmidt
-  * many files: patch #6699: fixed some warnings on platform where sizeof(int) == 2 
+  * many files: patch #6699: fixed some warnings on platform where sizeof(int) == 2
 
   2008-12-10 Tamas Somogyi, Frédéric Bernon
   * sockets.c: fixed bug #25051: lwip_recvfrom problem with udp: fromaddr and
@@ -2811,7 +2898,7 @@
     made from lwipopts.h. Fix comment on how to override LWIP_CHKSUM.
 
   2008-01-22 Frédéric Bernon
-  * tcp.c, tcp_in.c, tcp.h, opt.h: Rename LWIP_CALCULATE_EFF_SEND_MSS in 
+  * tcp.c, tcp_in.c, tcp.h, opt.h: Rename LWIP_CALCULATE_EFF_SEND_MSS in
     TCP_CALCULATE_EFF_SEND_MSS to have coherent TCP options names.
 
   2008-01-14 Frédéric Bernon
@@ -2821,7 +2908,7 @@
 
   2008-01-14 Frédéric Bernon, Marc Chaland
   * ip.c: Integrate patch #6369" ip_input : checking before realloc".
-  
+
   2008-01-12 Frédéric Bernon
   * tcpip.h, tcpip.c, api.h, api_lib.c, api_msg.c, sockets.c: replace the field
     netconn::sem per netconn::op_completed like suggested for the task #7490
@@ -2847,8 +2934,8 @@
     Introduce changes for task #7490 "Add return value to sys_mbox_post" with some
     modifications in the sys_mbox api: sys_mbox_new take a "size" parameters which
     indicate the number of pointers query by the mailbox. There is three defines
-    in opt.h to indicate sizes for tcpip::mbox, netconn::recvmbox, and for the 
-    netconn::acceptmbox. Port maintainers, you can decide to just add this new 
+    in opt.h to indicate sizes for tcpip::mbox, netconn::recvmbox, and for the
+    netconn::acceptmbox. Port maintainers, you can decide to just add this new
     parameter in your implementation, but to ignore it to keep the previous behavior.
     The new sys_mbox_trypost function return a value to know if the mailbox is
     full or if the message is posted. Take a look to sys_arch.txt for more details.
@@ -2972,7 +3059,7 @@
     Note that previous "copy" parameter for "write" APIs is now called "apiflags".
 
   2007-10-24 Frédéric Bernon
-  * api.h, api_lib.c, api_msg.c: Add macro API_EVENT in the same spirit than 
+  * api.h, api_lib.c, api_msg.c: Add macro API_EVENT in the same spirit than
     TCP_EVENT_xxx macros to get a code more readable. It could also help to remove
     some code (like we have talk in "patch #5919 : Create compile switch to remove
     select code"), but it could be done later.
@@ -2992,7 +3079,7 @@
     all netifs (or ports) can use it.
 
   2007-10-05 Frédéric Bernon
-  * netifapi.h, netifapi.c: add function netifapi_netif_set_default. Change the 
+  * netifapi.h, netifapi.c: add function netifapi_netif_set_default. Change the
     common function to reduce a little bit the footprint (for all functions using
     only the "netif" parameter).
 
@@ -3016,7 +3103,7 @@
     or snmp_add_sysuptime(), and to define the SNMP_GET_SYSUPTIME(sysuptime) macro.
     This one is undefined by default in mib2.c. SNMP_GET_SYSUPTIME is called inside
     snmp_get_sysuptime(u32_t *value), and enable to change "sysuptime" value only
-    when it's queried (any direct call to "sysuptime" is changed by a call to 
+    when it's queried (any direct call to "sysuptime" is changed by a call to
     snmp_get_sysuptime).
 
   2007-09-09 Frédéric Bernon, Bill Florac
@@ -3097,7 +3184,7 @@
   2007-08-26 Marc Boucher
   * api_msg.c: do_close_internal(): Reset the callbacks and arg (conn) to NULL
     since they can under certain circumstances be called with an invalid conn
-    pointer after the connection has been closed (and conn has been freed). 
+    pointer after the connection has been closed (and conn has been freed).
 
   2007-08-25 Frédéric Bernon (Artem Migaev's Patch)
   * netif.h, netif.c: Integrate "patch #6163 : Function to check if link layer is up".
@@ -3109,11 +3196,11 @@
 
   2007-08-22 Frédéric Bernon
   * tcpip.h, tcpip.c, ethernetif.c, opt.h: remove options ETHARP_TCPIP_INPUT &amp;
-    ETHARP_TCPIP_ETHINPUT, now, only "ethinput" code is supported, even if the 
+    ETHARP_TCPIP_ETHINPUT, now, only "ethinput" code is supported, even if the
     name is tcpip_input (we keep the name of 1.2.0 function).
 
   2007-08-17 Jared Grubb
-  * memp_std.h, memp.h, memp.c, mem.c, stats.c: (Task #7136) Centralize mempool 
+  * memp_std.h, memp.h, memp.c, mem.c, stats.c: (Task #7136) Centralize mempool
     settings into new memp_std.h and optional user file lwippools.h. This adds
     more dynamic mempools, and allows the user to create an arbitrary number of
     mempools for mem_malloc.
@@ -3320,32 +3407,32 @@
     snmp_set_sysname.
 
   2007-03-28 Frédéric Bernon
-  * netif.h, netif.c: A new NETIF_FLAG_ETHARP flag is defined in netif.h, to allow to 
+  * netif.h, netif.c: A new NETIF_FLAG_ETHARP flag is defined in netif.h, to allow to
     initialize a network interface's flag with. It tell this interface is an ethernet
     device, and we can use ARP with it to do a "gratuitous ARP" (RFC 3220 "IP Mobility
     Support for IPv4" section 4.6) when interface is "up" with netif_set_up().
 
   2007-03-26 Frédéric Bernon, Jonathan Larmour
   * opt.h, tcpip.c: New configuration option LWIP_ARP allow to disable ARP init at build
-    time if you only use PPP or SLIP. The default is enable. Note we don't have to call 
+    time if you only use PPP or SLIP. The default is enable. Note we don't have to call
     etharp_init in your port's initilization sequence if you use tcpip.c, because this call
     is done in tcpip_init function.
 
   2007-03-22 Frédéric Bernon
   * stats.h, stats.c, msg_in.c: Stats counters can be change to u32_t if necessary with the
     new option LWIP_STATS_LARGE. If you need this option, define LWIP_STATS_LARGE to 1 in
-    your lwipopts.h. More, unused counters are not defined in the stats structs, and not 
+    your lwipopts.h. More, unused counters are not defined in the stats structs, and not
     display by stats_display(). Note that some options (SYS_STATS and RAW_STATS) are defined
     but never used. Fix msg_in.c with the correct #if test for a stat display.
 
   2007-03-21 Kieran Mansley
-  * netif.c, netif.h: Apply patch#4197 with some changes (originator: rireland@hmgsl.com). 
+  * netif.c, netif.h: Apply patch#4197 with some changes (originator: rireland@hmgsl.com).
     Provides callback on netif up/down state change.
 
   2007-03-11 Frédéric Bernon, Mace Gael, Steve Reynolds
   * sockets.h, sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c, igmp.h, igmp.c,
     ip.c, netif.h, tcpip.c, opt.h:
-    New configuration option LWIP_IGMP to enable IGMP processing. Based on only one 
+    New configuration option LWIP_IGMP to enable IGMP processing. Based on only one
     filter per all network interfaces. Declare a new function in netif to enable to
     control the MAC filter (to reduce lwIP traffic processing).
 
@@ -3368,7 +3455,7 @@
   * snmp_msg.h, msg_in.c: SNMP UDP ports can be configured at compile time.
 
   2007-03-06 Frédéric Bernon
-  * api.h, api_lib.c, sockets.h, sockets.c, tcpip.c, sys.h, sys.c, err.h: 
+  * api.h, api_lib.c, sockets.h, sockets.c, tcpip.c, sys.h, sys.c, err.h:
     Implement SO_RCVTIMEO on UDP sockets/netconn.
 
   2007-02-28 Kieran Mansley (based on patch from Simon Goldschmidt)
@@ -3410,7 +3497,7 @@
   and/or warnings on some systems where mem_size_t and size_t differ.
   * pbuf.c, ppp.c: Fix warnings on some systems with mem_malloc.
 
-  2008-03-04 Kieran Mansley (contributions by others) 
+  2008-03-04 Kieran Mansley (contributions by others)
   * Numerous small compiler error/warning fixes from contributions to
     mailing list after 1.3.0 release candidate made.
 
@@ -3527,7 +3614,7 @@
     type change. Any compiler should cause an error without any changes in
     yours netconn_peer calls (so, it can't be a "silent change"). It also
     reduce a little bit the footprint for socket layer (lwip_getpeername &amp;
-    lwip_getsockname use now a common lwip_getaddrname function since 
+    lwip_getsockname use now a common lwip_getaddrname function since
     netconn_peer &amp; netconn_addr have the same parameters).
 
   2007-09-20 Simon Goldschmidt
@@ -3547,13 +3634,13 @@
     if they are not defined in cc.h, in the same spirit than "lwip/opt.h" for lwipopts.h.
 
   2007-08-30 Frédéric Bernon
-  * igmp.h, igmp.c: Some changes to remove some redundant code, add some traces, 
+  * igmp.h, igmp.c: Some changes to remove some redundant code, add some traces,
     and fix some coding style.
 
   2007-08-28 Frédéric Bernon
   * tcpip.c: Fix TCPIP_MSG_INPKT processing: now, tcpip_input can be used for any
-    kind of packets. These packets are considered like Ethernet packets (payload 
-    pointing to ethhdr) if the netif got the NETIF_FLAG_ETHARP flag. Else, packets 
+    kind of packets. These packets are considered like Ethernet packets (payload
+    pointing to ethhdr) if the netif got the NETIF_FLAG_ETHARP flag. Else, packets
     are considered like IP packets (payload pointing to iphdr).
 
   2007-08-27 Frédéric Bernon
@@ -3651,7 +3738,7 @@
   2007-06-28 Frédéric Bernon
   * netifapi.h, netifapi.c, tcpip.h, tcpip.c: Update code to handle the option
     LWIP_TCPIP_CORE_LOCKING, and do some changes to be coherent with last modifications
-    in api_lib/api_msg (use pointers and not type with table, etc...) 
+    in api_lib/api_msg (use pointers and not type with table, etc...)
 
   2007-06-26 Simon Goldschmidt
   * udp.h: Fixed bug #20259: struct udp_hdr was lacking the packin defines.
@@ -3753,7 +3840,7 @@
 
   2007-05-16 Frédéric Bernon
   * tcpip.c, igmp.h, igmp.c: Fixed bug "#19800 : IGMP: igmp_tick() will not work
-    with NO_SYS=1". Note that igmp_init is always in tcpip_thread (and not in 
+    with NO_SYS=1". Note that igmp_init is always in tcpip_thread (and not in
     tcpip_init) because we have to be sure that network interfaces are already
     added (mac filter is updated only in igmp_init for the moment).
 
@@ -3900,7 +3987,7 @@
 
   2007-03-20 Frédéric Bernon
   * tcpip.c: Initialize tcpip's mbox, and verify if initialized in tcpip_input,
-    tcpip_ethinput, tcpip_callback, tcpip_apimsg, to fix a init problem with 
+    tcpip_ethinput, tcpip_callback, tcpip_apimsg, to fix a init problem with
     network interfaces. Also fix a compiler warning.
 
   2007-03-20 Kieran Mansley
@@ -3992,13 +4079,13 @@
   * rawapi.txt: Fix documentation mismatch with etharp.h about etharp_tmr's call
     interval.
 
-  2007-02-28 Kieran Mansley 
+  2007-02-28 Kieran Mansley
   * pbuf.c: Fix BUG#17645 - ensure pbuf payload pointer is not moved
     outside the region of the pbuf by pbuf_header()
 
-  2007-02-28 Kieran Mansley 
+  2007-02-28 Kieran Mansley
   * sockets.c: Fix BUG#19161 - ensure milliseconds timeout is non-zero
-    when supplied timeout is also non-zero 
+    when supplied timeout is also non-zero
 
 (STABLE-1.2.0)
 
@@ -4082,7 +4169,7 @@
     in accept() by Kevin Lawson.
 
   2006-05-26 Christiaan Simons
-  * api_lib.c: Removed conn-&gt;sem creation and destruction 
+  * api_lib.c: Removed conn-&gt;sem creation and destruction
     from netconn_write() and added sys_sem_new to netconn_new_*.
 
 (STABLE-1_1_1)
@@ -4152,7 +4239,7 @@
   * dhcp.c: Decline messages were not multicast but unicast.
   * etharp.c: ETHARP_CREATE is renamed to ETHARP_TRY_HARD.
     Do not try hard to insert arbitrary packet's source address,
-    etharp_ip_input() now calls etharp_update() without ETHARP_TRY_HARD. 
+    etharp_ip_input() now calls etharp_update() without ETHARP_TRY_HARD.
     etharp_query() now always DOES call ETHARP_TRY_HARD so that users
     querying an address will see it appear in the cache (DHCP could
     suffer from this when a server invalidly gave an in-use address.)
diff --git a/doc/doxygen/output/html/classes.html b/doc/doxygen/output/html/classes.html
index 23066b8..3ffc7d9 100644
--- a/doc/doxygen/output/html/classes.html
+++ b/doc/doxygen/output/html/classes.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -104,7 +104,7 @@
 <div class="classindex">
 <dl class="classindex even">
 <dt class="alphachar"><a id="letter_A" name="letter_A">A</a></dt>
-<dd><a class="el" href="structapi__msg.html">api_msg</a></dd><dd><a class="el" href="structautoip.html">autoip</a></dd></dl>
+<dd><a class="el" href="structacd.html">acd</a></dd><dd><a class="el" href="structaltcp__allocator__s.html">altcp_allocator_s</a></dd><dd><a class="el" href="structapi__msg.html">api_msg</a></dd><dd><a class="el" href="structautoip.html">autoip</a></dd></dl>
 <dl class="classindex odd">
 <dt class="alphachar"><a id="letter_B" name="letter_B">B</a></dt>
 <dd><a class="el" href="structbridgeif__initdata__s.html">bridgeif_initdata_s</a></dd></dl>
@@ -119,13 +119,13 @@
 <dd><a class="el" href="structgethostbyname__r__helper.html">gethostbyname_r_helper</a></dd></dl>
 <dl class="classindex odd">
 <dt class="alphachar"><a id="letter_I" name="letter_I">I</a></dt>
-<dd><a class="el" href="structicmp6__echo__hdr.html">icmp6_echo_hdr</a></dd><dd><a class="el" href="structicmp6__hdr.html">icmp6_hdr</a></dd><dd><a class="el" href="structicmp__echo__hdr.html">icmp_echo_hdr</a></dd><dd><a class="el" href="structieee__802154__hdr.html">ieee_802154_hdr</a></dd><dd><a class="el" href="structigmp__group.html">igmp_group</a></dd><dd><a class="el" href="structigmp__msg.html">igmp_msg</a></dd><dd><a class="el" href="structip4__addr.html">ip4_addr</a></dd><dd><a class="el" href="structip4__addr__packed.html">ip4_addr_packed</a></dd><dd><a class="el" href="structip4__addr__wordaligned.html">ip4_addr_wordaligned</a></dd><dd><a class="el" href="structip6__addr.html">ip6_addr</a></dd><dd><a class="el" href="structip6__addr__packed.html">ip6_addr_packed</a></dd><dd><a class="el" href="structip6__hdr.html">ip6_hdr</a></dd><dd><a class="el" href="structip6__reass__helper.html">ip6_reass_helper</a></dd><dd><a class="el" href="structip6__reassdata.html">ip6_reassdata</a></dd><dd><a class="el" href="structip__addr.html">ip_addr</a></dd><dd><a class="el" href="structip__globals.html">ip_globals</a></dd><dd><a class="el" href="structip__reass__helper.html">ip_reass_helper</a></dd><dd><a class="el" href="structip__reassdata.html">ip_reassdata</a></dd><dd><a class="el" href="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html">netif_ext_callback_args_t::ipv4_changed_s</a></dd><dd><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html">netif_ext_callback_args_t::ipv6_addr_state_changed_s</a></dd><dd><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html">netif_ext_callback_args_t::ipv6_set_s</a></dd></dl>
+<dd><a class="el" href="structicmp6__echo__hdr.html">icmp6_echo_hdr</a></dd><dd><a class="el" href="structicmp6__hdr.html">icmp6_hdr</a></dd><dd><a class="el" href="structicmp__echo__hdr.html">icmp_echo_hdr</a></dd><dd><a class="el" href="structicmp__hdr.html">icmp_hdr</a></dd><dd><a class="el" href="structieee__802154__hdr.html">ieee_802154_hdr</a></dd><dd><a class="el" href="structigmp__group.html">igmp_group</a></dd><dd><a class="el" href="structigmp__msg.html">igmp_msg</a></dd><dd><a class="el" href="structip4__addr.html">ip4_addr</a></dd><dd><a class="el" href="structip4__addr__packed.html">ip4_addr_packed</a></dd><dd><a class="el" href="structip4__addr__wordaligned.html">ip4_addr_wordaligned</a></dd><dd><a class="el" href="structip6__addr.html">ip6_addr</a></dd><dd><a class="el" href="structip6__addr__packed.html">ip6_addr_packed</a></dd><dd><a class="el" href="structip6__hdr.html">ip6_hdr</a></dd><dd><a class="el" href="structip6__reass__helper.html">ip6_reass_helper</a></dd><dd><a class="el" href="structip6__reassdata.html">ip6_reassdata</a></dd><dd><a class="el" href="structip__addr.html">ip_addr</a></dd><dd><a class="el" href="structip__globals.html">ip_globals</a></dd><dd><a class="el" href="structip__reass__helper.html">ip_reass_helper</a></dd><dd><a class="el" href="structip__reassdata.html">ip_reassdata</a></dd><dd><a class="el" href="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html">netif_ext_callback_args_t::ipv4_changed_s</a></dd><dd><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html">netif_ext_callback_args_t::ipv6_addr_state_changed_s</a></dd><dd><a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html">netif_ext_callback_args_t::ipv6_set_s</a></dd></dl>
 <dl class="classindex even">
 <dt class="alphachar"><a id="letter_L" name="letter_L">L</a></dt>
 <dd><a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html">netif_ext_callback_args_t::link_changed_s</a></dd><dd><a class="el" href="structlowpan6__ieee802154__data.html">lowpan6_ieee802154_data</a></dd><dd><a class="el" href="structlowpan6__link__addr.html">lowpan6_link_addr</a></dd><dd><a class="el" href="structlowpan6__reass__helper.html">lowpan6_reass_helper</a></dd><dd><a class="el" href="structlwip__cyclic__timer.html">lwip_cyclic_timer</a></dd><dd><a class="el" href="structlwip__select__cb.html">lwip_select_cb</a></dd><dd><a class="el" href="structlwip__sock.html">lwip_sock</a></dd></dl>
 <dl class="classindex odd">
 <dt class="alphachar"><a id="letter_M" name="letter_M">M</a></dt>
-<dd><a class="el" href="structmdns__host.html">mdns_host</a></dd><dd><a class="el" href="structmdns__outpacket.html">mdns_outpacket</a></dd><dd><a class="el" href="structmdns__packet.html">mdns_packet</a></dd><dd><a class="el" href="structmdns__rr__info.html">mdns_rr_info</a></dd><dd><a class="el" href="structmdns__service.html">mdns_service</a></dd><dd><a class="el" href="structmem.html">mem</a></dd><dd><a class="el" href="structmemp__desc.html">memp_desc</a></dd><dd><a class="el" href="structmld__group.html">mld_group</a></dd><dd><a class="el" href="structmld__header.html">mld_header</a></dd><dd><a class="el" href="structmqtt__client__s.html">mqtt_client_s</a></dd><dd><a class="el" href="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</a></dd><dd><a class="el" href="structmqtt__request__t.html">mqtt_request_t</a></dd><dd><a class="el" href="structmqtt__ringbuf__t.html">mqtt_ringbuf_t</a></dd></dl>
+<dd><a class="el" href="structmdns__delayed__msg.html">mdns_delayed_msg</a></dd><dd><a class="el" href="structmdns__host.html">mdns_host</a></dd><dd><a class="el" href="structmdns__outmsg.html">mdns_outmsg</a></dd><dd><a class="el" href="structmdns__outpacket.html">mdns_outpacket</a></dd><dd><a class="el" href="structmdns__packet.html">mdns_packet</a></dd><dd><a class="el" href="structmdns__request.html">mdns_request</a></dd><dd><a class="el" href="structmdns__rr__info.html">mdns_rr_info</a></dd><dd><a class="el" href="structmdns__service.html">mdns_service</a></dd><dd><a class="el" href="structmem.html">mem</a></dd><dd><a class="el" href="structmemp__desc.html">memp_desc</a></dd><dd><a class="el" href="structmld__group.html">mld_group</a></dd><dd><a class="el" href="structmld__header.html">mld_header</a></dd><dd><a class="el" href="structmqtt__client__s.html">mqtt_client_s</a></dd><dd><a class="el" href="structmqtt__connect__client__info__t.html">mqtt_connect_client_info_t</a></dd><dd><a class="el" href="structmqtt__request__t.html">mqtt_request_t</a></dd><dd><a class="el" href="structmqtt__ringbuf__t.html">mqtt_ringbuf_t</a></dd></dl>
 <dl class="classindex even">
 <dt class="alphachar"><a id="letter_N" name="letter_N">N</a></dt>
 <dd><a class="el" href="structna__header.html">na_header</a></dd><dd><a class="el" href="structnd6__neighbor__cache__entry.html">nd6_neighbor_cache_entry</a></dd><dd><a class="el" href="structnd6__q__entry.html">nd6_q_entry</a></dd><dd><a class="el" href="structnetbios__answer.html">netbios_answer</a></dd><dd><a class="el" href="structnetbios__hdr.html">netbios_hdr</a></dd><dd><a class="el" href="structnetbios__name__hdr.html">netbios_name_hdr</a></dd><dd><a class="el" href="structnetbios__question__hdr.html">netbios_question_hdr</a></dd><dd><a class="el" href="structnetbios__resp.html">netbios_resp</a></dd><dd><a class="el" href="structnetbuf.html">netbuf</a></dd><dd><a class="el" href="structnetconn.html">netconn</a></dd><dd><a class="el" href="structnetif.html">netif</a></dd><dd><a class="el" href="unionnetif__ext__callback__args__t.html">netif_ext_callback_args_t</a></dd><dd><a class="el" href="structnetvector.html">netvector</a></dd><dd><a class="el" href="structns__header.html">ns_header</a></dd></dl>
diff --git a/doc/doxygen/output/html/cmake.html b/doc/doxygen/output/html/cmake.html
new file mode 100644
index 0000000..4c3d893
--- /dev/null
+++ b/doc/doxygen/output/html/cmake.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: CMake build system</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('cmake.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div><div class="header">
+  <div class="headertitle"><div class="title">CMake build system</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><pre class="fragment">Building lwIP
+=============
+
+lwIP uses a CMake based build system.
+
+The CMake files in this project are designed to
+be included into your own CMake files. They are
+mainly variable definitions containing a list of
+source files and predefined static libraries to
+be linked against application code.
+
+1) lwIP sources:
+   src/Filelists.cmake provides file lists containing
+   the lwIP core library.
+   The file also contains two static libraries, lwipcore
+   and lwipallapps, where you can link your app against.
+   This is the file that is useful to all lwIP users.
+
+2) Example applications:
+   contrib/Filelists.cmake provides several file lists
+   containing the example applications.
+   The file also contains several static libraries
+   for these example apps.
+   This file is only useful for you, if you can use one
+   of the examples in your application, which is normally
+   not the case.
+
+3) OS/platform port:
+   Usually the OS port needs to be provided by the user.
+   If a port to Linux, Windows or MacOS is useful for
+   you, you can use
+   contrib/ports/{win32, unix}/Filelists.cmake
+   that contains file lists and libraries for
+   these operating systems.
+
+VARIABLES
+=========
+In all cases, you need to provide two variables.
+
+"LWIP_DIR" pointing to the lwIP directory
+Example:
+set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/externals/lwip)
+
+"LWIP_INCLUDE_DIRS" that contains the include base paths
+- for lwIP itself (${LWIP_DIR}/src/include)
+- for lwIP contrib if you use it (${LWIP_DIR}/contrib)
+- to a directory containing an OS port
+- to a directory containing lwipopts.h
+
+Example:
+set (LWIP_INCLUDE_DIRS
+    "${LWIP_DIR}/src/include"
+    "${LWIP_DIR}/contrib"
+    "${LWIP_DIR}/contrib/ports/unix/port/include"
+    "${LWIP_DIR}/contrib/examples/example_app"
+)
+
+Putting it all together
+=======================
+To get a working application, your CMake system
+needs to provide the variables described above, e.g.
+set (LWIP_DIR &lt;path to lwip sources&gt;)
+set (LWIP_INCLUDE_DIRS
+    "${LWIP_DIR}/src/include"
+    "${LWIP_DIR}/contrib"
+    "&lt;path to my port&gt;/include"
+    "&lt;path to lwipopts.h&gt;"
+)
+
+You may add some defines:
+set (LWIP_DEFINITIONS LWIP_DEBUG=1)
+
+Then include the filelists you need:
+include(${LWIP_DIR}/src/Filelists.cmake)
+include(${LWIP_DIR}/contrib/Filelists.cmake)
+
+Then, declare you executable:
+add_executable(my_app &lt;my source files&gt; &lt;my lwip port files&gt;)
+
+Add lwIP include dirs to your app:
+target_include_directories(my_app PRIVATE ${LWIP_INCLUDE_DIRS})
+
+Link your app against the lwIP libs from the filelists you need:
+target_link_libraries(my_app lwipcontribapps lwipallapps lwipcore)
+
+Working example
+===============
+Working build examples can be found in the
+contrib/ports/{win32, unix}/example_app
+subdirectory.
+To use them, create a build directory and call cmake with
+the lwIP root dir:
+
+- mkdir build
+- cd build
+- cmake ..
+- cmake --build .
+
+The CMakeLists.txt will autoselect the correct port
+for your system (supported: Linux, Windows, Darwin).
+
+To configure the example app to your needs, you need to copy the file
+    contrib/examples/example_app/lwipcfg.h.example
+to
+    contrib/examples/example_app/lwipcfg.h
+and edit to your needs.
+
+Makefile based build system
+===========================
+lwIP also maintains file lists for Makefile-based
+build systems. Look for Filelists.mk files
+in the source tree. We try to maintain them,
+but lwIP's mainly focused build system is CMake.
+
+MS Visual Studio
+================
+lwIP also provides basic support for MSVS in the win32 port
+folder under 'msvc'. We try to maintain these files,
+but lwIP's mainly focused build system is CMake.
+</pre> </div></div><!-- contents -->
+</div><!-- PageDoc -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/compat_2posix_2arpa_2inet_8h.html b/doc/doxygen/output/html/compat_2posix_2arpa_2inet_8h.html
index 0dacc6a..2e6ea72 100644
--- a/doc/doxygen/output/html/compat_2posix_2arpa_2inet_8h.html
+++ b/doc/doxygen/output/html/compat_2posix_2arpa_2inet_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/compat_2posix_2netdb_8h.html b/doc/doxygen/output/html/compat_2posix_2netdb_8h.html
index 0c54d91..af7e77f 100644
--- a/doc/doxygen/output/html/compat_2posix_2netdb_8h.html
+++ b/doc/doxygen/output/html/compat_2posix_2netdb_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/compat_2stdc_2errno_8h.html b/doc/doxygen/output/html/compat_2stdc_2errno_8h.html
index eec9354..0cc92c7 100644
--- a/doc/doxygen/output/html/compat_2stdc_2errno_8h.html
+++ b/doc/doxygen/output/html/compat_2stdc_2errno_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/contrib.html b/doc/doxygen/output/html/contrib.html
index 3347851..b1f27da 100644
--- a/doc/doxygen/output/html/contrib.html
+++ b/doc/doxygen/output/html/contrib.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -157,7 +157,7 @@
 
 1. If you have ported lwIP to a platform (an OS, a uC/processor or a combination of these) and
    you think it could benefit others[1] you might want discuss this on the mailing list. You
-   can also ask for Git access to submit and maintain your port in the contrib Git module.
+   can also ask for Git access to submit and maintain your port in the lwIP/contrib subdir.
 </pre> </div></div><!-- contents -->
 </div><!-- PageDoc -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/debug_8h.html b/doc/doxygen/output/html/debug_8h.html
index ab52708..ceefbd7 100644
--- a/doc/doxygen/output/html/debug_8h.html
+++ b/doc/doxygen/output/html/debug_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/def_8c.html b/doc/doxygen/output/html/def_8c.html
index 43e52fb..b848944 100644
--- a/doc/doxygen/output/html/def_8c.html
+++ b/doc/doxygen/output/html/def_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -114,6 +114,8 @@
 <tr class="separator:a14f94347a5b9b9e3602705b75b7ae524"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaa2ba4b4e2dd7e1c856fedc6a6069813e" id="r_gaa2ba4b4e2dd7e1c856fedc6a6069813e"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e">lwip_strnstr</a> (const char *buffer, const char *token, size_t n)</td></tr>
 <tr class="separator:gaa2ba4b4e2dd7e1c856fedc6a6069813e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac0cd63b4a1a44f5081858199e68f46aa" id="r_gac0cd63b4a1a44f5081858199e68f46aa"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa">lwip_strnistr</a> (const char *buffer, const char *token, size_t n)</td></tr>
+<tr class="separator:gac0cd63b4a1a44f5081858199e68f46aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga263cbafcb697eff964139a9998a6668a" id="r_ga263cbafcb697eff964139a9998a6668a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a">lwip_stricmp</a> (const char *str1, const char *str2)</td></tr>
 <tr class="separator:ga263cbafcb697eff964139a9998a6668a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga997dcc49451121d4ed755b33bc7bd26a" id="r_ga997dcc49451121d4ed755b33bc7bd26a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a">lwip_strnicmp</a> (const char *str1, const char *str2, size_t len)</td></tr>
diff --git a/doc/doxygen/output/html/def_8c.js b/doc/doxygen/output/html/def_8c.js
index bf25b0d..5b755fa 100644
--- a/doc/doxygen/output/html/def_8c.js
+++ b/doc/doxygen/output/html/def_8c.js
@@ -5,5 +5,6 @@
     [ "lwip_itoa", "group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284", null ],
     [ "lwip_stricmp", "group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a", null ],
     [ "lwip_strnicmp", "group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a", null ],
+    [ "lwip_strnistr", "group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa", null ],
     [ "lwip_strnstr", "group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/def_8h.html b/doc/doxygen/output/html/def_8h.html
index 9c1f0e8..9484126 100644
--- a/doc/doxygen/output/html/def_8h.html
+++ b/doc/doxygen/output/html/def_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -125,6 +125,8 @@
 <tr class="separator:ga263cbafcb697eff964139a9998a6668a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaa2ba4b4e2dd7e1c856fedc6a6069813e" id="r_gaa2ba4b4e2dd7e1c856fedc6a6069813e"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e">lwip_strnstr</a> (const char *buffer, const char *token, size_t n)</td></tr>
 <tr class="separator:gaa2ba4b4e2dd7e1c856fedc6a6069813e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac0cd63b4a1a44f5081858199e68f46aa" id="r_gac0cd63b4a1a44f5081858199e68f46aa"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa">lwip_strnistr</a> (const char *buffer, const char *token, size_t n)</td></tr>
+<tr class="separator:gac0cd63b4a1a44f5081858199e68f46aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>various utility macros </p>
diff --git a/doc/doxygen/output/html/def_8h.js b/doc/doxygen/output/html/def_8h.js
index 9b966e1..6430d06 100644
--- a/doc/doxygen/output/html/def_8h.js
+++ b/doc/doxygen/output/html/def_8h.js
@@ -6,5 +6,6 @@
     [ "lwip_itoa", "group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284", null ],
     [ "lwip_stricmp", "group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a", null ],
     [ "lwip_strnicmp", "group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a", null ],
+    [ "lwip_strnistr", "group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa", null ],
     [ "lwip_strnstr", "group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/deprecated.html b/doc/doxygen/output/html/deprecated.html
index 63be240..3a5fd5e 100644
--- a/doc/doxygen/output/html/deprecated.html
+++ b/doc/doxygen/output/html/deprecated.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -105,12 +105,34 @@
 <dd><a class="anchor" id="_deprecated000001"></a>Use <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop()</a> instead.  </dd>
 <dt>Global <a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a>  (struct netif *netif)</dt>
 <dd><a class="anchor" id="_deprecated000002"></a>Use <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop()</a> instead.  </dd>
+<dt>Global <a class="el" href="ip4__addr_8h.html#a59494c562c62fdf62a6c9c6a66a50fb3">ip4_addr_cmp</a>  (addr1, addr2)</dt>
+<dd><a class="anchor" id="_deprecated000004"></a>Renamed to ip4_addr_eq  </dd>
+<dt>Global <a class="el" href="ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514">ip4_addr_netcmp</a>  (addr1, addr2, mask)</dt>
+<dd><a class="anchor" id="_deprecated000003"></a>Renamed to <a class="el" href="ip4__addr_8h.html#a95d05df9201602fc873a97fb61fd1134">ip4_addr_net_eq</a>  </dd>
+<dt>Global <a class="el" href="ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1">ip6_addr_cmp</a>  (addr1, addr2)</dt>
+<dd><a class="anchor" id="_deprecated000008"></a>Renamed to <a class="el" href="ip6__addr_8h.html#a9ea0b6b837baff1e1e62cccd4f17d50e">ip6_addr_eq</a>  </dd>
+<dt>Global <a class="el" href="ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8">ip6_addr_cmp_packed</a>  (ip6addr, paddr, zone_idx)</dt>
+<dd><a class="anchor" id="_deprecated000009"></a>Renamed to <a class="el" href="ip6__addr_8h.html#aa324ac65d537997ebaaed78bd40f6da9">ip6_addr_packed_eq</a>  </dd>
+<dt>Global <a class="el" href="group__ip6__zones.html#gac01d0bad0a682dcc239ba3d5695e0648">ip6_addr_cmp_zone</a>  (addr1, addr2)</dt>
+<dd><a class="anchor" id="_deprecated000010"></a>Renamed to <a class="el" href="group__ip6__zones.html#gabc6d5f833b2abef31aa602dc11ace0a9">ip6_addr_zone_eq</a>  </dd>
+<dt>Global <a class="el" href="ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322">ip6_addr_cmp_zoneless</a>  (addr1, addr2)</dt>
+<dd><a class="anchor" id="_deprecated000007"></a>Renamed to <a class="el" href="ip6__addr_8h.html#a811d8a2aa6417ae22a7a46b27d9ead26">ip6_addr_zoneless_eq</a>  </dd>
+<dt>Global <a class="el" href="ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2">ip6_addr_netcmp</a>  (addr1, addr2)</dt>
+<dd><a class="anchor" id="_deprecated000006"></a>Renamed to <a class="el" href="ip6__addr_8h.html#a9a983c7d613ab45e37aaf66c067a0c7a">ip6_addr_net_eq</a>  </dd>
+<dt>Global <a class="el" href="ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342">ip6_addr_netcmp_zoneless</a>  (addr1, addr2)</dt>
+<dd><a class="anchor" id="_deprecated000005"></a>Renamed to <a class="el" href="ip6__addr_8h.html#afc9d2b8d0a05f2ff23ab3b7fd3bf8229">ip6_addr_net_zoneless_eq</a>  </dd>
+<dt>Global <a class="el" href="group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a">ip_addr_cmp</a>  (addr1, addr2)</dt>
+<dd><a class="anchor" id="_deprecated000012"></a>Renamed to <a class="el" href="group__ipaddr.html#ga5b40158bdffa4b0c81c4ee77066e6b28">ip_addr_eq</a>  </dd>
+<dt>Global <a class="el" href="group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4">ip_addr_cmp_zoneless</a>  (addr1, addr2)</dt>
+<dd><a class="anchor" id="_deprecated000013"></a>Renamed to <a class="el" href="group__ipaddr.html#ga8ac2686417ec2974bb0b3fc6ee0ee1a7">ip_addr_zoneless_eq</a>  </dd>
+<dt>Global <a class="el" href="group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb">ip_addr_netcmp</a>  (addr1, addr2, mask)</dt>
+<dd><a class="anchor" id="_deprecated000011"></a>Renamed to <a class="el" href="group__ipaddr.html#gad1bbbe4c93ea2368663e90814953b929">ip_addr_net_eq</a>  </dd>
 <dt>Global <a class="el" href="group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409">netifapi_dhcp_release</a>  (n)</dt>
-<dd><a class="anchor" id="_deprecated000004"></a>Use <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead.  </dd>
+<dd><a class="anchor" id="_deprecated000015"></a>Use <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead.  </dd>
 <dt>Global <a class="el" href="group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5">netifapi_dhcp_stop</a>  (n)</dt>
-<dd><a class="anchor" id="_deprecated000003"></a>Use <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead.  </dd>
+<dd><a class="anchor" id="_deprecated000014"></a>Use <a class="el" href="group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead.  </dd>
 <dt>Global <a class="el" href="group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df">tcpip_callback_with_block</a>  (function, ctx, block)</dt>
-<dd><a class="anchor" id="_deprecated000005"></a>use <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback()</a> or <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback()</a> instead </dd>
+<dd><a class="anchor" id="_deprecated000016"></a>use <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback()</a> or <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback()</a> instead </dd>
 </dl>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
diff --git a/doc/doxygen/output/html/dhcp6_8c.html b/doc/doxygen/output/html/dhcp6_8c.html
index 5db7f9b..5d78f92 100644
--- a/doc/doxygen/output/html/dhcp6_8c.html
+++ b/doc/doxygen/output/html/dhcp6_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -180,7 +180,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>This function is called from nd6 module when an RA messsage is received It triggers DHCPv6 requests (if enabled). </p>
+<p>This function is called from nd6 module when an RA message is received It triggers DHCPv6 requests (if enabled). </p>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/dhcp6_8h.html b/doc/doxygen/output/html/dhcp6_8h.html
index ac4806a..d7eee46 100644
--- a/doc/doxygen/output/html/dhcp6_8h.html
+++ b/doc/doxygen/output/html/dhcp6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -149,8 +149,8 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a>(<a class="code hl_struct" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL)</div>
-<div class="ttc" id="agroup__netif__cd_html_ga5ce61a277e1951183f7b7d03742c231f"><div class="ttname"><a href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a></div><div class="ttdeci">#define netif_set_client_data(netif, id, data)</div><div class="ttdef"><b>Definition</b> netif.h:233</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="agroup__netif__cd_html_ga5ce61a277e1951183f7b7d03742c231f"><div class="ttname"><a href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a></div><div class="ttdeci">#define netif_set_client_data(netif, id, data)</div><div class="ttdef"><b>Definition</b> netif.h:236</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>Remove a struct dhcp6 previously set to the netif using <a class="el" href="group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">dhcp6_set_struct()</a> </p>
 
 </div>
@@ -194,7 +194,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>This function is called from nd6 module when an RA messsage is received It triggers DHCPv6 requests (if enabled). </p>
+<p>This function is called from nd6 module when an RA message is received It triggers DHCPv6 requests (if enabled). </p>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/dhcp_8c.html b/doc/doxygen/output/html/dhcp_8c.html
index 852b67a..c54310b 100644
--- a/doc/doxygen/output/html/dhcp_8c.html
+++ b/doc/doxygen/output/html/dhcp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,8 +100,7 @@
   <div class="summary">
 <a href="#define-members">Macros</a> &#124;
 <a href="#enum-members">Enumerations</a> &#124;
-<a href="#func-members">Functions</a> &#124;
-<a href="#var-members">Variables</a>  </div>
+<a href="#func-members">Functions</a>  </div>
   <div class="headertitle"><div class="title">dhcp.c File Reference</div></div>
 </div><!--header-->
 <div class="contents">
@@ -114,6 +113,7 @@
 <code>#include &quot;<a class="el" href="def_8h.html">lwip/def.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="dhcp_8h.html">lwip/dhcp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="autoip_8h.html">lwip/autoip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="acd_8h.html">lwip/acd.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="dns_8h.html">lwip/dns.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="prot_2dhcp_8h.html">lwip/prot/dhcp.h</a>&quot;</code><br />
@@ -123,6 +123,10 @@
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
 Macros</h2></td></tr>
+<tr class="memitem:aa29d020558b37b29d5d5ae50dfeb0c88" id="r_aa29d020558b37b29d5d5ae50dfeb0c88"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa29d020558b37b29d5d5ae50dfeb0c88">DHCP_ADD_EXTRA_REQUEST_OPTIONS</a></td></tr>
+<tr class="separator:aa29d020558b37b29d5d5ae50dfeb0c88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33f306da575f8a437996d073b374df82" id="r_a33f306da575f8a437996d073b374df82"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a33f306da575f8a437996d073b374df82">SET_TIMEOUT_FROM_OFFERED</a>(result,  offered,  min,  max)</td></tr>
+<tr class="separator:a33f306da575f8a437996d073b374df82"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad6de9c5120654454a330bf5de53c4835" id="r_ad6de9c5120654454a330bf5de53c4835"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ad6de9c5120654454a330bf5de53c4835">DHCP_CREATE_RAND_XID</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:ad6de9c5120654454a330bf5de53c4835"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a63e9ec4517b80d8576f218d905e31a9b" id="r_a63e9ec4517b80d8576f218d905e31a9b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a63e9ec4517b80d8576f218d905e31a9b">DHCP_MAX_MSG_LEN</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
@@ -149,10 +153,8 @@
 <tr class="separator:ga0c50968d9811aa2aa67fadc0885d744f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gabd7fcc7e0799e313885fc7fd9d4992ad" id="r_gabd7fcc7e0799e313885fc7fd9d4992ad"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:gabd7fcc7e0799e313885fc7fd9d4992ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a04f3824720223c439165243527906002" id="r_a04f3824720223c439165243527906002"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a04f3824720223c439165243527906002">dhcp_network_changed</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
-<tr class="separator:a04f3824720223c439165243527906002"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1fc0a94e0b94f13c5d302018f7ecb535" id="r_a1fc0a94e0b94f13c5d302018f7ecb535"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1fc0a94e0b94f13c5d302018f7ecb535">dhcp_arp_reply</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
-<tr class="separator:a1fc0a94e0b94f13c5d302018f7ecb535"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2fd33722859054ea932ff05ff62dedaa" id="r_a2fd33722859054ea932ff05ff62dedaa"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2fd33722859054ea932ff05ff62dedaa">dhcp_network_changed_link_up</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a2fd33722859054ea932ff05ff62dedaa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga583eb8d58f5e96b7dea717948578a947" id="r_ga583eb8d58f5e96b7dea717948578a947"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp_renew</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga583eb8d58f5e96b7dea717948578a947"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaf7cd42b9f220446b6a597d3474da6ece" id="r_gaf7cd42b9f220446b6a597d3474da6ece"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
@@ -163,17 +165,25 @@
 <tr class="separator:ga93f6bf21086dc9b10c0bec4676f97312"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae24a2529372218327ab9cb6592041c85" id="r_ae24a2529372218327ab9cb6592041c85"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ae24a2529372218327ab9cb6592041c85">dhcp_supplied_address</a> (const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ae24a2529372218327ab9cb6592041c85"><td class="memSeparator" colspan="2">&#160;</td></tr>
-</table><table class="memberdecls">
-<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="var-members" name="var-members"></a>
-Variables</h2></td></tr>
-<tr class="memitem:a5abd232496063bddcbc6692c0e8f9c1f" id="r_a5abd232496063bddcbc6692c0e8f9c1f"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5abd232496063bddcbc6692c0e8f9c1f">dhcp_rx_options_val</a> [DHCP_OPTION_IDX_MAX]</td></tr>
-<tr class="separator:a5abd232496063bddcbc6692c0e8f9c1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a058b71e1d26b3758b29d16d9f892c8cc" id="r_a058b71e1d26b3758b29d16d9f892c8cc"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a058b71e1d26b3758b29d16d9f892c8cc">dhcp_rx_options_given</a> [DHCP_OPTION_IDX_MAX]</td></tr>
-<tr class="separator:a058b71e1d26b3758b29d16d9f892c8cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Dynamic Host Configuration Protocol client </p>
 </div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aa29d020558b37b29d5d5ae50dfeb0c88" name="aa29d020558b37b29d5d5ae50dfeb0c88"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa29d020558b37b29d5d5ae50dfeb0c88">&#9670;&#160;</a></span>DHCP_ADD_EXTRA_REQUEST_OPTIONS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DHCP_ADD_EXTRA_REQUEST_OPTIONS</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>DHCP_ADD_EXTRA_REQUEST_OPTIONS: Additional options added to the list of options that the client requests from the servers (opt 55: DHCP_OPTION_PARAMETER_REQUEST_LIST) If additional options are requested, define this macro as a comma separated list, with leading comma. This macro is useful for example when requested vendor specific ids (VCI/VSI options), here is an example of requesting the VSI option (option 43) (yes, the notation is a bit strange, but it works :) (NOTE: the space between # and define is required because of doxygen...) </p><h1>define DHCP_ADD_EXTRA_REQUEST_OPTIONS ,43</h1>
+
+</div>
+</div>
 <a id="ad6de9c5120654454a330bf5de53c4835" name="ad6de9c5120654454a330bf5de53c4835"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ad6de9c5120654454a330bf5de53c4835">&#9670;&#160;</a></span>DHCP_CREATE_RAND_XID</h2>
 
@@ -204,8 +214,8 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">(<a class="code hl_struct" href="structnetif.html">netif</a>-&gt;<a class="code hl_variable" href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">mtu</a>)</div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
-<div class="ttc" id="astructnetif_html_aca7d56b4e0f822b0ced2885f222b8d48"><div class="ttname"><a href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">netif::mtu</a></div><div class="ttdeci">u16_t mtu</div><div class="ttdef"><b>Definition</b> netif.h:335</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
+<div class="ttc" id="astructnetif_html_aca7d56b4e0f822b0ced2885f222b8d48"><div class="ttname"><a href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">netif::mtu</a></div><div class="ttdeci">u16_t mtu</div><div class="ttdef"><b>Definition</b> netif.h:344</div></div>
 </div><!-- fragment --><p>Default for DHCP_GLOBAL_XID is 0xABCD0000 This can be changed by defining DHCP_GLOBAL_XID and DHCP_GLOBAL_XID_HEADER, e.g. #define DHCP_GLOBAL_XID_HEADER "stdlib.h" #define DHCP_GLOBAL_XID rand() DHCP_OPTION_MAX_MSG_SIZE is set to the MTU MTU is checked to be big enough in dhcp_start </p>
 
 </div>
@@ -225,6 +235,56 @@
 
 </div>
 </div>
+<a id="a33f306da575f8a437996d073b374df82" name="a33f306da575f8a437996d073b374df82"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a33f306da575f8a437996d073b374df82">&#9670;&#160;</a></span>SET_TIMEOUT_FROM_OFFERED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SET_TIMEOUT_FROM_OFFERED</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>result</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>offered</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>min</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>max</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  <span class="keywordflow">do</span> { \</div>
+<div class="line">  u32_t timeout = (offered + <a class="code hl_define" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">DHCP_COARSE_TIMER_SECS</a> / 2) / <a class="code hl_define" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">DHCP_COARSE_TIMER_SECS</a>;  \</div>
+<div class="line">  if (timeout &gt; max) {    \</div>
+<div class="line">    timeout = max;        \</div>
+<div class="line">  }                       \</div>
+<div class="line">  if (timeout == min) {   \</div>
+<div class="line">    timeout = 1;          \</div>
+<div class="line">  } \</div>
+<div class="line">  result = (<a class="code hl_typedef" href="dhcp_8h.html#aa85d661c7e160921c0497e7baa892b67">dhcp_timeout_t</a>)timeout; \</div>
+<div class="line">} <span class="keywordflow">while</span>(0)</div>
+<div class="ttc" id="adhcp_8h_html_a3751cc5daa0875d415ebacd8ad675f1e"><div class="ttname"><a href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">DHCP_COARSE_TIMER_SECS</a></div><div class="ttdeci">#define DHCP_COARSE_TIMER_SECS</div><div class="ttdef"><b>Definition</b> dhcp.h:65</div></div>
+<div class="ttc" id="adhcp_8h_html_aa85d661c7e160921c0497e7baa892b67"><div class="ttname"><a href="dhcp_8h.html#aa85d661c7e160921c0497e7baa892b67">dhcp_timeout_t</a></div><div class="ttdeci">u16_t dhcp_timeout_t</div><div class="ttdef"><b>Definition</b> dhcp.h:61</div></div>
+</div><!-- fragment --><p>DHCP_DEFINE_CUSTOM_TIMEOUTS: if this is defined then you can customize various DHCP timeouts using these macros:</p><ul>
+<li>DHCP_SET_TIMEOUT_FROM_OFFERED_T0_LEASE() to adjust the t0 lease timeout from the offered value</li>
+<li>DHCP_SET_TIMEOUT_FROM_OFFERED_T1_RENEW() same for t1 renew</li>
+<li>DHCP_SET_TIMEOUT_FROM_OFFERED_T2_REBIND() same for t2 rebind</li>
+<li>DHCP_NEXT_TIMEOUT_THRESHOLD to adjust the period of the next timeout</li>
+<li>DHCP_REQUEST_BACKOFF_SEQUENCE to adjust back-off times based on DHCP request attempts </li>
+</ul>
+
+</div>
+</div>
 <h2 class="groupheader">Enumeration Type Documentation</h2>
 <a id="a8c3b584d223b995b48613ad96cb776a0" name="a8c3b584d223b995b48613ad96cb776a0"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a8c3b584d223b995b48613ad96cb776a0">&#9670;&#160;</a></span>dhcp_option_idx</h2>
@@ -242,35 +302,6 @@
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
-<a id="a1fc0a94e0b94f13c5d302018f7ecb535" name="a1fc0a94e0b94f13c5d302018f7ecb535"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a1fc0a94e0b94f13c5d302018f7ecb535">&#9670;&#160;</a></span>dhcp_arp_reply()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void dhcp_arp_reply </td>
-          <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>addr</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Match an ARP reply with the offered IP address: check whether the offered IP address is not in use using ARP</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">netif</td><td>the network interface on which the reply was received </td></tr>
-    <tr><td class="paramname">addr</td><td>The IP address we received a reply from </td></tr>
-  </table>
-  </dd>
-</dl>
-
-</div>
-</div>
 <a id="ad7480883d64f3d6f083c8aa933b5e3cb" name="ad7480883d64f3d6f083c8aa933b5e3cb"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ad7480883d64f3d6f083c8aa933b5e3cb">&#9670;&#160;</a></span>dhcp_coarse_tmr()</h2>
 
@@ -308,14 +339,14 @@
 
 </div>
 </div>
-<a id="a04f3824720223c439165243527906002" name="a04f3824720223c439165243527906002"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a04f3824720223c439165243527906002">&#9670;&#160;</a></span>dhcp_network_changed()</h2>
+<a id="a2fd33722859054ea932ff05ff62dedaa" name="a2fd33722859054ea932ff05ff62dedaa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2fd33722859054ea932ff05ff62dedaa">&#9670;&#160;</a></span>dhcp_network_changed_link_up()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void dhcp_network_changed </td>
+          <td class="memname">void dhcp_network_changed_link_up </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
           <td></td>
@@ -352,37 +383,6 @@
 
 </div>
 </div>
-<h2 class="groupheader">Variable Documentation</h2>
-<a id="a058b71e1d26b3758b29d16d9f892c8cc" name="a058b71e1d26b3758b29d16d9f892c8cc"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a058b71e1d26b3758b29d16d9f892c8cc">&#9670;&#160;</a></span>dhcp_rx_options_given</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u8_t dhcp_rx_options_given[DHCP_OPTION_IDX_MAX]</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Holds a flag which option was received and is contained in dhcp_rx_options_val, only valid while in dhcp_recv.  </p>
-
-</div>
-</div>
-<a id="a5abd232496063bddcbc6692c0e8f9c1f" name="a5abd232496063bddcbc6692c0e8f9c1f"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a5abd232496063bddcbc6692c0e8f9c1f">&#9670;&#160;</a></span>dhcp_rx_options_val</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u32_t dhcp_rx_options_val[DHCP_OPTION_IDX_MAX]</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Holds the decoded option values, only valid while in dhcp_recv.  </p>
-
-</div>
-</div>
 </div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/doxygen/output/html/dhcp_8c.js b/doc/doxygen/output/html/dhcp_8c.js
index 6f8fbfa..86d161f 100644
--- a/doc/doxygen/output/html/dhcp_8c.js
+++ b/doc/doxygen/output/html/dhcp_8c.js
@@ -1,22 +1,21 @@
 var dhcp_8c =
 [
+    [ "DHCP_ADD_EXTRA_REQUEST_OPTIONS", "dhcp_8c.html#aa29d020558b37b29d5d5ae50dfeb0c88", null ],
     [ "DHCP_CREATE_RAND_XID", "dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835", null ],
     [ "DHCP_MAX_MSG_LEN", "dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b", null ],
     [ "DHCP_MIN_REPLY_LEN", "dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab", null ],
+    [ "SET_TIMEOUT_FROM_OFFERED", "dhcp_8c.html#a33f306da575f8a437996d073b374df82", null ],
     [ "dhcp_option_idx", "dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0", null ],
-    [ "dhcp_arp_reply", "dhcp_8c.html#a1fc0a94e0b94f13c5d302018f7ecb535", null ],
     [ "dhcp_cleanup", "group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64", null ],
     [ "dhcp_coarse_tmr", "dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb", null ],
     [ "dhcp_fine_tmr", "dhcp_8c.html#a601d97faa24fa7289244bb452f052045", null ],
     [ "dhcp_inform", "group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad", null ],
-    [ "dhcp_network_changed", "dhcp_8c.html#a04f3824720223c439165243527906002", null ],
+    [ "dhcp_network_changed_link_up", "dhcp_8c.html#a2fd33722859054ea932ff05ff62dedaa", null ],
     [ "dhcp_release", "group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4", null ],
     [ "dhcp_release_and_stop", "group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece", null ],
     [ "dhcp_renew", "group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947", null ],
     [ "dhcp_set_struct", "group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8", null ],
     [ "dhcp_start", "group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f", null ],
     [ "dhcp_stop", "group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312", null ],
-    [ "dhcp_supplied_address", "dhcp_8c.html#ae24a2529372218327ab9cb6592041c85", null ],
-    [ "dhcp_rx_options_given", "dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc", null ],
-    [ "dhcp_rx_options_val", "dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f", null ]
+    [ "dhcp_supplied_address", "dhcp_8c.html#ae24a2529372218327ab9cb6592041c85", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dhcp_8h.html b/doc/doxygen/output/html/dhcp_8h.html
index 0562e51..e0b7d46 100644
--- a/doc/doxygen/output/html/dhcp_8h.html
+++ b/doc/doxygen/output/html/dhcp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -99,6 +99,7 @@
 <div class="header">
   <div class="summary">
 <a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle"><div class="title">dhcp.h File Reference</div></div>
 </div><!--header-->
@@ -106,6 +107,7 @@
 <div class="textblock"><code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="acd_8h.html">lwip/acd.h</a>&quot;</code><br />
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
 Macros</h2></td></tr>
@@ -118,6 +120,11 @@
 <tr class="memitem:aa92284faa099dac4331c1fc0b997dabc" id="r_aa92284faa099dac4331c1fc0b997dabc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa92284faa099dac4331c1fc0b997dabc">dhcp_remove_struct</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:aa92284faa099dac4331c1fc0b997dabc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:aa85d661c7e160921c0497e7baa892b67" id="r_aa85d661c7e160921c0497e7baa892b67"><td class="memItemLeft" align="right" valign="top">typedef u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa85d661c7e160921c0497e7baa892b67">dhcp_timeout_t</a></td></tr>
+<tr class="separator:aa85d661c7e160921c0497e7baa892b67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
 <tr class="memitem:ga43812097832716a462c660eb59cc1bf8" id="r_ga43812097832716a462c660eb59cc1bf8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8">dhcp_set_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct dhcp *dhcp)</td></tr>
@@ -136,10 +143,8 @@
 <tr class="separator:gaf7cd42b9f220446b6a597d3474da6ece"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gabd7fcc7e0799e313885fc7fd9d4992ad" id="r_gabd7fcc7e0799e313885fc7fd9d4992ad"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:gabd7fcc7e0799e313885fc7fd9d4992ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a04f3824720223c439165243527906002" id="r_a04f3824720223c439165243527906002"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a04f3824720223c439165243527906002">dhcp_network_changed</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
-<tr class="separator:a04f3824720223c439165243527906002"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1fc0a94e0b94f13c5d302018f7ecb535" id="r_a1fc0a94e0b94f13c5d302018f7ecb535"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1fc0a94e0b94f13c5d302018f7ecb535">dhcp_arp_reply</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
-<tr class="separator:a1fc0a94e0b94f13c5d302018f7ecb535"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2fd33722859054ea932ff05ff62dedaa" id="r_a2fd33722859054ea932ff05ff62dedaa"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2fd33722859054ea932ff05ff62dedaa">dhcp_network_changed_link_up</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a2fd33722859054ea932ff05ff62dedaa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae24a2529372218327ab9cb6592041c85" id="r_ae24a2529372218327ab9cb6592041c85"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ae24a2529372218327ab9cb6592041c85">dhcp_supplied_address</a> (const struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ae24a2529372218327ab9cb6592041c85"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad7480883d64f3d6f083c8aa933b5e3cb" id="r_ad7480883d64f3d6f083c8aa933b5e3cb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ad7480883d64f3d6f083c8aa933b5e3cb">dhcp_coarse_tmr</a> (void)</td></tr>
@@ -210,42 +215,29 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a>(<a class="code hl_struct" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, NULL)</div>
-<div class="ttc" id="agroup__netif__cd_html_ga5ce61a277e1951183f7b7d03742c231f"><div class="ttname"><a href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a></div><div class="ttdeci">#define netif_set_client_data(netif, id, data)</div><div class="ttdef"><b>Definition</b> netif.h:233</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="agroup__netif__cd_html_ga5ce61a277e1951183f7b7d03742c231f"><div class="ttname"><a href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif_set_client_data</a></div><div class="ttdeci">#define netif_set_client_data(netif, id, data)</div><div class="ttdef"><b>Definition</b> netif.h:236</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>Remove a struct dhcp previously set to the netif using <a class="el" href="group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8">dhcp_set_struct()</a> </p>
 
 </div>
 </div>
-<h2 class="groupheader">Function Documentation</h2>
-<a id="a1fc0a94e0b94f13c5d302018f7ecb535" name="a1fc0a94e0b94f13c5d302018f7ecb535"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a1fc0a94e0b94f13c5d302018f7ecb535">&#9670;&#160;</a></span>dhcp_arp_reply()</h2>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="aa85d661c7e160921c0497e7baa892b67" name="aa85d661c7e160921c0497e7baa892b67"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa85d661c7e160921c0497e7baa892b67">&#9670;&#160;</a></span>dhcp_timeout_t</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void dhcp_arp_reply </td>
-          <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>addr</em></span>&#160;)</td>
+          <td class="memname">typedef u16_t <a class="el" href="#aa85d661c7e160921c0497e7baa892b67">dhcp_timeout_t</a></td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Match an ARP reply with the offered IP address: check whether the offered IP address is not in use using ARP</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">netif</td><td>the network interface on which the reply was received </td></tr>
-    <tr><td class="paramname">addr</td><td>The IP address we received a reply from </td></tr>
-  </table>
-  </dd>
-</dl>
+<p>Define DHCP_TIMEOUT_SIZE_T in <a class="el" href="opt_8h.html">opt.h</a> if you want use a different integer than u16_t. Especially useful if DHCP_COARSE_TIMER_SECS is in smaller units, so timeouts easily reach UINT16_MAX and more </p>
 
 </div>
 </div>
+<h2 class="groupheader">Function Documentation</h2>
 <a id="ad7480883d64f3d6f083c8aa933b5e3cb" name="ad7480883d64f3d6f083c8aa933b5e3cb"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ad7480883d64f3d6f083c8aa933b5e3cb">&#9670;&#160;</a></span>dhcp_coarse_tmr()</h2>
 
@@ -283,14 +275,14 @@
 
 </div>
 </div>
-<a id="a04f3824720223c439165243527906002" name="a04f3824720223c439165243527906002"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a04f3824720223c439165243527906002">&#9670;&#160;</a></span>dhcp_network_changed()</h2>
+<a id="a2fd33722859054ea932ff05ff62dedaa" name="a2fd33722859054ea932ff05ff62dedaa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2fd33722859054ea932ff05ff62dedaa">&#9670;&#160;</a></span>dhcp_network_changed_link_up()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void dhcp_network_changed </td>
+          <td class="memname">void dhcp_network_changed_link_up </td>
           <td>(</td>
           <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
           <td></td>
diff --git a/doc/doxygen/output/html/dhcp_8h.js b/doc/doxygen/output/html/dhcp_8h.js
index 363994c..ba11d57 100644
--- a/doc/doxygen/output/html/dhcp_8h.js
+++ b/doc/doxygen/output/html/dhcp_8h.js
@@ -4,12 +4,12 @@
     [ "DHCP_COARSE_TIMER_SECS", "dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e", null ],
     [ "DHCP_FINE_TIMER_MSECS", "dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f", null ],
     [ "dhcp_remove_struct", "dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc", null ],
-    [ "dhcp_arp_reply", "dhcp_8h.html#a1fc0a94e0b94f13c5d302018f7ecb535", null ],
+    [ "dhcp_timeout_t", "dhcp_8h.html#aa85d661c7e160921c0497e7baa892b67", null ],
     [ "dhcp_cleanup", "group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64", null ],
     [ "dhcp_coarse_tmr", "dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb", null ],
     [ "dhcp_fine_tmr", "dhcp_8h.html#a601d97faa24fa7289244bb452f052045", null ],
     [ "dhcp_inform", "group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad", null ],
-    [ "dhcp_network_changed", "dhcp_8h.html#a04f3824720223c439165243527906002", null ],
+    [ "dhcp_network_changed_link_up", "dhcp_8h.html#a2fd33722859054ea932ff05ff62dedaa", null ],
     [ "dhcp_release", "group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4", null ],
     [ "dhcp_release_and_stop", "group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece", null ],
     [ "dhcp_renew", "group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947", null ],
diff --git a/doc/doxygen/output/html/dir_04f2ecc425faf0d475a3caf484e551f3.html b/doc/doxygen/output/html/dir_04f2ecc425faf0d475a3caf484e551f3.html
index ac4fa07..d2cc7fb 100644
--- a/doc/doxygen/output/html/dir_04f2ecc425faf0d475a3caf484e551f3.html
+++ b/doc/doxygen/output/html/dir_04f2ecc425faf0d475a3caf484e551f3.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.html b/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.html
index bc45927..c9e03b5 100644
--- a/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.html
+++ b/doc/doxygen/output/html/dir_149963277126306875d8bfe8322084f3.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.html b/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.html
index e1038f9..9bd17a9 100644
--- a/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.html
+++ b/doc/doxygen/output/html/dir_1cb496c74bbaf54ecc99133e1c434e0c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.html b/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.html
index 8980175..54bc741 100644
--- a/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.html
+++ b/doc/doxygen/output/html/dir_1e445e767c368c70d58af8a0b7552719.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.html b/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.html
index 7702893..d7573a7 100644
--- a/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.html
+++ b/doc/doxygen/output/html/dir_34adf996f92d0eef72c45a7167a966e6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.html b/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.html
index 1950ddf..0092552 100644
--- a/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.html
+++ b/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -103,8 +103,8 @@
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
 Files</h2></td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tftp__server_8c.html">tftp_server.c</a></td></tr>
-<tr class="memdesc:tftp__server_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Trivial File Transfer Protocol (RFC 1350) <br /></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tftp_8c.html">tftp.c</a></td></tr>
+<tr class="memdesc:tftp_8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Trivial File Transfer Protocol (RFC 1350) <br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.js b/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.js
index 0a3919e..251eab8 100644
--- a/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.js
+++ b/doc/doxygen/output/html/dir_403e202f99dba154c685be932a8e0c34.js
@@ -1,4 +1,4 @@
 var dir_403e202f99dba154c685be932a8e0c34 =
 [
-    [ "tftp_server.c", "tftp__server_8c.html", "tftp__server_8c" ]
+    [ "tftp.c", "tftp_8c.html", "tftp_8c" ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_439fcb6f68ea6a3dc0078b338960fd8f.html b/doc/doxygen/output/html/dir_439fcb6f68ea6a3dc0078b338960fd8f.html
index 1b01304..dfc5729 100644
--- a/doc/doxygen/output/html/dir_439fcb6f68ea6a3dc0078b338960fd8f.html
+++ b/doc/doxygen/output/html/dir_439fcb6f68ea6a3dc0078b338960fd8f.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.html b/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.html
index 5555217..cb6c39d 100644
--- a/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.html
+++ b/doc/doxygen/output/html/dir_460c501b2432fc107adcb38111835e48.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.html b/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.html
index 6c591ba..29b2654 100644
--- a/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.html
+++ b/doc/doxygen/output/html/dir_4b846c6b6971d2800eff93d75504accd.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.html b/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.html
index fd21554..3723d0f 100644
--- a/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.html
+++ b/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -112,6 +112,8 @@
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
 Files</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acd_8h.html">acd.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp_8h.html">altcp.h</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="altcp__tcp_8h.html">altcp_tcp.h</a></td></tr>
diff --git a/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.js b/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.js
index 1d449c9..c0302b1 100644
--- a/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.js
+++ b/doc/doxygen/output/html/dir_4e6b3cf33a61b6caac9c8ac30c866f37.js
@@ -3,6 +3,7 @@
     [ "apps", "dir_f9284811ac594eafdc3134d5f8b945cb.html", "dir_f9284811ac594eafdc3134d5f8b945cb" ],
     [ "priv", "dir_460c501b2432fc107adcb38111835e48.html", "dir_460c501b2432fc107adcb38111835e48" ],
     [ "prot", "dir_fa0f2b7ac208069fc8d28c28af349d8d.html", "dir_fa0f2b7ac208069fc8d28c28af349d8d" ],
+    [ "acd.h", "acd_8h.html", "acd_8h" ],
     [ "altcp.h", "altcp_8h.html", "altcp_8h" ],
     [ "altcp_tcp.h", "altcp__tcp_8h.html", "altcp__tcp_8h" ],
     [ "altcp_tls.h", "altcp__tls_8h.html", "altcp__tls_8h" ],
diff --git a/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.html b/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.html
index 1d254ba..8181ac0 100644
--- a/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.html
+++ b/doc/doxygen/output/html/dir_53adf0b982dc8545998aae3f283a5a58.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.html b/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.html
index 9d0d8b0..f413a6b 100644
--- a/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.html
+++ b/doc/doxygen/output/html/dir_56d2b6ddbb44630b0fd661af6321f9c4.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
index 21d763c..4bb289b 100644
--- a/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
+++ b/doc/doxygen/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.html b/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.html
index 565c49d..ecfe160 100644
--- a/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.html
+++ b/doc/doxygen/output/html/dir_6aa605ad180e7b166767bf4f86888ab5.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.html b/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.html
index b231218..d186a79 100644
--- a/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.html
+++ b/doc/doxygen/output/html/dir_6b1b06896a870ebfb9c854c4c71f4ff5.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.html b/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.html
index 59f7c0c..5d0aba2 100644
--- a/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.html
+++ b/doc/doxygen/output/html/dir_8da39adb2a11af660bdd7075b7323870.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.html b/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.html
index aec520d..ef0a30f 100644
--- a/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.html
+++ b/doc/doxygen/output/html/dir_900e6f7ff90690cb8edb53323dd38d80.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.html b/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.html
index 6222ce6..1a30c51 100644
--- a/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.html
+++ b/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -103,6 +103,8 @@
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
 Files</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acd_8c.html">acd.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="autoip_8c.html">autoip.c</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dhcp_8c.html">dhcp.c</a></td></tr>
diff --git a/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.js b/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.js
index a5862b3..7e0a68f 100644
--- a/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.js
+++ b/doc/doxygen/output/html/dir_a32e111ee6805cfc63488fd2d37f2390.js
@@ -1,5 +1,6 @@
 var dir_a32e111ee6805cfc63488fd2d37f2390 =
 [
+    [ "acd.c", "acd_8c.html", "acd_8c" ],
     [ "autoip.c", "autoip_8c.html", "autoip_8c" ],
     [ "dhcp.c", "dhcp_8c.html", "dhcp_8c" ],
     [ "etharp.c", "etharp_8c.html", "etharp_8c" ],
diff --git a/doc/doxygen/output/html/dir_a840c1e301b5b5eb1d549b1f600a8505.html b/doc/doxygen/output/html/dir_a840c1e301b5b5eb1d549b1f600a8505.html
index 0a84578..d55e16a 100644
--- a/doc/doxygen/output/html/dir_a840c1e301b5b5eb1d549b1f600a8505.html
+++ b/doc/doxygen/output/html/dir_a840c1e301b5b5eb1d549b1f600a8505.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html b/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html
index bd79ada..95d1352 100644
--- a/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html
+++ b/doc/doxygen/output/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html b/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html
index e50c7ae..9bc7eca 100644
--- a/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html
+++ b/doc/doxygen/output/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.html b/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.html
index d886301..1cca1c5 100644
--- a/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.html
+++ b/doc/doxygen/output/html/dir_b42baff89a1adc9a57da7decb1835b6b.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.html b/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.html
index 6804eb3..ef40b53 100644
--- a/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.html
+++ b/doc/doxygen/output/html/dir_c62aba36f6630fea5cd7fe1c941850d4.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.html b/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.html
index 970b4b9..9287665 100644
--- a/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.html
+++ b/doc/doxygen/output/html/dir_c9a67764bf8a12cf6b427bb859cbcd0b.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.html b/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.html
index ad06be0..bbc89ab 100644
--- a/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.html
+++ b/doc/doxygen/output/html/dir_da61e3e9a357748887e3ca8d7c5a0c16.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.html b/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.html
index df169dd..3f85273 100644
--- a/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.html
+++ b/doc/doxygen/output/html/dir_da9c6f43d3cd00be3de224bac907a425.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.html b/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.html
index d420134..fda4218 100644
--- a/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.html
+++ b/doc/doxygen/output/html/dir_dfacd4b005f6a743295cd1d76eff7420.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_e68e8157741866f444e17edd764ebbae.html b/doc/doxygen/output/html/dir_e68e8157741866f444e17edd764ebbae.html
index a7b640e..f1403f9 100644
--- a/doc/doxygen/output/html/dir_e68e8157741866f444e17edd764ebbae.html
+++ b/doc/doxygen/output/html/dir_e68e8157741866f444e17edd764ebbae.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.html b/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.html
index 71797ee..b39bf12 100644
--- a/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.html
+++ b/doc/doxygen/output/html/dir_e7856a6aeaebbc124e80ad9550aedba4.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_ed91d3856030f1b493eca503ef5b96f9.html b/doc/doxygen/output/html/dir_ed91d3856030f1b493eca503ef5b96f9.html
index 8030570..aea47af 100644
--- a/doc/doxygen/output/html/dir_ed91d3856030f1b493eca503ef5b96f9.html
+++ b/doc/doxygen/output/html/dir_ed91d3856030f1b493eca503ef5b96f9.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.html b/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.html
index 1fab034..65cca17 100644
--- a/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.html
+++ b/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -117,8 +117,12 @@
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns_8h.html">mdns.h</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns__domain_8h.html">mdns_domain.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns__opts_8h.html">mdns_opts.h</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns__out_8h.html">mdns_out.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns__priv_8h.html">mdns_priv.h</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mqtt_8h.html">mqtt.h</a></td></tr>
@@ -151,11 +155,15 @@
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sntp__opts_8h.html">sntp_opts.h</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tftp__client_8h.html">tftp_client.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tftp__common_8h.html">tftp_common.h</a></td></tr>
+<tr class="memdesc:tftp__common_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Trivial File Transfer Protocol (RFC 1350) <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tftp__opts_8h.html">tftp_opts.h</a></td></tr>
 <tr class="memdesc:tftp__opts_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Trivial File Transfer Protocol (RFC 1350) implementation options. <br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tftp__server_8h.html">tftp_server.h</a></td></tr>
-<tr class="memdesc:tftp__server_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Trivial File Transfer Protocol (RFC 1350) <br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.js b/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.js
index a5462ea..d6c13ee 100644
--- a/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.js
+++ b/doc/doxygen/output/html/dir_f9284811ac594eafdc3134d5f8b945cb.js
@@ -7,7 +7,9 @@
     [ "httpd_opts.h", "httpd__opts_8h.html", "httpd__opts_8h" ],
     [ "lwiperf.h", "lwiperf_8h.html", "lwiperf_8h" ],
     [ "mdns.h", "mdns_8h.html", "mdns_8h" ],
+    [ "mdns_domain.h", "mdns__domain_8h.html", "mdns__domain_8h" ],
     [ "mdns_opts.h", "mdns__opts_8h.html", "mdns__opts_8h" ],
+    [ "mdns_out.h", "mdns__out_8h.html", "mdns__out_8h" ],
     [ "mdns_priv.h", "mdns__priv_8h.html", "mdns__priv_8h" ],
     [ "mqtt.h", "mqtt_8h.html", "mqtt_8h" ],
     [ "mqtt_opts.h", "mqtt__opts_8h.html", "mqtt__opts_8h" ],
@@ -24,6 +26,8 @@
     [ "snmpv3.h", "snmpv3_8h.html", null ],
     [ "sntp.h", "sntp_8h.html", "sntp_8h" ],
     [ "sntp_opts.h", "sntp__opts_8h.html", "sntp__opts_8h" ],
+    [ "tftp_client.h", "tftp__client_8h.html", "tftp__client_8h" ],
+    [ "tftp_common.h", "tftp__common_8h.html", "tftp__common_8h" ],
     [ "tftp_opts.h", "tftp__opts_8h.html", "tftp__opts_8h" ],
     [ "tftp_server.h", "tftp__server_8h.html", "tftp__server_8h" ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.html b/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.html
index 380e27d..9809d9a 100644
--- a/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.html
+++ b/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -103,6 +103,8 @@
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
 Files</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2acd_8h.html">acd.h</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2autoip_8h.html">autoip.h</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="prot_2dhcp_8h.html">dhcp.h</a></td></tr>
diff --git a/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.js b/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.js
index 7d908c5..567d850 100644
--- a/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.js
+++ b/doc/doxygen/output/html/dir_fa0f2b7ac208069fc8d28c28af349d8d.js
@@ -1,5 +1,6 @@
 var dir_fa0f2b7ac208069fc8d28c28af349d8d =
 [
+    [ "acd.h", "prot_2acd_8h.html", null ],
     [ "autoip.h", "prot_2autoip_8h.html", null ],
     [ "dhcp.h", "prot_2dhcp_8h.html", "prot_2dhcp_8h" ],
     [ "dhcp6.h", "prot_2dhcp6_8h.html", "prot_2dhcp6_8h" ],
diff --git a/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.html b/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.html
index ea9aa27..16cadf9 100644
--- a/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.html
+++ b/doc/doxygen/output/html/dir_fb3f7e43f39ddb210bd1444e66d055f1.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.html b/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.html
index 290e04f..f9a7939 100644
--- a/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.html
+++ b/doc/doxygen/output/html/dir_fe219fca207b878205c0dd92278d118b.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.html b/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.html
index 071238b..745da7a 100644
--- a/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.html
+++ b/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -105,6 +105,10 @@
 Files</h2></td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns_8c.html">mdns.c</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns__domain_8c.html">mdns_domain.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="icondoc"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mdns__out_8c.html">mdns_out.c</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.js b/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.js
index bf303bb..da6708d 100644
--- a/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.js
+++ b/doc/doxygen/output/html/dir_febe3a637907666e8b25366ae60efc0b.js
@@ -1,4 +1,6 @@
 var dir_febe3a637907666e8b25366ae60efc0b =
 [
-    [ "mdns.c", "mdns_8c.html", "mdns_8c" ]
+    [ "mdns.c", "mdns_8c.html", "mdns_8c" ],
+    [ "mdns_domain.c", "mdns__domain_8c.html", "mdns__domain_8c" ],
+    [ "mdns_out.c", "mdns__out_8c.html", "mdns__out_8c" ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/dns_8c.html b/doc/doxygen/output/html/dns_8c.html
index b887edd..91d1e4c 100644
--- a/doc/doxygen/output/html/dns_8c.html
+++ b/doc/doxygen/output/html/dns_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/dns_8h.html b/doc/doxygen/output/html/dns_8h.html
index 5b19bb1..7f982db 100644
--- a/doc/doxygen/output/html/dns_8h.html
+++ b/doc/doxygen/output/html/dns_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/doxygen_crawl.html b/doc/doxygen/output/html/doxygen_crawl.html
index d45f3a3..96b1bf5 100644
--- a/doc/doxygen/output/html/doxygen_crawl.html
+++ b/doc/doxygen/output/html/doxygen_crawl.html
@@ -26,6 +26,8 @@
 <a href="httpd_8c.html"/>
 <a href="lwiperf_8c.html"/>
 <a href="mdns_8c.html"/>
+<a href="mdns__domain_8c.html"/>
+<a href="mdns__out_8c.html"/>
 <a href="mqtt_8c.html"/>
 <a href="netbiosns_8c.html"/>
 <a href="smtp_8c.html"/>
@@ -54,7 +56,7 @@
 <a href="snmpv3__mbedtls_8c.html"/>
 <a href="snmpv3__priv_8h.html"/>
 <a href="sntp_8c.html"/>
-<a href="tftp__server_8c.html"/>
+<a href="tftp_8c.html"/>
 <a href="altcp_8c.html"/>
 <a href="altcp__alloc_8c.html"/>
 <a href="altcp__tcp_8c.html"/>
@@ -63,6 +65,7 @@
 <a href="inet__chksum_8c.html"/>
 <a href="init_8c.html"/>
 <a href="ip_8c.html"/>
+<a href="acd_8c.html"/>
 <a href="autoip_8c.html"/>
 <a href="dhcp_8c.html"/>
 <a href="etharp_8c.html"/>
@@ -100,6 +103,8 @@
 <a href="socket_8h.html"/>
 <a href="compat_2stdc_2errno_8h.html"/>
 <a href="lwip_2errno_8h.html"/>
+<a href="acd_8h.html"/>
+<a href="prot_2acd_8h.html"/>
 <a href="altcp_8h.html"/>
 <a href="altcp__tcp_8h.html"/>
 <a href="altcp__tls_8h.html"/>
@@ -111,7 +116,9 @@
 <a href="httpd__opts_8h.html"/>
 <a href="lwiperf_8h.html"/>
 <a href="mdns_8h.html"/>
+<a href="mdns__domain_8h.html"/>
 <a href="mdns__opts_8h.html"/>
+<a href="mdns__out_8h.html"/>
 <a href="mdns__priv_8h.html"/>
 <a href="mqtt_8h.html"/>
 <a href="mqtt__opts_8h.html"/>
@@ -129,6 +136,8 @@
 <a href="snmpv3_8h.html"/>
 <a href="sntp_8h.html"/>
 <a href="sntp__opts_8h.html"/>
+<a href="tftp__client_8h.html"/>
+<a href="tftp__common_8h.html"/>
 <a href="tftp__opts_8h.html"/>
 <a href="tftp__server_8h.html"/>
 <a href="arch_8h.html"/>
@@ -228,6 +237,7 @@
 <a href="upgrading.html"/>
 <a href="changelog.html"/>
 <a href="contrib.html"/>
+<a href="cmake.html"/>
 <a href="pitfalls.html"/>
 <a href="mem_err.html"/>
 <a href="bugs.html"/>
@@ -278,6 +288,7 @@
 <a href="group__ipaddr.html"/>
 <a href="group__ip4addr.html"/>
 <a href="group__ip6addr.html"/>
+<a href="group__acd.html"/>
 <a href="group__autoip.html"/>
 <a href="group__dhcp4.html"/>
 <a href="group__igmp.html"/>
@@ -318,6 +329,7 @@
 <a href="group__lwip__version.html"/>
 <a href="group__ip6__zones.html"/>
 <a href="group__netif__flags.html"/>
+<a href="group__netifapi__arp.html"/>
 <a href="group__netifapi__dhcp4.html"/>
 <a href="group__netifapi__autoip.html"/>
 <a href="group__lwip__opts.html"/>
@@ -337,6 +349,7 @@
 <a href="group__lwip__opts__raw.html"/>
 <a href="group__lwip__opts__dhcp.html"/>
 <a href="group__lwip__opts__autoip.html"/>
+<a href="group__lwip__opts__acd.html"/>
 <a href="group__lwip__opts__mib2.html"/>
 <a href="group__lwip__opts__multicast.html"/>
 <a href="group__lwip__opts__igmp.html"/>
@@ -373,6 +386,8 @@
 <a href="group__zepif.html"/>
 <a href="struct__lwiperf__settings.html"/>
 <a href="struct__lwiperf__state__tcp.html"/>
+<a href="structacd.html"/>
+<a href="structaltcp__allocator__s.html"/>
 <a href="structapi__msg.html"/>
 <a href="structautoip.html"/>
 <a href="structbridgeif__initdata__s.html"/>
@@ -393,6 +408,7 @@
 <a href="structicmp6__echo__hdr.html"/>
 <a href="structicmp6__hdr.html"/>
 <a href="structicmp__echo__hdr.html"/>
+<a href="structicmp__hdr.html"/>
 <a href="structieee__802154__hdr.html"/>
 <a href="structigmp__group.html"/>
 <a href="structigmp__msg.html"/>
@@ -414,9 +430,12 @@
 <a href="structlwip__cyclic__timer.html"/>
 <a href="structlwip__select__cb.html"/>
 <a href="structlwip__sock.html"/>
+<a href="structmdns__delayed__msg.html"/>
 <a href="structmdns__host.html"/>
+<a href="structmdns__outmsg.html"/>
 <a href="structmdns__outpacket.html"/>
 <a href="structmdns__packet.html"/>
+<a href="structmdns__request.html"/>
 <a href="structmdns__rr__info.html"/>
 <a href="structmdns__service.html"/>
 <a href="structmem.html"/>
@@ -593,12 +612,14 @@
 <a href="globals_d.html"/>
 <a href="globals_e.html"/>
 <a href="globals_f.html"/>
+<a href="globals_g.html"/>
 <a href="globals_h.html"/>
 <a href="globals_i.html"/>
 <a href="globals_l.html"/>
 <a href="globals_m.html"/>
 <a href="globals_n.html"/>
 <a href="globals_p.html"/>
+<a href="globals_q.html"/>
 <a href="globals_r.html"/>
 <a href="globals_s.html"/>
 <a href="globals_t.html"/>
@@ -608,6 +629,7 @@
 <a href="globals_func_b.html"/>
 <a href="globals_func_d.html"/>
 <a href="globals_func_e.html"/>
+<a href="globals_func_g.html"/>
 <a href="globals_func_h.html"/>
 <a href="globals_func_i.html"/>
 <a href="globals_func_l.html"/>
@@ -640,6 +662,7 @@
 <a href="globals_type.html"/>
 <a href="globals_type.html"/>
 <a href="globals_type.html"/>
+<a href="globals_type.html"/>
 <a href="globals_enum.html"/>
 <a href="globals_enum.html"/>
 <a href="globals_enum.html"/>
@@ -668,11 +691,20 @@
 <a href="globals_defs_m.html"/>
 <a href="globals_defs_n.html"/>
 <a href="globals_defs_p.html"/>
+<a href="globals_defs_q.html"/>
 <a href="globals_defs_r.html"/>
 <a href="globals_defs_s.html"/>
 <a href="globals_defs_t.html"/>
 <a href="globals_defs_u.html"/>
 <a href="globals_defs_z.html"/>
+<a href="acd_8c.html"/>
+<a href="acd_8c.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e"/>
+<a href="acd_8c.html#aa92e21410d0f0d357ab9166cda24937a"/>
+<a href="acd_8h.html"/>
+<a href="acd_8h.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e"/>
+<a href="acd_8h.html#aa92e21410d0f0d357ab9166cda24937a"/>
+<a href="acd_8h.html#aace6da0b0dacd77a9d6bd11f424ffa82"/>
+<a href="acd_8h.html#abb446404752f56b028eafa8302db955f"/>
 <a href="altcp_8c.html"/>
 <a href="altcp_8c.html#aa74c9fc358cffeeb7311b4212b0d6fc7"/>
 <a href="altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d"/>
@@ -702,6 +734,7 @@
 <a href="altcp__tls__mbedtls__mem_8h.html"/>
 <a href="altcp__tls__mbedtls__opts_8h.html"/>
 <a href="altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308"/>
+<a href="altcp__tls__mbedtls__opts_8h.html#a12aba61586bd71cb42b0925b9211b366"/>
 <a href="altcp__tls__mbedtls__opts_8h.html#a1c8a3f37f8ede74835b03eedcdc41973"/>
 <a href="altcp__tls__mbedtls__opts_8h.html#a4917dbc00f43f88eb703c8ba89bd37f6"/>
 <a href="altcp__tls__mbedtls__opts_8h.html#a66eff71890153166578b0b78d780ac50"/>
@@ -803,25 +836,21 @@
 <a href="apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186"/>
 <a href="arch_8h.html"/>
 <a href="autoip_8c.html"/>
-<a href="autoip_8c.html#a11df7a20d52680cd8c1c18fba2b91e9e"/>
-<a href="autoip_8c.html#a1b4f0c53da17395d9de92a85708a1bb9"/>
-<a href="autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59"/>
-<a href="autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d"/>
-<a href="autoip_8c.html#acaf2793325c60dc4531c21a3fd55c16e"/>
+<a href="autoip_8c.html#a6de97b7dcd98f9039d5c1ad11c257d62"/>
 <a href="autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43"/>
+<a href="autoip_8c.html#af2a36aee96cbdf8f4a8f1e69c91ff425"/>
+<a href="autoip_8c.html#af93544c49f2c24b95a3981351d023056"/>
 <a href="autoip_8h.html"/>
-<a href="autoip_8h.html#a11df7a20d52680cd8c1c18fba2b91e9e"/>
-<a href="autoip_8h.html#a1b4f0c53da17395d9de92a85708a1bb9"/>
-<a href="autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d"/>
-<a href="autoip_8h.html#a8986919a452ab77eec9a199ff6668e92"/>
-<a href="autoip_8h.html#aaeb4b778fce078bee84144ab50916b15"/>
-<a href="autoip_8h.html#acaf2793325c60dc4531c21a3fd55c16e"/>
+<a href="autoip_8h.html#a6de97b7dcd98f9039d5c1ad11c257d62"/>
+<a href="autoip_8h.html#af2a36aee96cbdf8f4a8f1e69c91ff425"/>
+<a href="autoip_8h.html#af93544c49f2c24b95a3981351d023056"/>
 <a href="bridgeif_8c.html"/>
 <a href="bridgeif_8h.html"/>
 <a href="bridgeif__fdb_8c.html"/>
 <a href="bridgeif__opts_8h.html"/>
 <a href="bugs.html"/>
 <a href="changelog.html"/>
+<a href="cmake.html"/>
 <a href="compat_2posix_2arpa_2inet_8h.html"/>
 <a href="compat_2posix_2netdb_8h.html"/>
 <a href="compat_2stdc_2errno_8h.html"/>
@@ -852,10 +881,8 @@
 <a href="dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba"/>
 <a href="dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f"/>
 <a href="dhcp_8c.html"/>
-<a href="dhcp_8c.html#a04f3824720223c439165243527906002"/>
-<a href="dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc"/>
-<a href="dhcp_8c.html#a1fc0a94e0b94f13c5d302018f7ecb535"/>
-<a href="dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f"/>
+<a href="dhcp_8c.html#a2fd33722859054ea932ff05ff62dedaa"/>
+<a href="dhcp_8c.html#a33f306da575f8a437996d073b374df82"/>
 <a href="dhcp_8c.html#a601d97faa24fa7289244bb452f052045"/>
 <a href="dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b"/>
 <a href="dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0"/>
@@ -870,16 +897,17 @@
 <a href="dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0acf74d36a7c0a4e1949d5587c6faf01fd"/>
 <a href="dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0ad6bea8517718f901fa81efe600ebbfb8"/>
 <a href="dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0aeb33ae8794805fd2b3434e5dd3f7503c"/>
+<a href="dhcp_8c.html#aa29d020558b37b29d5d5ae50dfeb0c88"/>
 <a href="dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab"/>
 <a href="dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835"/>
 <a href="dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb"/>
 <a href="dhcp_8c.html#ae24a2529372218327ab9cb6592041c85"/>
 <a href="dhcp_8h.html"/>
-<a href="dhcp_8h.html#a04f3824720223c439165243527906002"/>
-<a href="dhcp_8h.html#a1fc0a94e0b94f13c5d302018f7ecb535"/>
+<a href="dhcp_8h.html#a2fd33722859054ea932ff05ff62dedaa"/>
 <a href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e"/>
 <a href="dhcp_8h.html#a601d97faa24fa7289244bb452f052045"/>
 <a href="dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f"/>
+<a href="dhcp_8h.html#aa85d661c7e160921c0497e7baa892b67"/>
 <a href="dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc"/>
 <a href="dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb"/>
 <a href="dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6"/>
@@ -935,7 +963,9 @@
 <a href="etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15"/>
 <a href="etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6"/>
 <a href="etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26"/>
+<a href="etharp_8c.html#a7c41ba8b145fa4d06f8d6af3df44c4ff"/>
 <a href="etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9"/>
+<a href="etharp_8c.html#aac7d5048a81ef1c63b18d769700f4899"/>
 <a href="etharp_8c.html#ab93df7ccb26496100d45137541e863c8"/>
 <a href="etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a"/>
 <a href="etharp_8c.html#ae180772e31346a0afeb707ad172dd19c"/>
@@ -1018,6 +1048,7 @@
 <a href="globals_defs_m.html"/>
 <a href="globals_defs_n.html"/>
 <a href="globals_defs_p.html"/>
+<a href="globals_defs_q.html"/>
 <a href="globals_defs_r.html"/>
 <a href="globals_defs_s.html"/>
 <a href="globals_defs_t.html"/>
@@ -1031,6 +1062,7 @@
 <a href="globals_func_b.html"/>
 <a href="globals_func_d.html"/>
 <a href="globals_func_e.html"/>
+<a href="globals_func_g.html"/>
 <a href="globals_func_h.html"/>
 <a href="globals_func_i.html"/>
 <a href="globals_func_l.html"/>
@@ -1042,12 +1074,14 @@
 <a href="globals_func_t.html"/>
 <a href="globals_func_u.html"/>
 <a href="globals_func_z.html"/>
+<a href="globals_g.html"/>
 <a href="globals_h.html"/>
 <a href="globals_i.html"/>
 <a href="globals_l.html"/>
 <a href="globals_m.html"/>
 <a href="globals_n.html"/>
 <a href="globals_p.html"/>
+<a href="globals_q.html"/>
 <a href="globals_r.html"/>
 <a href="globals_s.html"/>
 <a href="globals_t.html"/>
@@ -1055,7 +1089,15 @@
 <a href="globals_u.html"/>
 <a href="globals_vars.html"/>
 <a href="globals_z.html"/>
+<a href="group__acd.html"/>
+<a href="group__acd.html#ga158856bf139cb2761837ddfa07303bdc"/>
+<a href="group__acd.html#ga18b444f6fc69325416b463208a754c97"/>
+<a href="group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff"/>
+<a href="group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb"/>
+<a href="group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7"/>
+<a href="group__acd.html#ga70503696bca25e1cfb61fad38b4327da"/>
 <a href="group__altcp.html"/>
+<a href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209"/>
 <a href="group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319"/>
 <a href="group__altcp.html#ga197a33af038556a04d8f27c7033d771f"/>
 <a href="group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0"/>
@@ -1080,23 +1122,29 @@
 <a href="group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd"/>
 <a href="group__altcp__api.html"/>
 <a href="group__altcp__tls.html"/>
+<a href="group__altcp__tls.html#ga1f60b12a6a4440214b7bcf2e3ba43126"/>
+<a href="group__altcp__tls.html#ga4aed4aa55d0e1b15f4118863cea06d18"/>
 <a href="group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597"/>
 <a href="group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e"/>
 <a href="group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2"/>
 <a href="group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170"/>
+<a href="group__altcp__tls.html#ga827c76a0bddc4923b9a17c813e13891e"/>
 <a href="group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7"/>
 <a href="group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145"/>
+<a href="group__altcp__tls.html#ga906eefcef66e9dd2b43c3392704905f5"/>
+<a href="group__altcp__tls.html#gaa37649bf24ebea235a8e3e8f50b9831f"/>
 <a href="group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c"/>
 <a href="group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc"/>
 <a href="group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8"/>
+<a href="group__altcp__tls.html#gae6c3cf72fcd29e6ea4c74181370420c3"/>
 <a href="group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e"/>
-<a href="group__altcp__tls.html#gaf6ed13271394371cc89d70ef5128c411"/>
 <a href="group__api.html"/>
 <a href="group__apps.html"/>
 <a href="group__autoip.html"/>
 <a href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8"/>
 <a href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90"/>
 <a href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4"/>
+<a href="group__autoip.html#gac0c98035795500ede464aa4af2515f30"/>
 <a href="group__bridgeif.html"/>
 <a href="group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c"/>
 <a href="group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f"/>
@@ -1207,6 +1255,7 @@
 <a href="group__httpd.html#gaf88dacc4f18d299084cab75252001319"/>
 <a href="group__httpd.html#gafaedb1911a83854b1e9835132db64409"/>
 <a href="group__httpd__opts.html"/>
+<a href="group__httpd__opts.html#ga006baa7219cff5ee02f5a14ef7d7c89d"/>
 <a href="group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a"/>
 <a href="group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43"/>
 <a href="group__httpd__opts.html#ga0d5074965efd40786182287895feb691"/>
@@ -1229,6 +1278,7 @@
 <a href="group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8"/>
 <a href="group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a"/>
 <a href="group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3"/>
+<a href="group__httpd__opts.html#gaa3648a9fdefe3ab1c890b715a4786429"/>
 <a href="group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182"/>
 <a href="group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466"/>
 <a href="group__httpd__opts.html#gabb13219495a813fceaafa954a238a924"/>
@@ -1335,9 +1385,10 @@
 <a href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78"/>
 <a href="group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9"/>
 <a href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90"/>
+<a href="group__ip6__zones.html#gabc6d5f833b2abef31aa602dc11ace0a9"/>
+<a href="group__ip6__zones.html#gac01d0bad0a682dcc239ba3d5695e0648"/>
 <a href="group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e"/>
 <a href="group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c"/>
-<a href="group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9"/>
 <a href="group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97"/>
 <a href="group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad"/>
 <a href="group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b"/>
@@ -1351,10 +1402,23 @@
 <a href="group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0"/>
 <a href="group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43"/>
 <a href="group__ipaddr.html"/>
+<a href="group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a"/>
+<a href="group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e"/>
 <a href="group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04"/>
+<a href="group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752"/>
+<a href="group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4"/>
 <a href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e"/>
+<a href="group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653"/>
+<a href="group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb"/>
 <a href="group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151"/>
+<a href="group__ipaddr.html#ga5b40158bdffa4b0c81c4ee77066e6b28"/>
+<a href="group__ipaddr.html#ga8ac2686417ec2974bb0b3fc6ee0ee1a7"/>
+<a href="group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75"/>
 <a href="group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef"/>
+<a href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede"/>
+<a href="group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05"/>
+<a href="group__ipaddr.html#gad1bbbe4c93ea2368663e90814953b929"/>
+<a href="group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4"/>
 <a href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c"/>
 <a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02"/>
 <a href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e"/>
@@ -1375,6 +1439,8 @@
 <a href="group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff"/>
 <a href="group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883"/>
 <a href="group__lwip__opts.html"/>
+<a href="group__lwip__opts__acd.html"/>
+<a href="group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7"/>
 <a href="group__lwip__opts__arp.html"/>
 <a href="group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1"/>
 <a href="group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084"/>
@@ -1425,6 +1491,7 @@
 <a href="group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411"/>
 <a href="group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160"/>
 <a href="group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3"/>
+<a href="group__lwip__opts__debugmsg.html#ga87ff0c6077b9a36b05c3fc5b8fae8ad3"/>
 <a href="group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa"/>
 <a href="group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a"/>
 <a href="group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee"/>
@@ -1447,7 +1514,8 @@
 <a href="group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6"/>
 <a href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9"/>
 <a href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2"/>
-<a href="group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69"/>
+<a href="group__lwip__opts__dhcp.html#gad6b030f8e828666953661578f936e605"/>
+<a href="group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55"/>
 <a href="group__lwip__opts__dhcpv6.html"/>
 <a href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6"/>
 <a href="group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155"/>
@@ -1644,6 +1712,7 @@
 <a href="group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f"/>
 <a href="group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36"/>
 <a href="group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402"/>
+<a href="group__lwip__opts__socket.html#ga524c013ecdd8a45a2949f2a433469e82"/>
 <a href="group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942"/>
 <a href="group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d"/>
 <a href="group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb"/>
@@ -1699,6 +1768,7 @@
 <a href="group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8"/>
 <a href="group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5"/>
 <a href="group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4"/>
+<a href="group__lwip__opts__tcp.html#gade23373901980c6e7a43cef813386ebe"/>
 <a href="group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec"/>
 <a href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b"/>
 <a href="group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f"/>
@@ -1748,20 +1818,30 @@
 <a href="group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1"/>
 <a href="group__mdns.html"/>
 <a href="group__mdns.html#ga01c85202f4b85edc8b571f2f419db576"/>
+<a href="group__mdns.html#ga09b7a259f497648d8ef734b080f997c1"/>
+<a href="group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac"/>
 <a href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85"/>
-<a href="group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad"/>
+<a href="group__mdns.html#ga2130111662d044b32970ce9c763bd409"/>
+<a href="group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737"/>
+<a href="group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a"/>
 <a href="group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3"/>
+<a href="group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e"/>
 <a href="group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e"/>
-<a href="group__mdns.html#ga824e992e94be216c8e059f48f49a59ce"/>
 <a href="group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a"/>
-<a href="group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb"/>
 <a href="group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c"/>
+<a href="group__mdns.html#gab1e989a4c7305d754377c76052474beb"/>
 <a href="group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec"/>
-<a href="group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9"/>
+<a href="group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725"/>
+<a href="group__mdns.html#gaee5b489b77b74511517d41f7609ccd49"/>
 <a href="group__mdns__opts.html"/>
+<a href="group__mdns__opts.html#ga0f0adf7b1d742b4ea818c1b7f6b0c547"/>
 <a href="group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396"/>
+<a href="group__mdns__opts.html#ga17a9884af8169cf19d57d8005fc3d95e"/>
 <a href="group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9"/>
+<a href="group__mdns__opts.html#ga7f6853d01ad32eb6ce99ae55307a37d9"/>
 <a href="group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6"/>
+<a href="group__mdns__opts.html#ga827d1d2abd24a26638723cfd0a8b9efd"/>
+<a href="group__mdns__opts.html#gaaf489604dcdf94d2adcd723f6c7d7163"/>
 <a href="group__mempool.html"/>
 <a href="group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb"/>
 <a href="group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a"/>
@@ -1800,7 +1880,7 @@
 <a href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62"/>
 <a href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a"/>
 <a href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17"/>
-<a href="group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f"/>
+<a href="group__mqtt.html#ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f"/>
 <a href="group__mqtt__opts.html"/>
 <a href="group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e"/>
 <a href="group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a"/>
@@ -1870,6 +1950,7 @@
 <a href="group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716"/>
 <a href="group__netif.html#ga22055759a25f5d6cea7e7deab0a07434"/>
 <a href="group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce"/>
+<a href="group__netif.html#ga3428b3f8195249c6cd8704a4db46b401"/>
 <a href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db"/>
 <a href="group__netif.html#ga3c82d1c742338828b2f4349a75bb84de"/>
 <a href="group__netif.html#ga3efc2b72f75936d50708247420c9d1d9"/>
@@ -1877,6 +1958,7 @@
 <a href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf"/>
 <a href="group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2"/>
 <a href="group__netif.html#ga94a4c24c988afc0a577387730f303b19"/>
+<a href="group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c"/>
 <a href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979"/>
 <a href="group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a"/>
 <a href="group__netif.html#gab2b9387389513a02027c62e246723808"/>
@@ -1946,6 +2028,9 @@
 <a href="group__netif__mib2.html#gga15378b8dcd2a9dc2985142d864a767baaf4eea12db1ba265c5b4f23df309e7e03"/>
 <a href="group__netif__mib2.html#gga15378b8dcd2a9dc2985142d864a767baafb17d1023c5711097b13ccabf6ed9299"/>
 <a href="group__netifapi.html"/>
+<a href="group__netifapi__arp.html"/>
+<a href="group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8"/>
+<a href="group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119"/>
 <a href="group__netifapi__autoip.html"/>
 <a href="group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2"/>
 <a href="group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d"/>
@@ -2022,8 +2107,8 @@
 <a href="group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0"/>
 <a href="group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e"/>
 <a href="group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde"/>
-<a href="group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d"/>
-<a href="group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c"/>
+<a href="group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f"/>
+<a href="group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4"/>
 <a href="group__sequential__api.html"/>
 <a href="group__sixlowpan.html"/>
 <a href="group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7"/>
@@ -2061,6 +2146,7 @@
 <a href="group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8"/>
 <a href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21"/>
 <a href="group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1"/>
+<a href="group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838"/>
 <a href="group__snmp__core.html#ga341461766863cff46a44e5f431f2da01"/>
 <a href="group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5"/>
 <a href="group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8"/>
@@ -2105,18 +2191,24 @@
 <a href="group__snmp__traps.html"/>
 <a href="group__snmp__traps.html#ga0e044259289cb690197173f93c17607d"/>
 <a href="group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86"/>
+<a href="group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c"/>
 <a href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760"/>
 <a href="group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba"/>
 <a href="group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1"/>
+<a href="group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455"/>
+<a href="group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210"/>
 <a href="group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7"/>
-<a href="group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd"/>
 <a href="group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be"/>
 <a href="group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32"/>
+<a href="group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275"/>
 <a href="group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c"/>
+<a href="group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692"/>
 <a href="group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee"/>
+<a href="group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359"/>
 <a href="group__sntp.html"/>
 <a href="group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5"/>
 <a href="group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a"/>
+<a href="group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e"/>
 <a href="group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488"/>
 <a href="group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba"/>
 <a href="group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120"/>
@@ -2169,6 +2261,7 @@
 <a href="group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a"/>
 <a href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a"/>
 <a href="group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e"/>
+<a href="group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa"/>
 <a href="group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284"/>
 <a href="group__sys__os.html"/>
 <a href="group__sys__prot.html"/>
@@ -2187,6 +2280,7 @@
 <a href="group__tcp__raw.html"/>
 <a href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f"/>
 <a href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808"/>
+<a href="group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc"/>
 <a href="group__tcp__raw.html#ga2e00c668b99d92113cd595647702be83"/>
 <a href="group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8"/>
 <a href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61"/>
@@ -2207,12 +2301,13 @@
 <a href="group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5"/>
 <a href="group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62"/>
 <a href="group__tcp__raw__extargs.html"/>
-<a href="group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316"/>
 <a href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616"/>
-<a href="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318"/>
-<a href="group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855"/>
+<a href="group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56"/>
+<a href="group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5"/>
+<a href="group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e"/>
 <a href="group__tftp.html"/>
-<a href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3"/>
+<a href="group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40"/>
+<a href="group__tftp.html#gaa6b743a64287206acb825bd60448e5f8"/>
 <a href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec"/>
 <a href="group__tftp__opts.html"/>
 <a href="group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981"/>
@@ -2356,10 +2451,12 @@
 <a href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e"/>
 <a href="ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051"/>
 <a href="ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974"/>
+<a href="ip4__addr_8h.html#a59494c562c62fdf62a6c9c6a66a50fb3"/>
 <a href="ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c"/>
 <a href="ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e"/>
 <a href="ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9"/>
 <a href="ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a"/>
+<a href="ip4__addr_8h.html#a95d05df9201602fc873a97fb61fd1134"/>
 <a href="ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea"/>
 <a href="ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421"/>
 <a href="ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071"/>
@@ -2414,7 +2511,11 @@
 <a href="ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b"/>
 <a href="ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2"/>
 <a href="ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073"/>
+<a href="ip6__addr_8h.html#a811d8a2aa6417ae22a7a46b27d9ead26"/>
 <a href="ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921"/>
+<a href="ip6__addr_8h.html#a9a983c7d613ab45e37aaf66c067a0c7a"/>
+<a href="ip6__addr_8h.html#a9ea0b6b837baff1e1e62cccd4f17d50e"/>
+<a href="ip6__addr_8h.html#aa324ac65d537997ebaaed78bd40f6da9"/>
 <a href="ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad"/>
 <a href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762"/>
 <a href="ip6__addr_8h.html#ab153e5b58a5674e5e1bacdbbc0934c44"/>
@@ -2428,6 +2529,7 @@
 <a href="ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1"/>
 <a href="ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4"/>
 <a href="ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c"/>
+<a href="ip6__addr_8h.html#afc9d2b8d0a05f2ff23ab3b7fd3bf8229"/>
 <a href="ip6__frag_8c.html"/>
 <a href="ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37"/>
 <a href="ip6__frag_8c.html#a510934accf149433bdcf683993e79080"/>
@@ -2505,8 +2607,10 @@
 <a href="lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15"/>
 <a href="lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6"/>
 <a href="lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26"/>
+<a href="lwip_2etharp_8h.html#a7c41ba8b145fa4d06f8d6af3df44c4ff"/>
 <a href="lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e"/>
 <a href="lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37"/>
+<a href="lwip_2etharp_8h.html#aac7d5048a81ef1c63b18d769700f4899"/>
 <a href="lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8"/>
 <a href="lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c"/>
 <a href="lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05"/>
@@ -2553,20 +2657,85 @@
 <a href="lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d"/>
 <a href="mdns_8c.html"/>
 <a href="mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1"/>
-<a href="mdns_8c.html#a17db69fa887515374452b945e959bbf9"/>
-<a href="mdns_8c.html#a52d8f70432ae998814f16b18431213cd"/>
-<a href="mdns_8c.html#ab5f49d9356a76879e0e6a14eb0643b23"/>
-<a href="mdns_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e"/>
+<a href="mdns_8c.html#a482d6bf710af4424b71ee57034edbdbe"/>
+<a href="mdns_8c.html#aa31b798a5fb96b6ef0dde5d4f32371af"/>
+<a href="mdns_8c.html#af15fa5b6331bec605f68f53cb87f58fa"/>
+<a href="mdns_8c.html#af24e590bf9c225a2efc0b55fac14809d"/>
 <a href="mdns_8h.html"/>
 <a href="mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1"/>
-<a href="mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536"/>
 <a href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83"/>
+<a href="mdns_8h.html#a6d658e2c5228b224b89488663d2b72f7"/>
+<a href="mdns__domain_8c.html"/>
+<a href="mdns__domain_8c.html#a0aff096695eebacb2668d2762722860c"/>
+<a href="mdns__domain_8c.html#a17db69fa887515374452b945e959bbf9"/>
+<a href="mdns__domain_8c.html#a191d9b70a66083f40aaa022c2ed88b12"/>
+<a href="mdns__domain_8c.html#a29ddb0a6ba0edcf34104ec1f6322968b"/>
+<a href="mdns__domain_8c.html#a52d8f70432ae998814f16b18431213cd"/>
+<a href="mdns__domain_8c.html#a642449cbf0074f1a2504e72158e75859"/>
+<a href="mdns__domain_8c.html#a7221cb1a83ed6dcfb3a2b1365154b43d"/>
+<a href="mdns__domain_8c.html#a7485d75976b73354668a5a54bc8658ed"/>
+<a href="mdns__domain_8c.html#a92de54d2f384a4e4ffa85e529cc05411"/>
+<a href="mdns__domain_8c.html#a9cde39039e0e1e21b4851d840d733926"/>
+<a href="mdns__domain_8c.html#ab5f49d9356a76879e0e6a14eb0643b23"/>
+<a href="mdns__domain_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e"/>
+<a href="mdns__domain_8c.html#ac2d8951e2435f93fdc889f6a71e0c8a6"/>
+<a href="mdns__domain_8c.html#af228d1cf8d779c714a016702db095db6"/>
+<a href="mdns__domain_8h.html"/>
+<a href="mdns__domain_8h.html#a0aff096695eebacb2668d2762722860c"/>
+<a href="mdns__domain_8h.html#a17db69fa887515374452b945e959bbf9"/>
+<a href="mdns__domain_8h.html#a191d9b70a66083f40aaa022c2ed88b12"/>
+<a href="mdns__domain_8h.html#a29ddb0a6ba0edcf34104ec1f6322968b"/>
+<a href="mdns__domain_8h.html#a52d8f70432ae998814f16b18431213cd"/>
+<a href="mdns__domain_8h.html#a642449cbf0074f1a2504e72158e75859"/>
+<a href="mdns__domain_8h.html#a7221cb1a83ed6dcfb3a2b1365154b43d"/>
+<a href="mdns__domain_8h.html#a7485d75976b73354668a5a54bc8658ed"/>
+<a href="mdns__domain_8h.html#a92de54d2f384a4e4ffa85e529cc05411"/>
+<a href="mdns__domain_8h.html#a9cde39039e0e1e21b4851d840d733926"/>
+<a href="mdns__domain_8h.html#ab5f49d9356a76879e0e6a14eb0643b23"/>
+<a href="mdns__domain_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e"/>
+<a href="mdns__domain_8h.html#ac2d8951e2435f93fdc889f6a71e0c8a6"/>
+<a href="mdns__domain_8h.html#af228d1cf8d779c714a016702db095db6"/>
 <a href="mdns__opts_8h.html"/>
+<a href="mdns__out_8c.html"/>
+<a href="mdns__out_8c.html#a10f6f22640ac837a233bf43334dfb02a"/>
+<a href="mdns__out_8c.html#a1f7dc9536f124263573518e6e8e1a162"/>
+<a href="mdns__out_8c.html#a2713348b1b314d5e880442f2c130e1dc"/>
+<a href="mdns__out_8c.html#a2b7a721b19fa33813133bc97f503c199"/>
+<a href="mdns__out_8c.html#a2dd35cb1e1fae888c05c2b7f8bd717cc"/>
+<a href="mdns__out_8c.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f"/>
+<a href="mdns__out_8c.html#a5a051eb81d6bd37365973d1215af23ba"/>
+<a href="mdns__out_8c.html#a5de741fd85c3675e3d2161727dd9a220"/>
+<a href="mdns__out_8c.html#a6195808be1840daa8a100b5954a30cfe"/>
+<a href="mdns__out_8c.html#a790ea0aba2d252f96c23748ea0c033a7"/>
+<a href="mdns__out_8c.html#a7b637b6f41976f35f7b48e7f2904829b"/>
+<a href="mdns__out_8c.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f"/>
+<a href="mdns__out_8c.html#acbf59dca94f241c1b58c7df1ec4b85e1"/>
+<a href="mdns__out_8c.html#add64c83f753842f2ceb40079217c66a1"/>
+<a href="mdns__out_8c.html#ae4a0ae6a039210f60f666999f9b807f7"/>
+<a href="mdns__out_8c.html#ae8c9d2bd89d6ca7e8668ba708925d2e8"/>
+<a href="mdns__out_8c.html#af3e118eb80760a958265f6a4c59b2e49"/>
+<a href="mdns__out_8h.html"/>
+<a href="mdns__out_8h.html#a10f6f22640ac837a233bf43334dfb02a"/>
+<a href="mdns__out_8h.html#a1f7dc9536f124263573518e6e8e1a162"/>
+<a href="mdns__out_8h.html#a2713348b1b314d5e880442f2c130e1dc"/>
+<a href="mdns__out_8h.html#a2b7a721b19fa33813133bc97f503c199"/>
+<a href="mdns__out_8h.html#a2dd35cb1e1fae888c05c2b7f8bd717cc"/>
+<a href="mdns__out_8h.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f"/>
+<a href="mdns__out_8h.html#a5a051eb81d6bd37365973d1215af23ba"/>
+<a href="mdns__out_8h.html#a5de741fd85c3675e3d2161727dd9a220"/>
+<a href="mdns__out_8h.html#a6195808be1840daa8a100b5954a30cfe"/>
+<a href="mdns__out_8h.html#a790ea0aba2d252f96c23748ea0c033a7"/>
+<a href="mdns__out_8h.html#a7b637b6f41976f35f7b48e7f2904829b"/>
+<a href="mdns__out_8h.html#ab3297d69b0effb5eb01a9b8c5a708ea9"/>
+<a href="mdns__out_8h.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f"/>
+<a href="mdns__out_8h.html#acbf59dca94f241c1b58c7df1ec4b85e1"/>
+<a href="mdns__out_8h.html#add64c83f753842f2ceb40079217c66a1"/>
+<a href="mdns__out_8h.html#ae4a0ae6a039210f60f666999f9b807f7"/>
+<a href="mdns__out_8h.html#ae8c9d2bd89d6ca7e8668ba708925d2e8"/>
+<a href="mdns__out_8h.html#af3e118eb80760a958265f6a4c59b2e49"/>
 <a href="mdns__priv_8h.html"/>
-<a href="mdns__priv_8h.html#a17db69fa887515374452b945e959bbf9"/>
-<a href="mdns__priv_8h.html#a52d8f70432ae998814f16b18431213cd"/>
-<a href="mdns__priv_8h.html#ab5f49d9356a76879e0e6a14eb0643b23"/>
-<a href="mdns__priv_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e"/>
+<a href="mdns__priv_8h.html#aa31b798a5fb96b6ef0dde5d4f32371af"/>
+<a href="mdns__priv_8h.html#af15fa5b6331bec605f68f53cb87f58fa"/>
 <a href="mem_8c.html"/>
 <a href="mem_8c.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7"/>
 <a href="mem_8c.html#a278694c2333c9826f21ddd2c2d220f66"/>
@@ -2684,7 +2853,6 @@
 <a href="netdb_8c.html#a768ab8ead892d6454709680340cd070e"/>
 <a href="netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5"/>
 <a href="netdb_8c.html#abe6a6a103a2f6fa4e13098e455ac7bb3"/>
-<a href="netdb_8c.html#acfc1e988534c0e497599b904739f92fe"/>
 <a href="netdb_8c.html#af356989c172a51187e22b557f22d4165"/>
 <a href="netdb_8c.html#afa229e90916f6c8d6308828f45351d2d"/>
 <a href="netif_2ethernet_8h.html"/>
@@ -2696,6 +2864,8 @@
 <a href="netif_8c.html#a3d0925cbce550ed461907aee816713ba"/>
 <a href="netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c"/>
 <a href="netif_8h.html"/>
+<a href="netif_8h.html#a046c4816e37c3c4b84b3634eeeea7029"/>
+<a href="netif_8h.html#a0a674553c18b429b53397372ea82fcaf"/>
 <a href="netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6"/>
 <a href="netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc"/>
 <a href="netif_8h.html#a0fbaed78253d21e1b54e65651da3e327"/>
@@ -2709,6 +2879,7 @@
 <a href="netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a"/>
 <a href="netif_8h.html#a5ad7308195c0581680dd62fb148501cd"/>
 <a href="netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2"/>
+<a href="netif_8h.html#a716576f3485524d44ef0843839ef0564"/>
 <a href="netif_8h.html#a71cad3277efe29191eef3348f4bf21f7"/>
 <a href="netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c"/>
 <a href="netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8"/>
@@ -2726,13 +2897,9 @@
 <a href="netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32"/>
 <a href="netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468"/>
 <a href="netifapi_8c.html"/>
-<a href="netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8"/>
 <a href="netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7"/>
-<a href="netifapi_8c.html#a62b0bdbb3783eb27aa73485081306119"/>
 <a href="netifapi_8h.html"/>
-<a href="netifapi_8h.html#a037c3d05c19b4d467b6ce06eb4639ee8"/>
 <a href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7"/>
-<a href="netifapi_8h.html#a62b0bdbb3783eb27aa73485081306119"/>
 <a href="opt_8h.html"/>
 <a href="optimization.html"/>
 <a href="pbuf_8c.html"/>
@@ -2777,6 +2944,7 @@
 <a href="pppol2tp_8h.html"/>
 <a href="pppos_8c.html"/>
 <a href="pppos_8h.html"/>
+<a href="prot_2acd_8h.html"/>
 <a href="prot_2autoip_8h.html"/>
 <a href="prot_2dhcp6_8h.html"/>
 <a href="prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175"/>
@@ -3060,30 +3228,40 @@
 <a href="stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d"/>
 <a href="struct__lwiperf__settings.html"/>
 <a href="struct__lwiperf__state__tcp.html"/>
+<a href="structacd.html"/>
+<a href="structacd.html#a3a03aa687716055a4f75f6e5e380e46e"/>
+<a href="structacd.html#a4ab002648d338ae33ffd3829e23703cb"/>
+<a href="structacd.html#a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb"/>
+<a href="structacd.html#a9dd4e1b82dd3e97717f011dbf862a58e"/>
+<a href="structacd.html#aa14c2b88cd471839d5b5de80bb46a9aa"/>
+<a href="structacd.html#aabde1967e37d685b19b9701af641a97c"/>
+<a href="structacd.html#ab40b6b3cf57634135753f2426207f84a"/>
+<a href="structacd.html#af2c795ee5b09085bca592d830a388448"/>
+<a href="structaltcp__allocator__s.html"/>
+<a href="structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1"/>
+<a href="structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687"/>
 <a href="structapi__msg.html"/>
-<a href="structapi__msg.html#a01eaa41b1bbdc92e78ba3712d28cb613"/>
+<a href="structapi__msg.html#a0abfc9bda0b00554628bc3169d8f21bf"/>
+<a href="structapi__msg.html#a1831a18bdfe88ca89a773fc477966894"/>
 <a href="structapi__msg.html#a1ceb9822ba49ba439e30d98492593612"/>
 <a href="structapi__msg.html#a40624c398d1939bfee54bffa708a363e"/>
-<a href="structapi__msg.html#a46007ce4f08d3e396f068ab80c9a9ae1"/>
 <a href="structapi__msg.html#a4bd9382dd42b18120803e246a0203353"/>
-<a href="structapi__msg.html#a50e8d6dfa0ba30ae7e39c336bf68742c"/>
-<a href="structapi__msg.html#a5aa22dbd74fd7ba2fa5eb8bc8aae529f"/>
 <a href="structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444"/>
-<a href="structapi__msg.html#a87ce87e5931c8f748293946d3b250791"/>
+<a href="structapi__msg.html#a718b0166a9956c608188e8f99c663203"/>
+<a href="structapi__msg.html#a7c67466a08e96f57f5cc8a41beb883b3"/>
+<a href="structapi__msg.html#a8644758cd55e0891e43717711ae7b03b"/>
 <a href="structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f"/>
-<a href="structapi__msg.html#aa3d64205c25e953b168447e6aa21ee9e"/>
+<a href="structapi__msg.html#a8e600d95eb044f8f7dc9ff921aaa05b1"/>
+<a href="structapi__msg.html#a9b0c707835838c2ffe55b85c2902d7ad"/>
 <a href="structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05"/>
 <a href="structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2"/>
 <a href="structapi__msg.html#abec5e33802d69f1b601543d60699f028"/>
-<a href="structapi__msg.html#ac0637c6f4dbb3f64f95d5181d55e663c"/>
-<a href="structapi__msg.html#af9817721045b7ebe98ad484730e5e9cc"/>
+<a href="structapi__msg.html#adbb33e03089db527b0af7e4b22f04e1c"/>
 <a href="structautoip.html"/>
 <a href="structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7"/>
-<a href="structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55"/>
+<a href="structautoip.html#a1965250cda881d229e2a1fe146a0bb9e"/>
 <a href="structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853"/>
 <a href="structautoip.html#a51af55190548e378e310aeaddfa1fdef"/>
-<a href="structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf"/>
-<a href="structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25"/>
 <a href="structbridgeif__initdata__s.html"/>
 <a href="structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f"/>
 <a href="structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6"/>
@@ -3111,6 +3289,7 @@
 <a href="structicmp6__echo__hdr.html"/>
 <a href="structicmp6__hdr.html"/>
 <a href="structicmp__echo__hdr.html"/>
+<a href="structicmp__hdr.html"/>
 <a href="structieee__802154__hdr.html"/>
 <a href="structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10"/>
 <a href="structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869"/>
@@ -3177,42 +3356,69 @@
 <a href="structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1"/>
 <a href="structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38"/>
 <a href="structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a"/>
+<a href="structmdns__delayed__msg.html"/>
+<a href="structmdns__delayed__msg.html#a5ca9fccc523b7820f8e67c9ccf921da8"/>
+<a href="structmdns__delayed__msg.html#a641abcf692a99e2c969048432b3c6adf"/>
+<a href="structmdns__delayed__msg.html#a6c7e581f1cf67daf039ffcaa31580e60"/>
+<a href="structmdns__delayed__msg.html#a6f2ed8a51e6e249c3c72c3e31f23d20b"/>
+<a href="structmdns__delayed__msg.html#a7052387506ef48b1db099c48f4ec5736"/>
+<a href="structmdns__delayed__msg.html#abd5210624394fece45e57e16da85a47d"/>
+<a href="structmdns__delayed__msg.html#acaa15e086356be60b2a1bdd8fcc17edd"/>
 <a href="structmdns__host.html"/>
-<a href="structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b"/>
+<a href="structmdns__host.html#a002e836a1888c7df4cf2b775c7fae557"/>
+<a href="structmdns__host.html#a07aadf9f308eee16a99041635df38123"/>
+<a href="structmdns__host.html#a16016021ddabb1dc182f36c7185bf283"/>
+<a href="structmdns__host.html#a2ed51b16771590917e0eef5cf25ada71"/>
 <a href="structmdns__host.html#a560447b364854eb5480e137e09d3cd24"/>
 <a href="structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed"/>
-<a href="structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922"/>
-<a href="structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61"/>
+<a href="structmdns__host.html#a9c09b5c58b3db64f78ce8eeb14952bea"/>
+<a href="structmdns__host.html#a9d0df33231cd8b50e25aa1fa4ebdc291"/>
+<a href="structmdns__host.html#ab1ca90b282a4a6511fa87408b946f49a"/>
+<a href="structmdns__host.html#ab5099b1bfe27698f6cc7ac36a80111a0"/>
+<a href="structmdns__outmsg.html"/>
+<a href="structmdns__outmsg.html#a187774c17294968998b6f12bb5834cd0"/>
+<a href="structmdns__outmsg.html#a1d2d5f1d5d366f31d65ca18a239bfd4e"/>
+<a href="structmdns__outmsg.html#a3f6810fb1f2a989afcbc2fd852a20386"/>
+<a href="structmdns__outmsg.html#a4a3ee99f7c25e88f17ea912897617aa0"/>
+<a href="structmdns__outmsg.html#a8118f6c263f6f8727552620deac2b7c2"/>
+<a href="structmdns__outmsg.html#a8abcd5b3e04c16a75752b36cf613ac6f"/>
+<a href="structmdns__outmsg.html#aab2d5c566dcd83874d9cc77cd5fc7253"/>
+<a href="structmdns__outmsg.html#ab46f1589681a1abe826e8f6c58d10f1a"/>
 <a href="structmdns__outpacket.html"/>
 <a href="structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c"/>
 <a href="structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035"/>
-<a href="structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4"/>
-<a href="structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d"/>
 <a href="structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9"/>
 <a href="structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5"/>
-<a href="structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195"/>
 <a href="structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad"/>
-<a href="structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348"/>
 <a href="structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce"/>
-<a href="structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430"/>
 <a href="structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f"/>
-<a href="structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65"/>
 <a href="structmdns__packet.html"/>
+<a href="structmdns__packet.html#a01f2cd644ceda020d639290fe1c3ea1c"/>
 <a href="structmdns__packet.html#a09211e78f7f773c492b5856d31423699"/>
 <a href="structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00"/>
+<a href="structmdns__packet.html#a1ff4547d0866f338d1c58fc1dadf43f1"/>
 <a href="structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45"/>
 <a href="structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68"/>
 <a href="structmdns__packet.html#a56ba495a1458a21982e65d746468849d"/>
 <a href="structmdns__packet.html#a8659b4f582be0df84b6ae91308737377"/>
 <a href="structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7"/>
 <a href="structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a"/>
-<a href="structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989"/>
+<a href="structmdns__packet.html#ab7d1d004dcac3cb6761241c5fe58b0ab"/>
+<a href="structmdns__packet.html#ac47f5a84c173a1565c69673536537c89"/>
+<a href="structmdns__packet.html#ade926269f6b1de2e51ee92a703068445"/>
+<a href="structmdns__packet.html#afdb78218c1775073762d9560986c119b"/>
 <a href="structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437"/>
+<a href="structmdns__request.html"/>
+<a href="structmdns__request.html#a1080b561c8dcb322fb2af64217b13f64"/>
+<a href="structmdns__request.html#a3ed18dad500125e0d63274c797bd52f5"/>
+<a href="structmdns__request.html#a497e1b8f664dab9904a89e5f15f5bc60"/>
+<a href="structmdns__request.html#a4cc8a4e62ce71bc33f1e7cb24b198c1d"/>
+<a href="structmdns__request.html#a5a9261362213a1a790a0b3451916f669"/>
+<a href="structmdns__request.html#aace6ab8b7de73d61d02711f26de7b751"/>
 <a href="structmdns__rr__info.html"/>
 <a href="structmdns__service.html"/>
 <a href="structmdns__service.html#a35daff90a18d19b14f23fa02df424f94"/>
 <a href="structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad"/>
-<a href="structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14"/>
 <a href="structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c"/>
 <a href="structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d"/>
 <a href="structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c"/>
@@ -3310,7 +3516,6 @@
 <a href="structnetconn.html#a9b59188f300828d2b5814e27ab27cad0"/>
 <a href="structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da"/>
 <a href="structnetconn.html#abe796060bb06e585333ca9a87862b624"/>
-<a href="structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36"/>
 <a href="structnetconn.html#ad08c5613a3a6fa9fe569b4acf30973f8"/>
 <a href="structnetif.html"/>
 <a href="structnetif.html#a1513e81d02557d2a950e965f18b53a45"/>
@@ -3499,6 +3704,7 @@
 <a href="structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34"/>
 <a href="structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987"/>
 <a href="structtftp__context.html"/>
+<a href="structtftp__context.html#a39cbb84a9c0eaa8ea62d183ba8214519"/>
 <a href="structtftp__context.html#a65d6359e2aac571813c05c61676c01a1"/>
 <a href="structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c"/>
 <a href="structtftp__context.html#a9e6e4ec803ec9597822923369701754d"/>
@@ -3539,7 +3745,6 @@
 <a href="tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3"/>
 <a href="tcp_8c.html#a0cb3f604fc8d20870d8cab291da5701c"/>
 <a href="tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8"/>
-<a href="tcp_8c.html#a2c4234f1e95b6bde0e84d4ea97ae95bc"/>
 <a href="tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb"/>
 <a href="tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c"/>
 <a href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905"/>
@@ -3565,7 +3770,6 @@
 <a href="tcp_8h.html#a00517abce6856d6c82f0efebdafb734d"/>
 <a href="tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55"/>
 <a href="tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd"/>
-<a href="tcp_8h.html#a2c4234f1e95b6bde0e84d4ea97ae95bc"/>
 <a href="tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073"/>
 <a href="tcp_8h.html#a780cfac08b02c66948ab94ea974202e8"/>
 <a href="tcp_8h.html#a874630045102fc5f1442704a790c8bb8"/>
@@ -3580,6 +3784,7 @@
 <a href="tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39"/>
 <a href="tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b"/>
 <a href="tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6"/>
+<a href="tcp__out_8c.html#a7cf7cbc5aa473de8116dc9f00cbc5d57"/>
 <a href="tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4"/>
 <a href="tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129"/>
 <a href="tcp__out_8c.html#aa7d5d552647d567095876aab202bfd1a"/>
@@ -3609,6 +3814,7 @@
 <a href="tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6"/>
 <a href="tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d"/>
 <a href="tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911"/>
+<a href="tcp__priv_8h.html#a7cf7cbc5aa473de8116dc9f00cbc5d57"/>
 <a href="tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249"/>
 <a href="tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4"/>
 <a href="tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81"/>
@@ -3641,6 +3847,7 @@
 <a href="tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08"/>
 <a href="tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c"/>
 <a href="tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c"/>
+<a href="tcpip_8c.html#a8d8a2ac0271def71a4ca31b24a31228f"/>
 <a href="tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102"/>
 <a href="tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d"/>
 <a href="tcpip_8h.html"/>
@@ -3649,14 +3856,19 @@
 <a href="tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c"/>
 <a href="tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c"/>
 <a href="tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992"/>
+<a href="tcpip_8h.html#a8d8a2ac0271def71a4ca31b24a31228f"/>
 <a href="tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d"/>
 <a href="tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102"/>
 <a href="tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d"/>
 <a href="tcpip__priv_8h.html"/>
 <a href="tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d"/>
 <a href="tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08"/>
+<a href="tftp_8c.html"/>
+<a href="tftp_8c.html#a5c6cf3de84a0dc990c055d66e574ca70"/>
+<a href="tftp__client_8h.html"/>
+<a href="tftp__common_8h.html"/>
+<a href="tftp__common_8h.html#a5c6cf3de84a0dc990c055d66e574ca70"/>
 <a href="tftp__opts_8h.html"/>
-<a href="tftp__server_8c.html"/>
 <a href="tftp__server_8h.html"/>
 <a href="timeouts_8c.html"/>
 <a href="timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c"/>
diff --git a/doc/doxygen/output/html/err_8c.html b/doc/doxygen/output/html/err_8c.html
index 983564b..e0faccf 100644
--- a/doc/doxygen/output/html/err_8c.html
+++ b/doc/doxygen/output/html/err_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/err_8h.html b/doc/doxygen/output/html/err_8h.html
index 2fc7e0c..0871f72 100644
--- a/doc/doxygen/output/html/err_8h.html
+++ b/doc/doxygen/output/html/err_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/etharp_8c.html b/doc/doxygen/output/html/etharp_8c.html
index 607a4b1..91fe919 100644
--- a/doc/doxygen/output/html/etharp_8c.html
+++ b/doc/doxygen/output/html/etharp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -110,6 +110,7 @@
 <code>#include &quot;<a class="el" href="snmp_8h.html">lwip/snmp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="dhcp_8h.html">lwip/dhcp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="autoip_8h.html">lwip/autoip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="acd_8h.html">lwip/acd.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="netif_2ethernet_8h.html">netif/ethernet.h</a>&quot;</code><br />
 <code>#include &lt;string.h&gt;</code><br />
@@ -147,11 +148,15 @@
 <tr class="separator:ae180772e31346a0afeb707ad172dd19c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a3e56faced96841e615f88dd57d1b2b15" id="r_a3e56faced96841e615f88dd57d1b2b15"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a3e56faced96841e615f88dd57d1b2b15">etharp_request</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr)</td></tr>
 <tr class="separator:a3e56faced96841e615f88dd57d1b2b15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac7d5048a81ef1c63b18d769700f4899" id="r_aac7d5048a81ef1c63b18d769700f4899"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aac7d5048a81ef1c63b18d769700f4899">etharp_acd_probe</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:aac7d5048a81ef1c63b18d769700f4899"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c41ba8b145fa4d06f8d6af3df44c4ff" id="r_a7c41ba8b145fa4d06f8d6af3df44c4ff"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7c41ba8b145fa4d06f8d6af3df44c4ff">etharp_acd_announce</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:a7c41ba8b145fa4d06f8d6af3df44c4ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Address Resolution Protocol module for IP over Ethernet</p>
 <p>Functionally, ARP is divided into two parts. The first maps an IP address to a physical address when sending a packet, and the second part answers requests from other machines for our physical address.</p>
-<p>This implementation complies with RFC 826 (Ethernet ARP). It supports Gratuitious ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6 if an interface calls <a class="el" href="lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e">etharp_gratuitous(our_netif)</a> upon address change. </p>
+<p>This implementation complies with RFC 826 (Ethernet ARP). It supports Gratuitous ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6 if an interface calls <a class="el" href="lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e">etharp_gratuitous(our_netif)</a> upon address change. </p>
 </div><h2 class="groupheader">Macro Definition Documentation</h2>
 <a id="ac71515a6f140b25de49e9bf432b2bb2a" name="ac71515a6f140b25de49e9bf432b2bb2a"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ac71515a6f140b25de49e9bf432b2bb2a">&#9670;&#160;</a></span>ARP_AGE_REREQUEST_USED_UNICAST</h2>
@@ -215,6 +220,66 @@
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
+<a id="a7c41ba8b145fa4d06f8d6af3df44c4ff" name="a7c41ba8b145fa4d06f8d6af3df44c4ff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7c41ba8b145fa4d06f8d6af3df44c4ff">&#9670;&#160;</a></span>etharp_acd_announce()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> etharp_acd_announce </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ARP request packet announcing an ipaddr. Used to send announce messages for address conflict detection.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the lwip network interface on which to send the request </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>the IP address to announce </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the request has been sent ERR_MEM if the ARP packet couldn't be allocated any other err_t on failure </dd></dl>
+
+</div>
+</div>
+<a id="aac7d5048a81ef1c63b18d769700f4899" name="aac7d5048a81ef1c63b18d769700f4899"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aac7d5048a81ef1c63b18d769700f4899">&#9670;&#160;</a></span>etharp_acd_probe()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> etharp_acd_probe </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ARP request packet probing for an ipaddr. Used to send probe messages for address conflict detection.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the lwip network interface on which to send the request </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>the IP address to probe </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the request has been sent ERR_MEM if the ARP packet couldn't be allocated any other err_t on failure </dd></dl>
+
+</div>
+</div>
 <a id="ae94677a2a5f3698276027c7475f6ca05" name="ae94677a2a5f3698276027c7475f6ca05"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ae94677a2a5f3698276027c7475f6ca05">&#9670;&#160;</a></span>etharp_cleanup_netif()</h2>
 
diff --git a/doc/doxygen/output/html/etharp_8c.js b/doc/doxygen/output/html/etharp_8c.js
index 51ea008..fa4a64d 100644
--- a/doc/doxygen/output/html/etharp_8c.js
+++ b/doc/doxygen/output/html/etharp_8c.js
@@ -4,6 +4,8 @@
     [ "ARP_MAXPENDING", "etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9", null ],
     [ "ETHARP_FLAG_TRY_HARD", "etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9", null ],
     [ "etharp_state", "etharp_8c.html#ae95dee9363e6d3417298e07380b2d383", null ],
+    [ "etharp_acd_announce", "etharp_8c.html#a7c41ba8b145fa4d06f8d6af3df44c4ff", null ],
+    [ "etharp_acd_probe", "etharp_8c.html#aac7d5048a81ef1c63b18d769700f4899", null ],
     [ "etharp_cleanup_netif", "etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05", null ],
     [ "etharp_find_addr", "etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c", null ],
     [ "etharp_get_entry", "etharp_8c.html#ab93df7ccb26496100d45137541e863c8", null ],
diff --git a/doc/doxygen/output/html/ethernet_8c.html b/doc/doxygen/output/html/ethernet_8c.html
index 657b4b6..92cb488 100644
--- a/doc/doxygen/output/html/ethernet_8c.html
+++ b/doc/doxygen/output/html/ethernet_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ethip6_8c.html b/doc/doxygen/output/html/ethip6_8c.html
index 386c98f..fc1c511 100644
--- a/doc/doxygen/output/html/ethip6_8c.html
+++ b/doc/doxygen/output/html/ethip6_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ethip6_8h.html b/doc/doxygen/output/html/ethip6_8h.html
index 12ce0e8..bd666be 100644
--- a/doc/doxygen/output/html/ethip6_8h.html
+++ b/doc/doxygen/output/html/ethip6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/files.html b/doc/doxygen/output/html/files.html
index 3f99e47..79b8b67 100644
--- a/doc/doxygen/output/html/files.html
+++ b/doc/doxygen/output/html/files.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -127,6 +127,8 @@
 <tr id="row_0_1_2_0_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwiperf_8c.html" target="_self">lwiperf.c</a></td><td class="desc"></td></tr>
 <tr id="row_0_1_3_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_3_" class="arrow" onclick="dynsection.toggleFolder('0_1_3_')">&#9658;</span><span id="img_0_1_3_" class="iconfclosed" onclick="dynsection.toggleFolder('0_1_3_')">&#160;</span><a class="el" href="dir_febe3a637907666e8b25366ae60efc0b.html" target="_self">mdns</a></td><td class="desc"></td></tr>
 <tr id="row_0_1_3_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns_8c.html" target="_self">mdns.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_3_1_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns__domain_8c.html" target="_self">mdns_domain.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_3_2_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns__out_8c.html" target="_self">mdns_out.c</a></td><td class="desc"></td></tr>
 <tr id="row_0_1_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_4_" class="arrow" onclick="dynsection.toggleFolder('0_1_4_')">&#9658;</span><span id="img_0_1_4_" class="iconfclosed" onclick="dynsection.toggleFolder('0_1_4_')">&#160;</span><a class="el" href="dir_dfacd4b005f6a743295cd1d76eff7420.html" target="_self">mqtt</a></td><td class="desc"></td></tr>
 <tr id="row_0_1_4_0_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mqtt_8c.html" target="_self">mqtt.c</a></td><td class="desc"></td></tr>
 <tr id="row_0_1_5_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_5_" class="arrow" onclick="dynsection.toggleFolder('0_1_5_')">&#9658;</span><span id="img_0_1_5_" class="iconfclosed" onclick="dynsection.toggleFolder('0_1_5_')">&#160;</span><a class="el" href="dir_56d2b6ddbb44630b0fd661af6321f9c4.html" target="_self">netbiosns</a></td><td class="desc"></td></tr>
@@ -161,17 +163,18 @@
 <tr id="row_0_1_8_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_8_" class="arrow" onclick="dynsection.toggleFolder('0_1_8_')">&#9658;</span><span id="img_0_1_8_" class="iconfclosed" onclick="dynsection.toggleFolder('0_1_8_')">&#160;</span><a class="el" href="dir_e7856a6aeaebbc124e80ad9550aedba4.html" target="_self">sntp</a></td><td class="desc"></td></tr>
 <tr id="row_0_1_8_0_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sntp_8c.html" target="_self">sntp.c</a></td><td class="desc"></td></tr>
 <tr id="row_0_1_9_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_1_9_" class="arrow" onclick="dynsection.toggleFolder('0_1_9_')">&#9658;</span><span id="img_0_1_9_" class="iconfclosed" onclick="dynsection.toggleFolder('0_1_9_')">&#160;</span><a class="el" href="dir_403e202f99dba154c685be932a8e0c34.html" target="_self">tftp</a></td><td class="desc"></td></tr>
-<tr id="row_0_1_9_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tftp__server_8c.html" target="_self">tftp_server.c</a></td><td class="desc">Trivial File Transfer Protocol (RFC 1350) </td></tr>
+<tr id="row_0_1_9_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tftp_8c.html" target="_self">tftp.c</a></td><td class="desc">Trivial File Transfer Protocol (RFC 1350) </td></tr>
 <tr id="row_0_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_2_" class="arrow" onclick="dynsection.toggleFolder('0_2_')">&#9660;</span><span id="img_0_2_" class="iconfopen" onclick="dynsection.toggleFolder('0_2_')">&#160;</span><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html" target="_self">core</a></td><td class="desc"></td></tr>
 <tr id="row_0_2_0_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_2_0_" class="arrow" onclick="dynsection.toggleFolder('0_2_0_')">&#9658;</span><span id="img_0_2_0_" class="iconfclosed" onclick="dynsection.toggleFolder('0_2_0_')">&#160;</span><a class="el" href="dir_a32e111ee6805cfc63488fd2d37f2390.html" target="_self">ipv4</a></td><td class="desc"></td></tr>
-<tr id="row_0_2_0_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="autoip_8c.html" target="_self">autoip.c</a></td><td class="desc"></td></tr>
-<tr id="row_0_2_0_1_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dhcp_8c.html" target="_self">dhcp.c</a></td><td class="desc"></td></tr>
-<tr id="row_0_2_0_2_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="etharp_8c.html" target="_self">etharp.c</a></td><td class="desc"></td></tr>
-<tr id="row_0_2_0_3_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="icmp_8c.html" target="_self">icmp.c</a></td><td class="desc"></td></tr>
-<tr id="row_0_2_0_4_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="igmp_8c.html" target="_self">igmp.c</a></td><td class="desc"></td></tr>
-<tr id="row_0_2_0_5_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4_8c.html" target="_self">ip4.c</a></td><td class="desc"></td></tr>
-<tr id="row_0_2_0_6_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4__addr_8c.html" target="_self">ip4_addr.c</a></td><td class="desc"></td></tr>
-<tr id="row_0_2_0_7_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4__frag_8c.html" target="_self">ip4_frag.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="acd_8c.html" target="_self">acd.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_1_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="autoip_8c.html" target="_self">autoip.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_2_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dhcp_8c.html" target="_self">dhcp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_3_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="etharp_8c.html" target="_self">etharp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_4_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="icmp_8c.html" target="_self">icmp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_5_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="igmp_8c.html" target="_self">igmp.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_6_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4_8c.html" target="_self">ip4.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_7_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4__addr_8c.html" target="_self">ip4_addr.c</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_8_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4__frag_8c.html" target="_self">ip4_frag.c</a></td><td class="desc"></td></tr>
 <tr id="row_0_2_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_2_1_" class="arrow" onclick="dynsection.toggleFolder('0_2_1_')">&#9658;</span><span id="img_0_2_1_" class="iconfclosed" onclick="dynsection.toggleFolder('0_2_1_')">&#160;</span><a class="el" href="dir_da9c6f43d3cd00be3de224bac907a425.html" target="_self">ipv6</a></td><td class="desc"></td></tr>
 <tr id="row_0_2_1_0_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dhcp6_8c.html" target="_self">dhcp6.c</a></td><td class="desc"></td></tr>
 <tr id="row_0_2_1_1_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ethip6_8c.html" target="_self">ethip6.c</a></td><td class="desc"></td></tr>
@@ -223,25 +226,29 @@
 <tr id="row_0_3_1_0_4_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="httpd__opts_8h.html" target="_self">httpd_opts.h</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_1_0_5_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwiperf_8h.html" target="_self">lwiperf.h</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_1_0_6_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns_8h.html" target="_self">mdns.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_7_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns__opts_8h.html" target="_self">mdns_opts.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_8_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns__priv_8h.html" target="_self">mdns_priv.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_9_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mqtt_8h.html" target="_self">mqtt.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_10_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mqtt__opts_8h.html" target="_self">mqtt_opts.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_11_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mqtt__priv_8h.html" target="_self">mqtt_priv.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_12_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netbiosns_8h.html" target="_self">netbiosns.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_13_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netbiosns__opts_8h.html" target="_self">netbiosns_opts.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_14_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="apps_2snmp_8h.html" target="_self">snmp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_15_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__core_8h.html" target="_self">snmp_core.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_16_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__mib2_8h.html" target="_self">snmp_mib2.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_17_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__opts_8h.html" target="_self">snmp_opts.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_18_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__scalar_8h.html" target="_self">snmp_scalar.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_19_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__table_8h.html" target="_self">snmp_table.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_20_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__threadsync_8h.html" target="_self">snmp_threadsync.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_21_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmpv3_8h.html" target="_self">snmpv3.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_22_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sntp_8h.html" target="_self">sntp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_23_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sntp__opts_8h.html" target="_self">sntp_opts.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_0_24_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tftp__opts_8h.html" target="_self">tftp_opts.h</a></td><td class="desc">Trivial File Transfer Protocol (RFC 1350) implementation options </td></tr>
-<tr id="row_0_3_1_0_25_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tftp__server_8h.html" target="_self">tftp_server.h</a></td><td class="desc">Trivial File Transfer Protocol (RFC 1350) </td></tr>
+<tr id="row_0_3_1_0_7_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns__domain_8h.html" target="_self">mdns_domain.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_8_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns__opts_8h.html" target="_self">mdns_opts.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_9_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns__out_8h.html" target="_self">mdns_out.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_10_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mdns__priv_8h.html" target="_self">mdns_priv.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_11_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mqtt_8h.html" target="_self">mqtt.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_12_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mqtt__opts_8h.html" target="_self">mqtt_opts.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_13_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mqtt__priv_8h.html" target="_self">mqtt_priv.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_14_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netbiosns_8h.html" target="_self">netbiosns.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_15_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netbiosns__opts_8h.html" target="_self">netbiosns_opts.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_16_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="apps_2snmp_8h.html" target="_self">snmp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_17_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__core_8h.html" target="_self">snmp_core.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_18_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__mib2_8h.html" target="_self">snmp_mib2.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_19_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__opts_8h.html" target="_self">snmp_opts.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_20_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__scalar_8h.html" target="_self">snmp_scalar.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_21_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__table_8h.html" target="_self">snmp_table.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_22_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp__threadsync_8h.html" target="_self">snmp_threadsync.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_23_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmpv3_8h.html" target="_self">snmpv3.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_24_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sntp_8h.html" target="_self">sntp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_25_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sntp__opts_8h.html" target="_self">sntp_opts.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_26_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tftp__client_8h.html" target="_self">tftp_client.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_0_27_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tftp__common_8h.html" target="_self">tftp_common.h</a></td><td class="desc">Trivial File Transfer Protocol (RFC 1350) </td></tr>
+<tr id="row_0_3_1_0_28_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tftp__opts_8h.html" target="_self">tftp_opts.h</a></td><td class="desc">Trivial File Transfer Protocol (RFC 1350) implementation options </td></tr>
+<tr id="row_0_3_1_0_29_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tftp__server_8h.html" target="_self">tftp_server.h</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_1_1_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_3_1_1_" class="arrow" onclick="dynsection.toggleFolder('0_3_1_1_')">&#9658;</span><span id="img_0_3_1_1_" class="iconfclosed" onclick="dynsection.toggleFolder('0_3_1_1_')">&#160;</span><a class="el" href="dir_460c501b2432fc107adcb38111835e48.html" target="_self">priv</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_1_1_0_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp__priv_8h.html" target="_self">altcp_priv.h</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_1_1_1_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="api__msg_8h.html" target="_self">api_msg.h</a></td><td class="desc"></td></tr>
@@ -254,75 +261,77 @@
 <tr id="row_0_3_1_1_8_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcp__priv_8h.html" target="_self">tcp_priv.h</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_1_1_9_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcpip__priv_8h.html" target="_self">tcpip_priv.h</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_1_2_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_3_1_2_" class="arrow" onclick="dynsection.toggleFolder('0_3_1_2_')">&#9658;</span><span id="img_0_3_1_2_" class="iconfclosed" onclick="dynsection.toggleFolder('0_3_1_2_')">&#160;</span><a class="el" href="dir_fa0f2b7ac208069fc8d28c28af349d8d.html" target="_self">prot</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_0_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2autoip_8h.html" target="_self">autoip.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_1_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2dhcp_8h.html" target="_self">dhcp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_2_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2dhcp6_8h.html" target="_self">dhcp6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_3_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2dns_8h.html" target="_self">dns.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_4_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2prot_2etharp_8h.html" target="_self">etharp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_5_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2prot_2ethernet_8h.html" target="_self">ethernet.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_6_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="iana_8h.html" target="_self">iana.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_7_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2icmp_8h.html" target="_self">icmp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_8_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2icmp6_8h.html" target="_self">icmp6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_9_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ieee_8h.html" target="_self">ieee.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_10_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2igmp_8h.html" target="_self">igmp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_11_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2ip_8h.html" target="_self">ip.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_12_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2ip4_8h.html" target="_self">ip4.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_13_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2ip6_8h.html" target="_self">ip6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_14_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2mld6_8h.html" target="_self">mld6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_15_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2nd6_8h.html" target="_self">nd6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_16_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2tcp_8h.html" target="_self">tcp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_2_17_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2udp_8h.html" target="_self">udp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_3_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp_8h.html" target="_self">altcp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_4_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp__tcp_8h.html" target="_self">altcp_tcp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_5_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp__tls_8h.html" target="_self">altcp_tls.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_6_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="api_8h.html" target="_self">api.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_7_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="arch_8h.html" target="_self">arch.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_8_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="autoip_8h.html" target="_self">autoip.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_9_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="debug_8h.html" target="_self">debug.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_10_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="def_8h.html" target="_self">def.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_11_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dhcp_8h.html" target="_self">dhcp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_12_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dhcp6_8h.html" target="_self">dhcp6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_13_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dns_8h.html" target="_self">dns.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_14_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="err_8h.html" target="_self">err.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_15_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2errno_8h.html" target="_self">errno.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_16_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2etharp_8h.html" target="_self">etharp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_17_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ethip6_8h.html" target="_self">ethip6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_18_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="icmp_8h.html" target="_self">icmp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_19_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="icmp6_8h.html" target="_self">icmp6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_20_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="if__api_8h.html" target="_self">if_api.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_21_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="igmp_8h.html" target="_self">igmp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_22_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2inet_8h.html" target="_self">inet.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_23_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="inet__chksum_8h.html" target="_self">inet_chksum.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_24_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="init_8h.html" target="_self">init.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_25_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip_8h.html" target="_self">ip.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_26_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4_8h.html" target="_self">ip4.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_27_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4__addr_8h.html" target="_self">ip4_addr.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_28_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4__frag_8h.html" target="_self">ip4_frag.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_29_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip6_8h.html" target="_self">ip6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_30_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip6__addr_8h.html" target="_self">ip6_addr.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_31_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip6__frag_8h.html" target="_self">ip6_frag.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_32_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip6__zone_8h.html" target="_self">ip6_zone.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_33_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip__addr_8h.html" target="_self">ip_addr.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_34_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mem_8h.html" target="_self">mem.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_35_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="memp_8h.html" target="_self">memp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_36_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mld6_8h.html" target="_self">mld6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_37_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="nd6_8h.html" target="_self">nd6.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_38_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netbuf_8h.html" target="_self">netbuf.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_39_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2netdb_8h.html" target="_self">netdb.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_40_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netif_8h.html" target="_self">netif.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_41_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netifapi_8h.html" target="_self">netifapi.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_42_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="opt_8h.html" target="_self">opt.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_43_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="pbuf_8h.html" target="_self">pbuf.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_44_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="raw_8h.html" target="_self">raw.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_45_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp_8h.html" target="_self">snmp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_46_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sockets_8h.html" target="_self">sockets.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_47_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="stats_8h.html" target="_self">stats.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_48_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sys_8h.html" target="_self">sys.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_49_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcp_8h.html" target="_self">tcp.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_50_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcpbase_8h.html" target="_self">tcpbase.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_51_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcpip_8h.html" target="_self">tcpip.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_52_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="timeouts_8h.html" target="_self">timeouts.h</a></td><td class="desc"></td></tr>
-<tr id="row_0_3_1_53_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="udp_8h.html" target="_self">udp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_0_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2acd_8h.html" target="_self">acd.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_1_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2autoip_8h.html" target="_self">autoip.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_2_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2dhcp_8h.html" target="_self">dhcp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_3_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2dhcp6_8h.html" target="_self">dhcp6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_4_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2dns_8h.html" target="_self">dns.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_5_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2prot_2etharp_8h.html" target="_self">etharp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_6_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2prot_2ethernet_8h.html" target="_self">ethernet.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_7_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="iana_8h.html" target="_self">iana.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_8_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2icmp_8h.html" target="_self">icmp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_9_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2icmp6_8h.html" target="_self">icmp6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_10_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ieee_8h.html" target="_self">ieee.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_11_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2igmp_8h.html" target="_self">igmp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_12_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2ip_8h.html" target="_self">ip.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_13_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2ip4_8h.html" target="_self">ip4.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_14_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2ip6_8h.html" target="_self">ip6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_15_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2mld6_8h.html" target="_self">mld6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_16_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2nd6_8h.html" target="_self">nd6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_17_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2tcp_8h.html" target="_self">tcp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_2_18_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="prot_2udp_8h.html" target="_self">udp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_3_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="acd_8h.html" target="_self">acd.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_4_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp_8h.html" target="_self">altcp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_5_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp__tcp_8h.html" target="_self">altcp_tcp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_6_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="altcp__tls_8h.html" target="_self">altcp_tls.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_7_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="api_8h.html" target="_self">api.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_8_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="arch_8h.html" target="_self">arch.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_9_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="autoip_8h.html" target="_self">autoip.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_10_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="debug_8h.html" target="_self">debug.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_11_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="def_8h.html" target="_self">def.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_12_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dhcp_8h.html" target="_self">dhcp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_13_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dhcp6_8h.html" target="_self">dhcp6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_14_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dns_8h.html" target="_self">dns.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_15_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="err_8h.html" target="_self">err.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_16_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2errno_8h.html" target="_self">errno.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_17_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2etharp_8h.html" target="_self">etharp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_18_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ethip6_8h.html" target="_self">ethip6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_19_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="icmp_8h.html" target="_self">icmp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_20_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="icmp6_8h.html" target="_self">icmp6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_21_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="if__api_8h.html" target="_self">if_api.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_22_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="igmp_8h.html" target="_self">igmp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_23_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2inet_8h.html" target="_self">inet.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_24_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="inet__chksum_8h.html" target="_self">inet_chksum.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_25_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="init_8h.html" target="_self">init.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_26_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip_8h.html" target="_self">ip.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_27_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4_8h.html" target="_self">ip4.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_28_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4__addr_8h.html" target="_self">ip4_addr.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_29_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip4__frag_8h.html" target="_self">ip4_frag.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_30_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip6_8h.html" target="_self">ip6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_31_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip6__addr_8h.html" target="_self">ip6_addr.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_32_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip6__frag_8h.html" target="_self">ip6_frag.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_33_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip6__zone_8h.html" target="_self">ip6_zone.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_34_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="ip__addr_8h.html" target="_self">ip_addr.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_35_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mem_8h.html" target="_self">mem.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_36_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="memp_8h.html" target="_self">memp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_37_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="mld6_8h.html" target="_self">mld6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_38_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="nd6_8h.html" target="_self">nd6.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_39_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netbuf_8h.html" target="_self">netbuf.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_40_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="lwip_2netdb_8h.html" target="_self">netdb.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_41_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netif_8h.html" target="_self">netif.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_42_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="netifapi_8h.html" target="_self">netifapi.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_43_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="opt_8h.html" target="_self">opt.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_44_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="pbuf_8h.html" target="_self">pbuf.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_45_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="raw_8h.html" target="_self">raw.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_46_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="snmp_8h.html" target="_self">snmp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_47_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sockets_8h.html" target="_self">sockets.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_48_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="stats_8h.html" target="_self">stats.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_49_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="sys_8h.html" target="_self">sys.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_50_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcp_8h.html" target="_self">tcp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_51_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcpbase_8h.html" target="_self">tcpbase.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_52_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tcpip_8h.html" target="_self">tcpip.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_53_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="timeouts_8h.html" target="_self">timeouts.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_54_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="udp_8h.html" target="_self">udp.h</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_3_2_" class="arrow" onclick="dynsection.toggleFolder('0_3_2_')">&#9658;</span><span id="img_0_3_2_" class="iconfclosed" onclick="dynsection.toggleFolder('0_3_2_')">&#160;</span><a class="el" href="dir_c9a67764bf8a12cf6b427bb859cbcd0b.html" target="_self">netif</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_2_0_" class="odd" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_0_3_2_0_" class="arrow" onclick="dynsection.toggleFolder('0_3_2_0_')">&#9658;</span><span id="img_0_3_2_0_" class="iconfclosed" onclick="dynsection.toggleFolder('0_3_2_0_')">&#160;</span><a class="el" href="dir_439fcb6f68ea6a3dc0078b338960fd8f.html" target="_self">ppp</a></td><td class="desc"></td></tr>
 <tr id="row_0_3_2_0_0_" class="odd" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="pppol2tp_8h.html" target="_self">pppol2tp.h</a></td><td class="desc"></td></tr>
diff --git a/doc/doxygen/output/html/functions.html b/doc/doxygen/output/html/functions.html
index 1375792..de49fd3 100644
--- a/doc/doxygen/output/html/functions.html
+++ b/doc/doxygen/output/html/functions.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_a.html b/doc/doxygen/output/html/functions_a.html
index a8bea40..bc3b1a9 100644
--- a/doc/doxygen/output/html/functions_a.html
+++ b/doc/doxygen/output/html/functions_a.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,19 +102,25 @@
 <h3><a id="index_a" name="index_a"></a>- a -</h3><ul>
 <li>acceptmbox&#160;:&#160;<a class="el" href="structnetconn.html#a9b59188f300828d2b5814e27ab27cad0">netconn</a></li>
 <li>access&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c">snmp_node_instance</a></li>
-<li>ad&#160;:&#160;<a class="el" href="structapi__msg.html#af9817721045b7ebe98ad484730e5e9cc">api_msg</a></li>
-<li>additional&#160;:&#160;<a class="el" href="structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce">mdns_outpacket</a></li>
+<li>acd&#160;:&#160;<a class="el" href="structautoip.html#a1965250cda881d229e2a1fe146a0bb9e">autoip</a></li>
+<li>acd_conflict_callback&#160;:&#160;<a class="el" href="structacd.html#a3a03aa687716055a4f75f6e5e380e46e">acd</a></li>
+<li>ad&#160;:&#160;<a class="el" href="structapi__msg.html#a1831a18bdfe88ca89a773fc477966894">api_msg</a></li>
+<li>additional&#160;:&#160;<a class="el" href="structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#ab7d1d004dcac3cb6761241c5fe58b0ab">mdns_packet</a></li>
+<li>additional_left&#160;:&#160;<a class="el" href="structmdns__packet.html#ac47f5a84c173a1565c69673536537c89">mdns_packet</a></li>
 <li>addr&#160;:&#160;<a class="el" href="structdns__api__msg.html#a217814594564077d21b0f2696280b2a8">dns_api_msg</a>, <a class="el" href="structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d">zepif_init</a></li>
 <li>addr_index&#160;:&#160;<a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f">netif_ext_callback_args_t::ipv6_addr_state_changed_s</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd">netif_ext_callback_args_t::ipv6_set_s</a></li>
 <li>address&#160;:&#160;<a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17">netif_ext_callback_args_t::ipv6_addr_state_changed_s</a></li>
+<li>alloc&#160;:&#160;<a class="el" href="structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687">altcp_allocator_s</a></li>
 <li>answer_name&#160;:&#160;<a class="el" href="structnetbios__answer.html#abf746cd54add594216ddc3683c741406">netbios_answer</a></li>
 <li>answer_name_flags&#160;:&#160;<a class="el" href="structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4">netbios_answer</a></li>
 <li>answers&#160;:&#160;<a class="el" href="structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7">mdns_packet</a></li>
 <li>answers_left&#160;:&#160;<a class="el" href="structmdns__packet.html#a56ba495a1458a21982e65d746468849d">mdns_packet</a></li>
+<li>arg&#160;:&#160;<a class="el" href="structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1">altcp_allocator_s</a></li>
 <li>asn1_type&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9">snmp_node_instance</a></li>
 <li>auth_plain&#160;:&#160;<a class="el" href="structsmtp__session.html#a561389328fb1fefcb4d4d17fd0d43301">smtp_session</a></li>
 <li>auth_plain_len&#160;:&#160;<a class="el" href="structsmtp__session.html#a003dfd03ac58252b575a7c965e532461">smtp_session</a></li>
-<li>authoritative&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035">mdns_outpacket</a></li>
+<li>authoritative&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#a01f2cd644ceda020d639290fe1c3ea1c">mdns_packet</a></li>
+<li>authoritative_left&#160;:&#160;<a class="el" href="structmdns__packet.html#ade926269f6b1de2e51ee92a703068445">mdns_packet</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/functions_b.html b/doc/doxygen/output/html/functions_b.html
index 43b6cea..4805dfc 100644
--- a/doc/doxygen/output/html/functions_b.html
+++ b/doc/doxygen/output/html/functions_b.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,7 +102,7 @@
 <h3><a id="index_b" name="index_b"></a>- b -</h3><ul>
 <li>b&#160;:&#160;<a class="el" href="structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05">api_msg</a></li>
 <li>base&#160;:&#160;<a class="el" href="structmemp__desc.html#a9aec58adcbcd88167247296ca4346558">memp_desc</a></li>
-<li>bc&#160;:&#160;<a class="el" href="structapi__msg.html#a87ce87e5931c8f748293946d3b250791">api_msg</a></li>
+<li>bc&#160;:&#160;<a class="el" href="structapi__msg.html#a8e600d95eb044f8f7dc9ff921aaa05b1">api_msg</a></li>
 <li>body&#160;:&#160;<a class="el" href="structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49">smtp_session</a></li>
 <li>body_len&#160;:&#160;<a class="el" href="structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d">smtp_session</a></li>
 <li>body_sent&#160;:&#160;<a class="el" href="structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b">smtp_session</a></li>
diff --git a/doc/doxygen/output/html/functions_c.html b/doc/doxygen/output/html/functions_c.html
index c8e8eef..5fa1689 100644
--- a/doc/doxygen/output/html/functions_c.html
+++ b/doc/doxygen/output/html/functions_c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
-<li>cache_flush&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195">mdns_outpacket</a></li>
+<li>cache_flush&#160;:&#160;<a class="el" href="structmdns__outmsg.html#ab46f1589681a1abe826e8f6c58d10f1a">mdns_outmsg</a></li>
 <li>callback&#160;:&#160;<a class="el" href="structnetconn.html#abe796060bb06e585333ca9a87862b624">netconn</a></li>
 <li>callback_arg&#160;:&#160;<a class="el" href="structsmtp__session.html#af0544df7a935a092d825d8f2380f970f">smtp_session</a></li>
 <li>callback_fn&#160;:&#160;<a class="el" href="structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b">smtp_session</a></li>
@@ -110,6 +110,7 @@
 <li>client_pass&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b">mqtt_connect_client_info_t</a></li>
 <li>client_user&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5">mqtt_connect_client_info_t</a></li>
 <li>close&#160;:&#160;<a class="el" href="structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65">tftp_context</a></li>
+<li>conflict_time&#160;:&#160;<a class="el" href="structmdns__host.html#ab1ca90b282a4a6511fa87408b946f49a">mdns_host</a></li>
 <li>conn&#160;:&#160;<a class="el" href="structapi__msg.html#abec5e33802d69f1b601543d60699f028">api_msg</a>, <a class="el" href="structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4">lwip_sock</a></li>
 <li>conn_state&#160;:&#160;<a class="el" href="structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6">mqtt_client_s</a></li>
 <li>connect_arg&#160;:&#160;<a class="el" href="structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a">mqtt_client_s</a></li>
diff --git a/doc/doxygen/output/html/functions_d.html b/doc/doxygen/output/html/functions_d.html
index 96d90f6..221a370 100644
--- a/doc/doxygen/output/html/functions_d.html
+++ b/doc/doxygen/output/html/functions_d.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,12 +101,13 @@
 
 <h3><a id="index_d" name="index_d"></a>- d -</h3><ul>
 <li>data_cb&#160;:&#160;<a class="el" href="structmqtt__client__s.html#a26dc9112351c042594a41703197925a7">mqtt_client_s</a></li>
-<li>dest_addr&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4">mdns_outpacket</a></li>
+<li>delayed_msg_multicast&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a6f2ed8a51e6e249c3c72c3e31f23d20b">mdns_delayed_msg</a></li>
+<li>delayed_msg_unicast&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#acaa15e086356be60b2a1bdd8fcc17edd">mdns_delayed_msg</a></li>
+<li>dest_addr&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a187774c17294968998b6f12bb5834cd0">mdns_outmsg</a></li>
 <li>destination_address&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33">ieee_802154_hdr</a></li>
 <li>destination_pan_id&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd">ieee_802154_hdr</a></li>
 <li>destroy&#160;:&#160;<a class="el" href="structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b">tcp_ext_arg_callbacks</a></li>
 <li>dns_addrtype&#160;:&#160;<a class="el" href="structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493">dns_api_msg</a></li>
-<li>dns_ttl&#160;:&#160;<a class="el" href="structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b">mdns_host</a>, <a class="el" href="structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14">mdns_service</a></li>
 <li>domain_offsets&#160;:&#160;<a class="el" href="structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f">mdns_outpacket</a></li>
 </ul>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/functions_e.html b/doc/doxygen/output/html/functions_e.html
index b72a3ca..ac70814 100644
--- a/doc/doxygen/output/html/functions_e.html
+++ b/doc/doxygen/output/html/functions_e.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,6 +102,7 @@
 <h3><a id="index_e" name="index_e"></a>- e -</h3><ul>
 <li>err&#160;:&#160;<a class="el" href="structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f">api_msg</a>, <a class="el" href="structdns__api__msg.html#a6536d91adb146555461359bd451b30de">dns_api_msg</a></li>
 <li>errevent&#160;:&#160;<a class="el" href="structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e">lwip_sock</a></li>
+<li>error&#160;:&#160;<a class="el" href="structtftp__context.html#a39cbb84a9c0eaa8ea62d183ba8214519">tftp_context</a></li>
 <li>ethaddr&#160;:&#160;<a class="el" href="structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc">bridgeif_initdata_s</a></li>
 <li>etharp&#160;:&#160;<a class="el" href="structstats__.html#aa52547cb08dc828927494dc485bb69f3">stats_</a></li>
 <li>exceptset&#160;:&#160;<a class="el" href="structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed">lwip_select_cb</a></li>
diff --git a/doc/doxygen/output/html/functions_f.html b/doc/doxygen/output/html/functions_f.html
index 3e4ded2..d7def2f 100644
--- a/doc/doxygen/output/html/functions_f.html
+++ b/doc/doxygen/output/html/functions_f.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_f" name="index_f"></a>- f -</h3><ul>
-<li>flags&#160;:&#160;<a class="el" href="structnetconn.html#a96cb9a3830248699bd07a1a447e5630c">netconn</a>, <a class="el" href="structnetif.html#a1c171db6097bbb6f09f63549a66e00ea">netif</a>, <a class="el" href="structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a">pbuf</a></li>
+<li>flags&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a8118f6c263f6f8727552620deac2b7c2">mdns_outmsg</a>, <a class="el" href="structnetconn.html#a96cb9a3830248699bd07a1a447e5630c">netconn</a>, <a class="el" href="structnetif.html#a1c171db6097bbb6f09f63549a66e00ea">netif</a>, <a class="el" href="structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a">pbuf</a></li>
 <li>frame_control&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10">ieee_802154_hdr</a></li>
 <li>from&#160;:&#160;<a class="el" href="structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee">smtp_session</a></li>
 <li>from_len&#160;:&#160;<a class="el" href="structsmtp__session.html#a191b09e7142414a671da82fece888e65">smtp_session</a></li>
diff --git a/doc/doxygen/output/html/functions_g.html b/doc/doxygen/output/html/functions_g.html
index c1273ef..435762d 100644
--- a/doc/doxygen/output/html/functions_g.html
+++ b/doc/doxygen/output/html/functions_g.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_h.html b/doc/doxygen/output/html/functions_h.html
index df13874..fbbff01 100644
--- a/doc/doxygen/output/html/functions_h.html
+++ b/doc/doxygen/output/html/functions_h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_i.html b/doc/doxygen/output/html/functions_i.html
index 736a62f..cc4da51 100644
--- a/doc/doxygen/output/html/functions_i.html
+++ b/doc/doxygen/output/html/functions_i.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -117,6 +117,7 @@
 <li>ifoutucastpkts&#160;:&#160;<a class="el" href="structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471">stats_mib2_netif_ctrs</a></li>
 <li>igmp&#160;:&#160;<a class="el" href="structstats__.html#a877e369c2abef97f13492faa838e2271">stats_</a></li>
 <li>igmp_mac_filter&#160;:&#160;<a class="el" href="structnetif.html#ae64e56581bf0f136601f24c5395c19f0">netif</a></li>
+<li>index&#160;:&#160;<a class="el" href="structmdns__host.html#ab5099b1bfe27698f6cc7ac36a80111a0">mdns_host</a></li>
 <li>inpub_pkt_id&#160;:&#160;<a class="el" href="structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824">mqtt_client_s</a></li>
 <li>input&#160;:&#160;<a class="el" href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">netif</a></li>
 <li>instance_oid&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23">snmp_node_instance</a></li>
@@ -129,6 +130,9 @@
 <li>ip6_frag&#160;:&#160;<a class="el" href="structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf">stats_</a></li>
 <li>ip_addr&#160;:&#160;<a class="el" href="structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866">netif</a></li>
 <li>ip_frag&#160;:&#160;<a class="el" href="structstats__.html#a81fcccf03ab0d4e31423f39d0c880302">stats_</a></li>
+<li>ipaddr&#160;:&#160;<a class="el" href="structacd.html#af2c795ee5b09085bca592d830a388448">acd</a></li>
+<li>ipv4&#160;:&#160;<a class="el" href="structmdns__host.html#a9d0df33231cd8b50e25aa1fa4ebdc291">mdns_host</a></li>
+<li>ipv6&#160;:&#160;<a class="el" href="structmdns__host.html#a16016021ddabb1dc182f36c7185bf283">mdns_host</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/functions_j.html b/doc/doxygen/output/html/functions_j.html
index f4f75b4..6ccacc4 100644
--- a/doc/doxygen/output/html/functions_j.html
+++ b/doc/doxygen/output/html/functions_j.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_j" name="index_j"></a>- j -</h3><ul>
-<li>jl&#160;:&#160;<a class="el" href="structapi__msg.html#aa3d64205c25e953b168447e6aa21ee9e">api_msg</a></li>
+<li>jl&#160;:&#160;<a class="el" href="structapi__msg.html#a718b0166a9956c608188e8f99c663203">api_msg</a></li>
 <li>jumpers&#160;:&#160;<a class="el" href="structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683">netbios_answer</a></li>
 </ul>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/functions_k.html b/doc/doxygen/output/html/functions_k.html
index f54a108..c398bf6 100644
--- a/doc/doxygen/output/html/functions_k.html
+++ b/doc/doxygen/output/html/functions_k.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_l.html b/doc/doxygen/output/html/functions_l.html
index 20875e2..2593429 100644
--- a/doc/doxygen/output/html/functions_l.html
+++ b/doc/doxygen/output/html/functions_l.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,9 +101,9 @@
 
 <h3><a id="index_l" name="index_l"></a>- l -</h3><ul>
 <li>last_reporter_flag&#160;:&#160;<a class="el" href="structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874">igmp_group</a>, <a class="el" href="structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b">mld_group</a></li>
-<li>lastconflict&#160;:&#160;<a class="el" href="structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55">autoip</a></li>
+<li>lastconflict&#160;:&#160;<a class="el" href="structacd.html#a9dd4e1b82dd3e97717f011dbf862a58e">acd</a></li>
 <li>lastdata&#160;:&#160;<a class="el" href="structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1">lwip_sock</a></li>
-<li>legacy_query&#160;:&#160;<a class="el" href="structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65">mdns_outpacket</a></li>
+<li>legacy_query&#160;:&#160;<a class="el" href="structmdns__outmsg.html#aab2d5c566dcd83874d9cc77cd5fc7253">mdns_outmsg</a></li>
 <li>len&#160;:&#160;<a class="el" href="structapi__msg.html#a40624c398d1939bfee54bffa708a363e">api_msg</a>, <a class="el" href="structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd">netvector</a>, <a class="el" href="structpbuf.html#a6f82449625e36e294f5d210268c0703f">pbuf</a></li>
 <li>linger&#160;:&#160;<a class="el" href="structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d">netconn</a></li>
 <li>link&#160;:&#160;<a class="el" href="structstats__.html#a67759c9b0059bf569f9f771df23924eb">stats_</a></li>
diff --git a/doc/doxygen/output/html/functions_m.html b/doc/doxygen/output/html/functions_m.html
index d24a322..793eebf 100644
--- a/doc/doxygen/output/html/functions_m.html
+++ b/doc/doxygen/output/html/functions_m.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -115,10 +115,14 @@
 <li>mib2_counters&#160;:&#160;<a class="el" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">netif</a></li>
 <li>mld6&#160;:&#160;<a class="el" href="structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8">stats_</a></li>
 <li>mld_mac_filter&#160;:&#160;<a class="el" href="structnetif.html#abc67963ff9f574e98ef9c50138a3e470">netif</a></li>
-<li>msg&#160;:&#160;<a class="el" href="structapi__msg.html#a01eaa41b1bbdc92e78ba3712d28cb613">api_msg</a></li>
+<li>msg&#160;:&#160;<a class="el" href="structapi__msg.html#a7c67466a08e96f57f5cc8a41beb883b3">api_msg</a></li>
 <li>msg_idx&#160;:&#160;<a class="el" href="structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5">mqtt_client_s</a></li>
 <li>mtu&#160;:&#160;<a class="el" href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">netif</a></li>
 <li>mtu6&#160;:&#160;<a class="el" href="structnetif.html#acd78fca5dad6468605f38e327b3a5e72">netif</a></li>
+<li>multicast_msg_waiting&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a641abcf692a99e2c969048432b3c6adf">mdns_delayed_msg</a></li>
+<li>multicast_probe_timeout&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a5ca9fccc523b7820f8e67c9ccf921da8">mdns_delayed_msg</a></li>
+<li>multicast_timeout&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a6c7e581f1cf67daf039ffcaa31580e60">mdns_delayed_msg</a></li>
+<li>multicast_timeout_25TTL&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a7052387506ef48b1db099c48f4ec5736">mdns_delayed_msg</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/functions_n.html b/doc/doxygen/output/html/functions_n.html
index 614df23..f9ac634 100644
--- a/doc/doxygen/output/html/functions_n.html
+++ b/doc/doxygen/output/html/functions_n.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,15 +100,17 @@
 <div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_n" name="index_n"></a>- n -</h3><ul>
-<li>n&#160;:&#160;<a class="el" href="structapi__msg.html#a46007ce4f08d3e396f068ab80c9a9ae1">api_msg</a></li>
-<li>name&#160;:&#160;<a class="el" href="structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53">dns_api_msg</a>, <a class="el" href="structmdns__host.html#a560447b364854eb5480e137e09d3cd24">mdns_host</a>, <a class="el" href="structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784">mdns_service</a>, <a class="el" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">netif</a></li>
+<li>n&#160;:&#160;<a class="el" href="structapi__msg.html#a9b0c707835838c2ffe55b85c2902d7ad">api_msg</a></li>
+<li>name&#160;:&#160;<a class="el" href="structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53">dns_api_msg</a>, <a class="el" href="structmdns__host.html#a560447b364854eb5480e137e09d3cd24">mdns_host</a>, <a class="el" href="structmdns__request.html#a3ed18dad500125e0d63274c797bd52f5">mdns_request</a>, <a class="el" href="structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784">mdns_service</a>, <a class="el" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">netif</a></li>
 <li>name_size&#160;:&#160;<a class="el" href="structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d">netbios_answer</a></li>
 <li>nd6&#160;:&#160;<a class="el" href="structstats__.html#ab348a3a4b593b05d7df1293a06af8adf">stats_</a></li>
-<li>netif&#160;:&#160;<a class="el" href="structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989">mdns_packet</a></li>
-<li>next&#160;:&#160;<a class="el" href="structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78">igmp_group</a>, <a class="el" href="structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a">lwip_select_cb</a>, <a class="el" href="structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf">mem</a>, <a class="el" href="structmld__group.html#a9273a345a5754241bf26ddc835d27ddc">mld_group</a>, <a class="el" href="structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b">mqtt_request_t</a>, <a class="el" href="structnetif.html#ae77736b64df442242795220d76be6b86">netif</a>, <a class="el" href="structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341">pbuf</a>, <a class="el" href="structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7">pbuf_rom</a>, <a class="el" href="structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e">snmp_varbind</a>, <a class="el" href="structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260">tcp_pcb</a>, <a class="el" href="structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34">tcp_pcb_listen</a></li>
+<li>next&#160;:&#160;<a class="el" href="structacd.html#aa14c2b88cd471839d5b5de80bb46a9aa">acd</a>, <a class="el" href="structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78">igmp_group</a>, <a class="el" href="structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a">lwip_select_cb</a>, <a class="el" href="structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf">mem</a>, <a class="el" href="structmld__group.html#a9273a345a5754241bf26ddc835d27ddc">mld_group</a>, <a class="el" href="structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b">mqtt_request_t</a>, <a class="el" href="structnetif.html#ae77736b64df442242795220d76be6b86">netif</a>, <a class="el" href="structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341">pbuf</a>, <a class="el" href="structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7">pbuf_rom</a>, <a class="el" href="structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e">snmp_varbind</a>, <a class="el" href="structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260">tcp_pcb</a>, <a class="el" href="structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34">tcp_pcb_listen</a></li>
+<li>next_answer&#160;:&#160;<a class="el" href="structmdns__packet.html#a1ff4547d0866f338d1c58fc1dadf43f1">mdns_packet</a></li>
+<li>next_tc_question&#160;:&#160;<a class="el" href="structmdns__packet.html#afdb78218c1775073762d9560986c119b">mdns_packet</a></li>
 <li>node&#160;:&#160;<a class="el" href="structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992">snmp_leaf_node</a>, <a class="el" href="structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac">snmp_node_instance</a>, <a class="el" href="structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b">snmp_scalar_array_node</a>, <a class="el" href="structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1">snmp_scalar_node</a>, <a class="el" href="structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18">snmp_table_node</a>, <a class="el" href="structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386">snmp_tree_node</a></li>
 <li>node_type&#160;:&#160;<a class="el" href="structsnmp__node.html#a1af8e20a688943a419b307bf123b1851">snmp_node</a></li>
 <li>num&#160;:&#160;<a class="el" href="structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7">memp_desc</a>, <a class="el" href="structnetif.html#ab7ef01e505dd2feb781fe86756b1c973">netif</a></li>
+<li>num_conflicts&#160;:&#160;<a class="el" href="structacd.html#ab40b6b3cf57634135753f2426207f84a">acd</a>, <a class="el" href="structmdns__host.html#a07aadf9f308eee16a99041635df38123">mdns_host</a></li>
 <li>number_of_alignment_errors&#160;:&#160;<a class="el" href="structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2">netbios_answer</a></li>
 <li>number_of_collisions&#160;:&#160;<a class="el" href="structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e">netbios_answer</a></li>
 <li>number_of_crcs&#160;:&#160;<a class="el" href="structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8">netbios_answer</a></li>
diff --git a/doc/doxygen/output/html/functions_o.html b/doc/doxygen/output/html/functions_o.html
index f2319ba..30e9224 100644
--- a/doc/doxygen/output/html/functions_o.html
+++ b/doc/doxygen/output/html/functions_o.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -104,6 +104,7 @@
 <li>oid&#160;:&#160;<a class="el" href="structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271">snmp_node</a>, <a class="el" href="structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4">snmp_varbind</a></li>
 <li>old_address&#160;:&#160;<a class="el" href="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade">netif_ext_callback_args_t::ipv4_changed_s</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226">netif_ext_callback_args_t::ipv6_set_s</a></li>
 <li>old_state&#160;:&#160;<a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776">netif_ext_callback_args_t::ipv6_addr_state_changed_s</a></li>
+<li>only_ptr&#160;:&#160;<a class="el" href="structmdns__request.html#a1080b561c8dcb322fb2af64217b13f64">mdns_request</a></li>
 <li>op_completed&#160;:&#160;<a class="el" href="structnetconn.html#a982506698a59f185ff3f16d1675ea4ae">netconn</a></li>
 <li>open&#160;:&#160;<a class="el" href="structtftp__context.html#a65d6359e2aac571813c05c61676c01a1">tftp_context</a></li>
 <li>original&#160;:&#160;<a class="el" href="structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d">pbuf_custom_ref</a></li>
diff --git a/doc/doxygen/output/html/functions_p.html b/doc/doxygen/output/html/functions_p.html
index 103d7df..1fd9255 100644
--- a/doc/doxygen/output/html/functions_p.html
+++ b/doc/doxygen/output/html/functions_p.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -116,9 +116,8 @@
 <li>poll_nfds&#160;:&#160;<a class="el" href="structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba">lwip_select_cb</a></li>
 <li>port&#160;:&#160;<a class="el" href="structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c">mdns_service</a></li>
 <li>prev&#160;:&#160;<a class="el" href="structlwip__select__cb.html#a21a98e316bb7001d8750b20f5a7d0aa7">lwip_select_cb</a>, <a class="el" href="structmem.html#a9d7722ed10adf965fa98563d502f98ac">mem</a>, <a class="el" href="structsnmp__varbind.html#a365abcc1f80d28dc8ffd07193099c760">snmp_varbind</a></li>
-<li>probes_sent&#160;:&#160;<a class="el" href="structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922">mdns_host</a></li>
-<li>probing_state&#160;:&#160;<a class="el" href="structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61">mdns_host</a></li>
-<li>proto&#160;:&#160;<a class="el" href="structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d">mdns_service</a></li>
+<li>probe_query_recv&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a4a3ee99f7c25e88f17ea912897617aa0">mdns_outmsg</a></li>
+<li>proto&#160;:&#160;<a class="el" href="structmdns__request.html#a497e1b8f664dab9904a89e5f15f5bc60">mdns_request</a>, <a class="el" href="structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d">mdns_service</a></li>
 <li>ptr&#160;:&#160;<a class="el" href="structnetvector.html#a523362737ea7764f9aaa73a050a0b983">netvector</a></li>
 </ul>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/functions_q.html b/doc/doxygen/output/html/functions_q.html
index a2536c4..af2141e 100644
--- a/doc/doxygen/output/html/functions_q.html
+++ b/doc/doxygen/output/html/functions_q.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,6 +101,8 @@
 
 <h3><a id="index_q" name="index_q"></a>- q -</h3><ul>
 <li>q&#160;:&#160;<a class="el" href="structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df">nd6_neighbor_cache_entry</a></li>
+<li>qtype&#160;:&#160;<a class="el" href="structmdns__request.html#a5a9261362213a1a790a0b3451916f669">mdns_request</a></li>
+<li>query&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a3f6810fb1f2a989afcbc2fd852a20386">mdns_outmsg</a></li>
 <li>query_name&#160;:&#160;<a class="el" href="structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b">netbios_answer</a></li>
 <li>questions&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#a09211e78f7f773c492b5856d31423699">mdns_packet</a></li>
 <li>questions_left&#160;:&#160;<a class="el" href="structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437">mdns_packet</a></li>
diff --git a/doc/doxygen/output/html/functions_r.html b/doc/doxygen/output/html/functions_r.html
index 1ba8362..44e4a5d 100644
--- a/doc/doxygen/output/html/functions_r.html
+++ b/doc/doxygen/output/html/functions_r.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,8 @@
 <div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_r" name="index_r"></a>- r -</h3><ul>
-<li>r&#160;:&#160;<a class="el" href="structapi__msg.html#a50e8d6dfa0ba30ae7e39c336bf68742c">api_msg</a></li>
+<li>r&#160;:&#160;<a class="el" href="structapi__msg.html#adbb33e03089db527b0af7e4b22f04e1c">api_msg</a></li>
+<li>rate_limit_activated&#160;:&#160;<a class="el" href="structmdns__host.html#a002e836a1888c7df4cf2b775c7fae557">mdns_host</a></li>
 <li>rcvevent&#160;:&#160;<a class="el" href="structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a">lwip_sock</a></li>
 <li>reachability&#160;:&#160;<a class="el" href="structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d">sntp_server</a></li>
 <li>read&#160;:&#160;<a class="el" href="structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c">tftp_context</a></li>
@@ -117,6 +118,7 @@
 <li>reference_len&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54">snmp_node_instance</a></li>
 <li>release_instance&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de">snmp_node_instance</a></li>
 <li>remove_callback&#160;:&#160;<a class="el" href="structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07">netif</a></li>
+<li>result_fn&#160;:&#160;<a class="el" href="structmdns__request.html#a4cc8a4e62ce71bc33f1e7cb24b198c1d">mdns_request</a></li>
 <li>rs_count&#160;:&#160;<a class="el" href="structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6">netif</a></li>
 </ul>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/functions_s.html b/doc/doxygen/output/html/functions_s.html
index e044974..78e0feb 100644
--- a/doc/doxygen/output/html/functions_s.html
+++ b/doc/doxygen/output/html/functions_s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,26 +100,25 @@
 <div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_s" name="index_s"></a>- s -</h3><ul>
-<li>sd&#160;:&#160;<a class="el" href="structapi__msg.html#a5aa22dbd74fd7ba2fa5eb8bc8aae529f">api_msg</a></li>
+<li>sd&#160;:&#160;<a class="el" href="structapi__msg.html#a8644758cd55e0891e43717711ae7b03b">api_msg</a></li>
 <li>select_waiting&#160;:&#160;<a class="el" href="structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38">lwip_sock</a></li>
 <li>sem&#160;:&#160;<a class="el" href="structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2">dns_api_msg</a>, <a class="el" href="structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482">lwip_select_cb</a></li>
 <li>sem_signalled&#160;:&#160;<a class="el" href="structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99">lwip_select_cb</a></li>
 <li>send_timeout&#160;:&#160;<a class="el" href="structnetconn.html#a44e55724482b8e447134f5ba4f01551a">netconn</a></li>
 <li>sendevent&#160;:&#160;<a class="el" href="structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8">lwip_sock</a></li>
-<li>sent_num&#160;:&#160;<a class="el" href="structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25">autoip</a></li>
+<li>sent_num&#160;:&#160;<a class="el" href="structacd.html#a4ab002648d338ae33ffd3829e23703cb">acd</a>, <a class="el" href="structmdns__host.html#a9c09b5c58b3db64f78ce8eeb14952bea">mdns_host</a></li>
 <li>sequence_number&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869">ieee_802154_hdr</a></li>
-<li>service&#160;:&#160;<a class="el" href="structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad">mdns_service</a></li>
+<li>service&#160;:&#160;<a class="el" href="structmdns__request.html#aace6ab8b7de73d61d02711f26de7b751">mdns_request</a>, <a class="el" href="structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad">mdns_service</a></li>
 <li>services&#160;:&#160;<a class="el" href="structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed">mdns_host</a></li>
 <li>session_data_packet_size&#160;:&#160;<a class="el" href="structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c">netbios_answer</a></li>
 <li>set_test&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd">snmp_node_instance</a>, <a class="el" href="structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0">snmp_table_node</a></li>
 <li>set_value&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834">snmp_node_instance</a>, <a class="el" href="structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804">snmp_table_node</a></li>
 <li>size&#160;:&#160;<a class="el" href="structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3">memp_desc</a></li>
-<li>socket&#160;:&#160;<a class="el" href="structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36">netconn</a></li>
 <li>source_addr&#160;:&#160;<a class="el" href="structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a">mdns_packet</a></li>
 <li>source_address&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937">ieee_802154_hdr</a></li>
 <li>source_pan_id&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2">ieee_802154_hdr</a></li>
 <li>src&#160;:&#160;<a class="el" href="structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef">ip6_hdr</a></li>
-<li>state&#160;:&#160;<a class="el" href="structautoip.html#a51af55190548e378e310aeaddfa1fdef">autoip</a>, <a class="el" href="structnetconn.html#a936c33090ec35e5e8c0011be5515a589">netconn</a>, <a class="el" href="structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3">netif</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c">netif_ext_callback_args_t::link_changed_s</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7">netif_ext_callback_args_t::status_changed_s</a>, <a class="el" href="structsmtp__session.html#aed9c182738767279c2b58b1e3322db09">smtp_session</a></li>
+<li>state&#160;:&#160;<a class="el" href="structacd.html#a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb">acd</a>, <a class="el" href="structautoip.html#a51af55190548e378e310aeaddfa1fdef">autoip</a>, <a class="el" href="structmdns__host.html#a2ed51b16771590917e0eef5cf25ada71">mdns_host</a>, <a class="el" href="structnetconn.html#a936c33090ec35e5e8c0011be5515a589">netconn</a>, <a class="el" href="structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3">netif</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c">netif_ext_callback_args_t::link_changed_s</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7">netif_ext_callback_args_t::status_changed_s</a>, <a class="el" href="structsmtp__session.html#aed9c182738767279c2b58b1e3322db09">smtp_session</a></li>
 <li>static_data&#160;:&#160;<a class="el" href="structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4">smtp_send_request</a></li>
 <li>stats&#160;:&#160;<a class="el" href="structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500">memp_desc</a></li>
 <li>status_callback&#160;:&#160;<a class="el" href="structnetif.html#a1513e81d02557d2a950e965f18b53a45">netif</a></li>
diff --git a/doc/doxygen/output/html/functions_t.html b/doc/doxygen/output/html/functions_t.html
index 6e923b0..dd2f173 100644
--- a/doc/doxygen/output/html/functions_t.html
+++ b/doc/doxygen/output/html/functions_t.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -112,11 +112,11 @@
 <li>total_number_of_command_blocks&#160;:&#160;<a class="el" href="structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2">netbios_answer</a></li>
 <li>tried_llipaddr&#160;:&#160;<a class="el" href="structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853">autoip</a></li>
 <li>ts&#160;:&#160;<a class="el" href="structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971">netif</a></li>
-<li>ttw&#160;:&#160;<a class="el" href="structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf">autoip</a></li>
+<li>ttw&#160;:&#160;<a class="el" href="structacd.html#aabde1967e37d685b19b9701af641a97c">acd</a></li>
 <li>tx_buf&#160;:&#160;<a class="el" href="structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61">smtp_session</a></li>
 <li>tx_datagram_tag&#160;:&#160;<a class="el" href="structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c">lowpan6_ieee802154_data</a></li>
 <li>tx_frame_seq_num&#160;:&#160;<a class="el" href="structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c">lowpan6_ieee802154_data</a></li>
-<li>tx_id&#160;:&#160;<a class="el" href="structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00">mdns_packet</a></li>
+<li>tx_id&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a1d2d5f1d5d366f31d65ca18a239bfd4e">mdns_outmsg</a>, <a class="el" href="structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00">mdns_packet</a></li>
 <li>txt_fn&#160;:&#160;<a class="el" href="structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c">mdns_service</a></li>
 <li>txtdata&#160;:&#160;<a class="el" href="structmdns__service.html#a35daff90a18d19b14f23fa02df424f94">mdns_service</a></li>
 <li>type&#160;:&#160;<a class="el" href="structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a">ip_addr</a>, <a class="el" href="structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6">netconn</a>, <a class="el" href="structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950">snmp_varbind</a></li>
diff --git a/doc/doxygen/output/html/functions_u.html b/doc/doxygen/output/html/functions_u.html
index 7d04176..382dfdb 100644
--- a/doc/doxygen/output/html/functions_u.html
+++ b/doc/doxygen/output/html/functions_u.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,7 +101,8 @@
 
 <h3><a id="index_u" name="index_u"></a>- u -</h3><ul>
 <li>udp&#160;:&#160;<a class="el" href="structstats__.html#a626e03d4bded6480582789cfd17d4063">stats_</a></li>
-<li>unicast_reply&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d">mdns_outpacket</a></li>
+<li>unicast_msg_in_use&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#abd5210624394fece45e57e16da85a47d">mdns_delayed_msg</a></li>
+<li>unicast_reply_requested&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a8abcd5b3e04c16a75752b36cf613ac6f">mdns_outmsg</a></li>
 <li>unit_id&#160;:&#160;<a class="el" href="structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787">netbios_answer</a></li>
 <li>use&#160;:&#160;<a class="el" href="structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852">igmp_group</a>, <a class="el" href="structmld__group.html#addc67094f83c9352fe039c392c480f9e">mld_group</a></li>
 <li>used&#160;:&#160;<a class="el" href="structmem.html#aa76b6a39425617435978dce903f0d456">mem</a></li>
diff --git a/doc/doxygen/output/html/functions_v.html b/doc/doxygen/output/html/functions_v.html
index 49d73a8..a8d01b6 100644
--- a/doc/doxygen/output/html/functions_v.html
+++ b/doc/doxygen/output/html/functions_v.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_vars.html b/doc/doxygen/output/html/functions_vars.html
index 0dda795..56207a8 100644
--- a/doc/doxygen/output/html/functions_vars.html
+++ b/doc/doxygen/output/html/functions_vars.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_vars_a.html b/doc/doxygen/output/html/functions_vars_a.html
index 805260b..ec6febb 100644
--- a/doc/doxygen/output/html/functions_vars_a.html
+++ b/doc/doxygen/output/html/functions_vars_a.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,19 +102,25 @@
 <h3><a id="index_a" name="index_a"></a>- a -</h3><ul>
 <li>acceptmbox&#160;:&#160;<a class="el" href="structnetconn.html#a9b59188f300828d2b5814e27ab27cad0">netconn</a></li>
 <li>access&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c">snmp_node_instance</a></li>
-<li>ad&#160;:&#160;<a class="el" href="structapi__msg.html#af9817721045b7ebe98ad484730e5e9cc">api_msg</a></li>
-<li>additional&#160;:&#160;<a class="el" href="structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce">mdns_outpacket</a></li>
+<li>acd&#160;:&#160;<a class="el" href="structautoip.html#a1965250cda881d229e2a1fe146a0bb9e">autoip</a></li>
+<li>acd_conflict_callback&#160;:&#160;<a class="el" href="structacd.html#a3a03aa687716055a4f75f6e5e380e46e">acd</a></li>
+<li>ad&#160;:&#160;<a class="el" href="structapi__msg.html#a1831a18bdfe88ca89a773fc477966894">api_msg</a></li>
+<li>additional&#160;:&#160;<a class="el" href="structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#ab7d1d004dcac3cb6761241c5fe58b0ab">mdns_packet</a></li>
+<li>additional_left&#160;:&#160;<a class="el" href="structmdns__packet.html#ac47f5a84c173a1565c69673536537c89">mdns_packet</a></li>
 <li>addr&#160;:&#160;<a class="el" href="structdns__api__msg.html#a217814594564077d21b0f2696280b2a8">dns_api_msg</a>, <a class="el" href="structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d">zepif_init</a></li>
 <li>addr_index&#160;:&#160;<a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f">netif_ext_callback_args_t::ipv6_addr_state_changed_s</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd">netif_ext_callback_args_t::ipv6_set_s</a></li>
 <li>address&#160;:&#160;<a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17">netif_ext_callback_args_t::ipv6_addr_state_changed_s</a></li>
+<li>alloc&#160;:&#160;<a class="el" href="structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687">altcp_allocator_s</a></li>
 <li>answer_name&#160;:&#160;<a class="el" href="structnetbios__answer.html#abf746cd54add594216ddc3683c741406">netbios_answer</a></li>
 <li>answer_name_flags&#160;:&#160;<a class="el" href="structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4">netbios_answer</a></li>
 <li>answers&#160;:&#160;<a class="el" href="structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7">mdns_packet</a></li>
 <li>answers_left&#160;:&#160;<a class="el" href="structmdns__packet.html#a56ba495a1458a21982e65d746468849d">mdns_packet</a></li>
+<li>arg&#160;:&#160;<a class="el" href="structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1">altcp_allocator_s</a></li>
 <li>asn1_type&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9">snmp_node_instance</a></li>
 <li>auth_plain&#160;:&#160;<a class="el" href="structsmtp__session.html#a561389328fb1fefcb4d4d17fd0d43301">smtp_session</a></li>
 <li>auth_plain_len&#160;:&#160;<a class="el" href="structsmtp__session.html#a003dfd03ac58252b575a7c965e532461">smtp_session</a></li>
-<li>authoritative&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035">mdns_outpacket</a></li>
+<li>authoritative&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#a01f2cd644ceda020d639290fe1c3ea1c">mdns_packet</a></li>
+<li>authoritative_left&#160;:&#160;<a class="el" href="structmdns__packet.html#ade926269f6b1de2e51ee92a703068445">mdns_packet</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/functions_vars_b.html b/doc/doxygen/output/html/functions_vars_b.html
index 38d0cff..d2ed0eb 100644
--- a/doc/doxygen/output/html/functions_vars_b.html
+++ b/doc/doxygen/output/html/functions_vars_b.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,7 +102,7 @@
 <h3><a id="index_b" name="index_b"></a>- b -</h3><ul>
 <li>b&#160;:&#160;<a class="el" href="structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05">api_msg</a></li>
 <li>base&#160;:&#160;<a class="el" href="structmemp__desc.html#a9aec58adcbcd88167247296ca4346558">memp_desc</a></li>
-<li>bc&#160;:&#160;<a class="el" href="structapi__msg.html#a87ce87e5931c8f748293946d3b250791">api_msg</a></li>
+<li>bc&#160;:&#160;<a class="el" href="structapi__msg.html#a8e600d95eb044f8f7dc9ff921aaa05b1">api_msg</a></li>
 <li>body&#160;:&#160;<a class="el" href="structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49">smtp_session</a></li>
 <li>body_len&#160;:&#160;<a class="el" href="structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d">smtp_session</a></li>
 <li>body_sent&#160;:&#160;<a class="el" href="structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b">smtp_session</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_c.html b/doc/doxygen/output/html/functions_vars_c.html
index 8715207..29282b3 100644
--- a/doc/doxygen/output/html/functions_vars_c.html
+++ b/doc/doxygen/output/html/functions_vars_c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented variables with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
-<li>cache_flush&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195">mdns_outpacket</a></li>
+<li>cache_flush&#160;:&#160;<a class="el" href="structmdns__outmsg.html#ab46f1589681a1abe826e8f6c58d10f1a">mdns_outmsg</a></li>
 <li>callback&#160;:&#160;<a class="el" href="structnetconn.html#abe796060bb06e585333ca9a87862b624">netconn</a></li>
 <li>callback_arg&#160;:&#160;<a class="el" href="structsmtp__session.html#af0544df7a935a092d825d8f2380f970f">smtp_session</a></li>
 <li>callback_fn&#160;:&#160;<a class="el" href="structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b">smtp_session</a></li>
@@ -110,6 +110,7 @@
 <li>client_pass&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b">mqtt_connect_client_info_t</a></li>
 <li>client_user&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5">mqtt_connect_client_info_t</a></li>
 <li>close&#160;:&#160;<a class="el" href="structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65">tftp_context</a></li>
+<li>conflict_time&#160;:&#160;<a class="el" href="structmdns__host.html#ab1ca90b282a4a6511fa87408b946f49a">mdns_host</a></li>
 <li>conn&#160;:&#160;<a class="el" href="structapi__msg.html#abec5e33802d69f1b601543d60699f028">api_msg</a>, <a class="el" href="structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4">lwip_sock</a></li>
 <li>conn_state&#160;:&#160;<a class="el" href="structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6">mqtt_client_s</a></li>
 <li>connect_arg&#160;:&#160;<a class="el" href="structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a">mqtt_client_s</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_d.html b/doc/doxygen/output/html/functions_vars_d.html
index 2ef0851..05ea90c 100644
--- a/doc/doxygen/output/html/functions_vars_d.html
+++ b/doc/doxygen/output/html/functions_vars_d.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,12 +101,13 @@
 
 <h3><a id="index_d" name="index_d"></a>- d -</h3><ul>
 <li>data_cb&#160;:&#160;<a class="el" href="structmqtt__client__s.html#a26dc9112351c042594a41703197925a7">mqtt_client_s</a></li>
-<li>dest_addr&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4">mdns_outpacket</a></li>
+<li>delayed_msg_multicast&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a6f2ed8a51e6e249c3c72c3e31f23d20b">mdns_delayed_msg</a></li>
+<li>delayed_msg_unicast&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#acaa15e086356be60b2a1bdd8fcc17edd">mdns_delayed_msg</a></li>
+<li>dest_addr&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a187774c17294968998b6f12bb5834cd0">mdns_outmsg</a></li>
 <li>destination_address&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33">ieee_802154_hdr</a></li>
 <li>destination_pan_id&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd">ieee_802154_hdr</a></li>
 <li>destroy&#160;:&#160;<a class="el" href="structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b">tcp_ext_arg_callbacks</a></li>
 <li>dns_addrtype&#160;:&#160;<a class="el" href="structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493">dns_api_msg</a></li>
-<li>dns_ttl&#160;:&#160;<a class="el" href="structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b">mdns_host</a>, <a class="el" href="structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14">mdns_service</a></li>
 <li>domain_offsets&#160;:&#160;<a class="el" href="structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f">mdns_outpacket</a></li>
 </ul>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/functions_vars_e.html b/doc/doxygen/output/html/functions_vars_e.html
index 6f3309c..e6823ef 100644
--- a/doc/doxygen/output/html/functions_vars_e.html
+++ b/doc/doxygen/output/html/functions_vars_e.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,6 +102,7 @@
 <h3><a id="index_e" name="index_e"></a>- e -</h3><ul>
 <li>err&#160;:&#160;<a class="el" href="structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f">api_msg</a>, <a class="el" href="structdns__api__msg.html#a6536d91adb146555461359bd451b30de">dns_api_msg</a></li>
 <li>errevent&#160;:&#160;<a class="el" href="structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e">lwip_sock</a></li>
+<li>error&#160;:&#160;<a class="el" href="structtftp__context.html#a39cbb84a9c0eaa8ea62d183ba8214519">tftp_context</a></li>
 <li>ethaddr&#160;:&#160;<a class="el" href="structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc">bridgeif_initdata_s</a></li>
 <li>etharp&#160;:&#160;<a class="el" href="structstats__.html#aa52547cb08dc828927494dc485bb69f3">stats_</a></li>
 <li>exceptset&#160;:&#160;<a class="el" href="structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed">lwip_select_cb</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_f.html b/doc/doxygen/output/html/functions_vars_f.html
index 651f91d..6dd8a8d 100644
--- a/doc/doxygen/output/html/functions_vars_f.html
+++ b/doc/doxygen/output/html/functions_vars_f.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented variables with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_f" name="index_f"></a>- f -</h3><ul>
-<li>flags&#160;:&#160;<a class="el" href="structnetconn.html#a96cb9a3830248699bd07a1a447e5630c">netconn</a>, <a class="el" href="structnetif.html#a1c171db6097bbb6f09f63549a66e00ea">netif</a>, <a class="el" href="structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a">pbuf</a></li>
+<li>flags&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a8118f6c263f6f8727552620deac2b7c2">mdns_outmsg</a>, <a class="el" href="structnetconn.html#a96cb9a3830248699bd07a1a447e5630c">netconn</a>, <a class="el" href="structnetif.html#a1c171db6097bbb6f09f63549a66e00ea">netif</a>, <a class="el" href="structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a">pbuf</a></li>
 <li>frame_control&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10">ieee_802154_hdr</a></li>
 <li>from&#160;:&#160;<a class="el" href="structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee">smtp_session</a></li>
 <li>from_len&#160;:&#160;<a class="el" href="structsmtp__session.html#a191b09e7142414a671da82fece888e65">smtp_session</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_g.html b/doc/doxygen/output/html/functions_vars_g.html
index 6d53d19..dec1f39 100644
--- a/doc/doxygen/output/html/functions_vars_g.html
+++ b/doc/doxygen/output/html/functions_vars_g.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_vars_h.html b/doc/doxygen/output/html/functions_vars_h.html
index a3b9c9b..2ed76b7 100644
--- a/doc/doxygen/output/html/functions_vars_h.html
+++ b/doc/doxygen/output/html/functions_vars_h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_vars_i.html b/doc/doxygen/output/html/functions_vars_i.html
index 0f6d6c2..c4e21f6 100644
--- a/doc/doxygen/output/html/functions_vars_i.html
+++ b/doc/doxygen/output/html/functions_vars_i.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -117,6 +117,7 @@
 <li>ifoutucastpkts&#160;:&#160;<a class="el" href="structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471">stats_mib2_netif_ctrs</a></li>
 <li>igmp&#160;:&#160;<a class="el" href="structstats__.html#a877e369c2abef97f13492faa838e2271">stats_</a></li>
 <li>igmp_mac_filter&#160;:&#160;<a class="el" href="structnetif.html#ae64e56581bf0f136601f24c5395c19f0">netif</a></li>
+<li>index&#160;:&#160;<a class="el" href="structmdns__host.html#ab5099b1bfe27698f6cc7ac36a80111a0">mdns_host</a></li>
 <li>inpub_pkt_id&#160;:&#160;<a class="el" href="structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824">mqtt_client_s</a></li>
 <li>input&#160;:&#160;<a class="el" href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">netif</a></li>
 <li>instance_oid&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23">snmp_node_instance</a></li>
@@ -129,6 +130,9 @@
 <li>ip6_frag&#160;:&#160;<a class="el" href="structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf">stats_</a></li>
 <li>ip_addr&#160;:&#160;<a class="el" href="structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866">netif</a></li>
 <li>ip_frag&#160;:&#160;<a class="el" href="structstats__.html#a81fcccf03ab0d4e31423f39d0c880302">stats_</a></li>
+<li>ipaddr&#160;:&#160;<a class="el" href="structacd.html#af2c795ee5b09085bca592d830a388448">acd</a></li>
+<li>ipv4&#160;:&#160;<a class="el" href="structmdns__host.html#a9d0df33231cd8b50e25aa1fa4ebdc291">mdns_host</a></li>
+<li>ipv6&#160;:&#160;<a class="el" href="structmdns__host.html#a16016021ddabb1dc182f36c7185bf283">mdns_host</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/functions_vars_j.html b/doc/doxygen/output/html/functions_vars_j.html
index 87c8741..00a85d1 100644
--- a/doc/doxygen/output/html/functions_vars_j.html
+++ b/doc/doxygen/output/html/functions_vars_j.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented variables with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_j" name="index_j"></a>- j -</h3><ul>
-<li>jl&#160;:&#160;<a class="el" href="structapi__msg.html#aa3d64205c25e953b168447e6aa21ee9e">api_msg</a></li>
+<li>jl&#160;:&#160;<a class="el" href="structapi__msg.html#a718b0166a9956c608188e8f99c663203">api_msg</a></li>
 <li>jumpers&#160;:&#160;<a class="el" href="structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683">netbios_answer</a></li>
 </ul>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/functions_vars_k.html b/doc/doxygen/output/html/functions_vars_k.html
index ef28531..d51c006 100644
--- a/doc/doxygen/output/html/functions_vars_k.html
+++ b/doc/doxygen/output/html/functions_vars_k.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_vars_l.html b/doc/doxygen/output/html/functions_vars_l.html
index 8130117..09d89a5 100644
--- a/doc/doxygen/output/html/functions_vars_l.html
+++ b/doc/doxygen/output/html/functions_vars_l.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,9 +101,9 @@
 
 <h3><a id="index_l" name="index_l"></a>- l -</h3><ul>
 <li>last_reporter_flag&#160;:&#160;<a class="el" href="structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874">igmp_group</a>, <a class="el" href="structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b">mld_group</a></li>
-<li>lastconflict&#160;:&#160;<a class="el" href="structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55">autoip</a></li>
+<li>lastconflict&#160;:&#160;<a class="el" href="structacd.html#a9dd4e1b82dd3e97717f011dbf862a58e">acd</a></li>
 <li>lastdata&#160;:&#160;<a class="el" href="structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1">lwip_sock</a></li>
-<li>legacy_query&#160;:&#160;<a class="el" href="structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65">mdns_outpacket</a></li>
+<li>legacy_query&#160;:&#160;<a class="el" href="structmdns__outmsg.html#aab2d5c566dcd83874d9cc77cd5fc7253">mdns_outmsg</a></li>
 <li>len&#160;:&#160;<a class="el" href="structapi__msg.html#a40624c398d1939bfee54bffa708a363e">api_msg</a>, <a class="el" href="structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd">netvector</a>, <a class="el" href="structpbuf.html#a6f82449625e36e294f5d210268c0703f">pbuf</a></li>
 <li>linger&#160;:&#160;<a class="el" href="structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d">netconn</a></li>
 <li>link&#160;:&#160;<a class="el" href="structstats__.html#a67759c9b0059bf569f9f771df23924eb">stats_</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_m.html b/doc/doxygen/output/html/functions_vars_m.html
index 6fff76b..dfc4fe3 100644
--- a/doc/doxygen/output/html/functions_vars_m.html
+++ b/doc/doxygen/output/html/functions_vars_m.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -115,10 +115,14 @@
 <li>mib2_counters&#160;:&#160;<a class="el" href="structnetif.html#ab32cbe1851154fd020bac4be558f5fd5">netif</a></li>
 <li>mld6&#160;:&#160;<a class="el" href="structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8">stats_</a></li>
 <li>mld_mac_filter&#160;:&#160;<a class="el" href="structnetif.html#abc67963ff9f574e98ef9c50138a3e470">netif</a></li>
-<li>msg&#160;:&#160;<a class="el" href="structapi__msg.html#a01eaa41b1bbdc92e78ba3712d28cb613">api_msg</a></li>
+<li>msg&#160;:&#160;<a class="el" href="structapi__msg.html#a7c67466a08e96f57f5cc8a41beb883b3">api_msg</a></li>
 <li>msg_idx&#160;:&#160;<a class="el" href="structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5">mqtt_client_s</a></li>
 <li>mtu&#160;:&#160;<a class="el" href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">netif</a></li>
 <li>mtu6&#160;:&#160;<a class="el" href="structnetif.html#acd78fca5dad6468605f38e327b3a5e72">netif</a></li>
+<li>multicast_msg_waiting&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a641abcf692a99e2c969048432b3c6adf">mdns_delayed_msg</a></li>
+<li>multicast_probe_timeout&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a5ca9fccc523b7820f8e67c9ccf921da8">mdns_delayed_msg</a></li>
+<li>multicast_timeout&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a6c7e581f1cf67daf039ffcaa31580e60">mdns_delayed_msg</a></li>
+<li>multicast_timeout_25TTL&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#a7052387506ef48b1db099c48f4ec5736">mdns_delayed_msg</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/functions_vars_n.html b/doc/doxygen/output/html/functions_vars_n.html
index 5357cd6..cd1910e 100644
--- a/doc/doxygen/output/html/functions_vars_n.html
+++ b/doc/doxygen/output/html/functions_vars_n.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,15 +100,17 @@
 <div class="textblock">Here is a list of all documented variables with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_n" name="index_n"></a>- n -</h3><ul>
-<li>n&#160;:&#160;<a class="el" href="structapi__msg.html#a46007ce4f08d3e396f068ab80c9a9ae1">api_msg</a></li>
-<li>name&#160;:&#160;<a class="el" href="structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53">dns_api_msg</a>, <a class="el" href="structmdns__host.html#a560447b364854eb5480e137e09d3cd24">mdns_host</a>, <a class="el" href="structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784">mdns_service</a>, <a class="el" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">netif</a></li>
+<li>n&#160;:&#160;<a class="el" href="structapi__msg.html#a9b0c707835838c2ffe55b85c2902d7ad">api_msg</a></li>
+<li>name&#160;:&#160;<a class="el" href="structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53">dns_api_msg</a>, <a class="el" href="structmdns__host.html#a560447b364854eb5480e137e09d3cd24">mdns_host</a>, <a class="el" href="structmdns__request.html#a3ed18dad500125e0d63274c797bd52f5">mdns_request</a>, <a class="el" href="structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784">mdns_service</a>, <a class="el" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">netif</a></li>
 <li>name_size&#160;:&#160;<a class="el" href="structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d">netbios_answer</a></li>
 <li>nd6&#160;:&#160;<a class="el" href="structstats__.html#ab348a3a4b593b05d7df1293a06af8adf">stats_</a></li>
-<li>netif&#160;:&#160;<a class="el" href="structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989">mdns_packet</a></li>
-<li>next&#160;:&#160;<a class="el" href="structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78">igmp_group</a>, <a class="el" href="structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a">lwip_select_cb</a>, <a class="el" href="structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf">mem</a>, <a class="el" href="structmld__group.html#a9273a345a5754241bf26ddc835d27ddc">mld_group</a>, <a class="el" href="structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b">mqtt_request_t</a>, <a class="el" href="structnetif.html#ae77736b64df442242795220d76be6b86">netif</a>, <a class="el" href="structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341">pbuf</a>, <a class="el" href="structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7">pbuf_rom</a>, <a class="el" href="structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e">snmp_varbind</a>, <a class="el" href="structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260">tcp_pcb</a>, <a class="el" href="structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34">tcp_pcb_listen</a></li>
+<li>next&#160;:&#160;<a class="el" href="structacd.html#aa14c2b88cd471839d5b5de80bb46a9aa">acd</a>, <a class="el" href="structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78">igmp_group</a>, <a class="el" href="structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a">lwip_select_cb</a>, <a class="el" href="structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf">mem</a>, <a class="el" href="structmld__group.html#a9273a345a5754241bf26ddc835d27ddc">mld_group</a>, <a class="el" href="structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b">mqtt_request_t</a>, <a class="el" href="structnetif.html#ae77736b64df442242795220d76be6b86">netif</a>, <a class="el" href="structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341">pbuf</a>, <a class="el" href="structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7">pbuf_rom</a>, <a class="el" href="structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e">snmp_varbind</a>, <a class="el" href="structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260">tcp_pcb</a>, <a class="el" href="structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34">tcp_pcb_listen</a></li>
+<li>next_answer&#160;:&#160;<a class="el" href="structmdns__packet.html#a1ff4547d0866f338d1c58fc1dadf43f1">mdns_packet</a></li>
+<li>next_tc_question&#160;:&#160;<a class="el" href="structmdns__packet.html#afdb78218c1775073762d9560986c119b">mdns_packet</a></li>
 <li>node&#160;:&#160;<a class="el" href="structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992">snmp_leaf_node</a>, <a class="el" href="structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac">snmp_node_instance</a>, <a class="el" href="structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b">snmp_scalar_array_node</a>, <a class="el" href="structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1">snmp_scalar_node</a>, <a class="el" href="structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18">snmp_table_node</a>, <a class="el" href="structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386">snmp_tree_node</a></li>
 <li>node_type&#160;:&#160;<a class="el" href="structsnmp__node.html#a1af8e20a688943a419b307bf123b1851">snmp_node</a></li>
 <li>num&#160;:&#160;<a class="el" href="structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7">memp_desc</a>, <a class="el" href="structnetif.html#ab7ef01e505dd2feb781fe86756b1c973">netif</a></li>
+<li>num_conflicts&#160;:&#160;<a class="el" href="structacd.html#ab40b6b3cf57634135753f2426207f84a">acd</a>, <a class="el" href="structmdns__host.html#a07aadf9f308eee16a99041635df38123">mdns_host</a></li>
 <li>number_of_alignment_errors&#160;:&#160;<a class="el" href="structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2">netbios_answer</a></li>
 <li>number_of_collisions&#160;:&#160;<a class="el" href="structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e">netbios_answer</a></li>
 <li>number_of_crcs&#160;:&#160;<a class="el" href="structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8">netbios_answer</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_o.html b/doc/doxygen/output/html/functions_vars_o.html
index 243104c..614178b 100644
--- a/doc/doxygen/output/html/functions_vars_o.html
+++ b/doc/doxygen/output/html/functions_vars_o.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -104,6 +104,7 @@
 <li>oid&#160;:&#160;<a class="el" href="structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271">snmp_node</a>, <a class="el" href="structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4">snmp_varbind</a></li>
 <li>old_address&#160;:&#160;<a class="el" href="structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade">netif_ext_callback_args_t::ipv4_changed_s</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226">netif_ext_callback_args_t::ipv6_set_s</a></li>
 <li>old_state&#160;:&#160;<a class="el" href="structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776">netif_ext_callback_args_t::ipv6_addr_state_changed_s</a></li>
+<li>only_ptr&#160;:&#160;<a class="el" href="structmdns__request.html#a1080b561c8dcb322fb2af64217b13f64">mdns_request</a></li>
 <li>op_completed&#160;:&#160;<a class="el" href="structnetconn.html#a982506698a59f185ff3f16d1675ea4ae">netconn</a></li>
 <li>open&#160;:&#160;<a class="el" href="structtftp__context.html#a65d6359e2aac571813c05c61676c01a1">tftp_context</a></li>
 <li>original&#160;:&#160;<a class="el" href="structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d">pbuf_custom_ref</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_p.html b/doc/doxygen/output/html/functions_vars_p.html
index a6c5e43..105b8e8 100644
--- a/doc/doxygen/output/html/functions_vars_p.html
+++ b/doc/doxygen/output/html/functions_vars_p.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -116,9 +116,8 @@
 <li>poll_nfds&#160;:&#160;<a class="el" href="structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba">lwip_select_cb</a></li>
 <li>port&#160;:&#160;<a class="el" href="structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c">mdns_service</a></li>
 <li>prev&#160;:&#160;<a class="el" href="structlwip__select__cb.html#a21a98e316bb7001d8750b20f5a7d0aa7">lwip_select_cb</a>, <a class="el" href="structmem.html#a9d7722ed10adf965fa98563d502f98ac">mem</a>, <a class="el" href="structsnmp__varbind.html#a365abcc1f80d28dc8ffd07193099c760">snmp_varbind</a></li>
-<li>probes_sent&#160;:&#160;<a class="el" href="structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922">mdns_host</a></li>
-<li>probing_state&#160;:&#160;<a class="el" href="structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61">mdns_host</a></li>
-<li>proto&#160;:&#160;<a class="el" href="structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d">mdns_service</a></li>
+<li>probe_query_recv&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a4a3ee99f7c25e88f17ea912897617aa0">mdns_outmsg</a></li>
+<li>proto&#160;:&#160;<a class="el" href="structmdns__request.html#a497e1b8f664dab9904a89e5f15f5bc60">mdns_request</a>, <a class="el" href="structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d">mdns_service</a></li>
 <li>ptr&#160;:&#160;<a class="el" href="structnetvector.html#a523362737ea7764f9aaa73a050a0b983">netvector</a></li>
 </ul>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/functions_vars_q.html b/doc/doxygen/output/html/functions_vars_q.html
index 150267f..80cb2ac 100644
--- a/doc/doxygen/output/html/functions_vars_q.html
+++ b/doc/doxygen/output/html/functions_vars_q.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,6 +101,8 @@
 
 <h3><a id="index_q" name="index_q"></a>- q -</h3><ul>
 <li>q&#160;:&#160;<a class="el" href="structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df">nd6_neighbor_cache_entry</a></li>
+<li>qtype&#160;:&#160;<a class="el" href="structmdns__request.html#a5a9261362213a1a790a0b3451916f669">mdns_request</a></li>
+<li>query&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a3f6810fb1f2a989afcbc2fd852a20386">mdns_outmsg</a></li>
 <li>query_name&#160;:&#160;<a class="el" href="structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b">netbios_answer</a></li>
 <li>questions&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#a09211e78f7f773c492b5856d31423699">mdns_packet</a></li>
 <li>questions_left&#160;:&#160;<a class="el" href="structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437">mdns_packet</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_r.html b/doc/doxygen/output/html/functions_vars_r.html
index 39ec97c..972f8ac 100644
--- a/doc/doxygen/output/html/functions_vars_r.html
+++ b/doc/doxygen/output/html/functions_vars_r.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,8 @@
 <div class="textblock">Here is a list of all documented variables with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_r" name="index_r"></a>- r -</h3><ul>
-<li>r&#160;:&#160;<a class="el" href="structapi__msg.html#a50e8d6dfa0ba30ae7e39c336bf68742c">api_msg</a></li>
+<li>r&#160;:&#160;<a class="el" href="structapi__msg.html#adbb33e03089db527b0af7e4b22f04e1c">api_msg</a></li>
+<li>rate_limit_activated&#160;:&#160;<a class="el" href="structmdns__host.html#a002e836a1888c7df4cf2b775c7fae557">mdns_host</a></li>
 <li>rcvevent&#160;:&#160;<a class="el" href="structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a">lwip_sock</a></li>
 <li>reachability&#160;:&#160;<a class="el" href="structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d">sntp_server</a></li>
 <li>read&#160;:&#160;<a class="el" href="structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c">tftp_context</a></li>
@@ -117,6 +118,7 @@
 <li>reference_len&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54">snmp_node_instance</a></li>
 <li>release_instance&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de">snmp_node_instance</a></li>
 <li>remove_callback&#160;:&#160;<a class="el" href="structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07">netif</a></li>
+<li>result_fn&#160;:&#160;<a class="el" href="structmdns__request.html#a4cc8a4e62ce71bc33f1e7cb24b198c1d">mdns_request</a></li>
 <li>rs_count&#160;:&#160;<a class="el" href="structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6">netif</a></li>
 </ul>
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/functions_vars_s.html b/doc/doxygen/output/html/functions_vars_s.html
index 2147579..70c4d27 100644
--- a/doc/doxygen/output/html/functions_vars_s.html
+++ b/doc/doxygen/output/html/functions_vars_s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,26 +100,25 @@
 <div class="textblock">Here is a list of all documented variables with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_s" name="index_s"></a>- s -</h3><ul>
-<li>sd&#160;:&#160;<a class="el" href="structapi__msg.html#a5aa22dbd74fd7ba2fa5eb8bc8aae529f">api_msg</a></li>
+<li>sd&#160;:&#160;<a class="el" href="structapi__msg.html#a8644758cd55e0891e43717711ae7b03b">api_msg</a></li>
 <li>select_waiting&#160;:&#160;<a class="el" href="structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38">lwip_sock</a></li>
 <li>sem&#160;:&#160;<a class="el" href="structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2">dns_api_msg</a>, <a class="el" href="structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482">lwip_select_cb</a></li>
 <li>sem_signalled&#160;:&#160;<a class="el" href="structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99">lwip_select_cb</a></li>
 <li>send_timeout&#160;:&#160;<a class="el" href="structnetconn.html#a44e55724482b8e447134f5ba4f01551a">netconn</a></li>
 <li>sendevent&#160;:&#160;<a class="el" href="structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8">lwip_sock</a></li>
-<li>sent_num&#160;:&#160;<a class="el" href="structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25">autoip</a></li>
+<li>sent_num&#160;:&#160;<a class="el" href="structacd.html#a4ab002648d338ae33ffd3829e23703cb">acd</a>, <a class="el" href="structmdns__host.html#a9c09b5c58b3db64f78ce8eeb14952bea">mdns_host</a></li>
 <li>sequence_number&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869">ieee_802154_hdr</a></li>
-<li>service&#160;:&#160;<a class="el" href="structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad">mdns_service</a></li>
+<li>service&#160;:&#160;<a class="el" href="structmdns__request.html#aace6ab8b7de73d61d02711f26de7b751">mdns_request</a>, <a class="el" href="structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad">mdns_service</a></li>
 <li>services&#160;:&#160;<a class="el" href="structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed">mdns_host</a></li>
 <li>session_data_packet_size&#160;:&#160;<a class="el" href="structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c">netbios_answer</a></li>
 <li>set_test&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd">snmp_node_instance</a>, <a class="el" href="structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0">snmp_table_node</a></li>
 <li>set_value&#160;:&#160;<a class="el" href="structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834">snmp_node_instance</a>, <a class="el" href="structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804">snmp_table_node</a></li>
 <li>size&#160;:&#160;<a class="el" href="structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3">memp_desc</a></li>
-<li>socket&#160;:&#160;<a class="el" href="structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36">netconn</a></li>
 <li>source_addr&#160;:&#160;<a class="el" href="structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a">mdns_packet</a></li>
 <li>source_address&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937">ieee_802154_hdr</a></li>
 <li>source_pan_id&#160;:&#160;<a class="el" href="structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2">ieee_802154_hdr</a></li>
 <li>src&#160;:&#160;<a class="el" href="structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef">ip6_hdr</a></li>
-<li>state&#160;:&#160;<a class="el" href="structautoip.html#a51af55190548e378e310aeaddfa1fdef">autoip</a>, <a class="el" href="structnetconn.html#a936c33090ec35e5e8c0011be5515a589">netconn</a>, <a class="el" href="structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3">netif</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c">netif_ext_callback_args_t::link_changed_s</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7">netif_ext_callback_args_t::status_changed_s</a>, <a class="el" href="structsmtp__session.html#aed9c182738767279c2b58b1e3322db09">smtp_session</a></li>
+<li>state&#160;:&#160;<a class="el" href="structacd.html#a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb">acd</a>, <a class="el" href="structautoip.html#a51af55190548e378e310aeaddfa1fdef">autoip</a>, <a class="el" href="structmdns__host.html#a2ed51b16771590917e0eef5cf25ada71">mdns_host</a>, <a class="el" href="structnetconn.html#a936c33090ec35e5e8c0011be5515a589">netconn</a>, <a class="el" href="structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3">netif</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c">netif_ext_callback_args_t::link_changed_s</a>, <a class="el" href="structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7">netif_ext_callback_args_t::status_changed_s</a>, <a class="el" href="structsmtp__session.html#aed9c182738767279c2b58b1e3322db09">smtp_session</a></li>
 <li>static_data&#160;:&#160;<a class="el" href="structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4">smtp_send_request</a></li>
 <li>stats&#160;:&#160;<a class="el" href="structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500">memp_desc</a></li>
 <li>status_callback&#160;:&#160;<a class="el" href="structnetif.html#a1513e81d02557d2a950e965f18b53a45">netif</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_t.html b/doc/doxygen/output/html/functions_vars_t.html
index bba671e..39239c3 100644
--- a/doc/doxygen/output/html/functions_vars_t.html
+++ b/doc/doxygen/output/html/functions_vars_t.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -112,11 +112,11 @@
 <li>total_number_of_command_blocks&#160;:&#160;<a class="el" href="structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2">netbios_answer</a></li>
 <li>tried_llipaddr&#160;:&#160;<a class="el" href="structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853">autoip</a></li>
 <li>ts&#160;:&#160;<a class="el" href="structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971">netif</a></li>
-<li>ttw&#160;:&#160;<a class="el" href="structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf">autoip</a></li>
+<li>ttw&#160;:&#160;<a class="el" href="structacd.html#aabde1967e37d685b19b9701af641a97c">acd</a></li>
 <li>tx_buf&#160;:&#160;<a class="el" href="structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61">smtp_session</a></li>
 <li>tx_datagram_tag&#160;:&#160;<a class="el" href="structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c">lowpan6_ieee802154_data</a></li>
 <li>tx_frame_seq_num&#160;:&#160;<a class="el" href="structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c">lowpan6_ieee802154_data</a></li>
-<li>tx_id&#160;:&#160;<a class="el" href="structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348">mdns_outpacket</a>, <a class="el" href="structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00">mdns_packet</a></li>
+<li>tx_id&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a1d2d5f1d5d366f31d65ca18a239bfd4e">mdns_outmsg</a>, <a class="el" href="structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00">mdns_packet</a></li>
 <li>txt_fn&#160;:&#160;<a class="el" href="structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c">mdns_service</a></li>
 <li>txtdata&#160;:&#160;<a class="el" href="structmdns__service.html#a35daff90a18d19b14f23fa02df424f94">mdns_service</a></li>
 <li>type&#160;:&#160;<a class="el" href="structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a">ip_addr</a>, <a class="el" href="structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6">netconn</a>, <a class="el" href="structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950">snmp_varbind</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_u.html b/doc/doxygen/output/html/functions_vars_u.html
index 9f373a8..35c5f9a 100644
--- a/doc/doxygen/output/html/functions_vars_u.html
+++ b/doc/doxygen/output/html/functions_vars_u.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,7 +101,8 @@
 
 <h3><a id="index_u" name="index_u"></a>- u -</h3><ul>
 <li>udp&#160;:&#160;<a class="el" href="structstats__.html#a626e03d4bded6480582789cfd17d4063">stats_</a></li>
-<li>unicast_reply&#160;:&#160;<a class="el" href="structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d">mdns_outpacket</a></li>
+<li>unicast_msg_in_use&#160;:&#160;<a class="el" href="structmdns__delayed__msg.html#abd5210624394fece45e57e16da85a47d">mdns_delayed_msg</a></li>
+<li>unicast_reply_requested&#160;:&#160;<a class="el" href="structmdns__outmsg.html#a8abcd5b3e04c16a75752b36cf613ac6f">mdns_outmsg</a></li>
 <li>unit_id&#160;:&#160;<a class="el" href="structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787">netbios_answer</a></li>
 <li>use&#160;:&#160;<a class="el" href="structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852">igmp_group</a>, <a class="el" href="structmld__group.html#addc67094f83c9352fe039c392c480f9e">mld_group</a></li>
 <li>used&#160;:&#160;<a class="el" href="structmem.html#aa76b6a39425617435978dce903f0d456">mem</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_v.html b/doc/doxygen/output/html/functions_vars_v.html
index 7f88409..7fde322 100644
--- a/doc/doxygen/output/html/functions_vars_v.html
+++ b/doc/doxygen/output/html/functions_vars_v.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_vars_w.html b/doc/doxygen/output/html/functions_vars_w.html
index 13533da..f609a69 100644
--- a/doc/doxygen/output/html/functions_vars_w.html
+++ b/doc/doxygen/output/html/functions_vars_w.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented variables with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_w" name="index_w"></a>- w -</h3><ul>
-<li>w&#160;:&#160;<a class="el" href="structapi__msg.html#ac0637c6f4dbb3f64f95d5181d55e663c">api_msg</a></li>
+<li>w&#160;:&#160;<a class="el" href="structapi__msg.html#a0abfc9bda0b00554628bc3169d8f21bf">api_msg</a></li>
 <li>will_msg&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7">mqtt_connect_client_info_t</a></li>
 <li>will_qos&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9">mqtt_connect_client_info_t</a></li>
 <li>will_retain&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3">mqtt_connect_client_info_t</a></li>
diff --git a/doc/doxygen/output/html/functions_vars_z.html b/doc/doxygen/output/html/functions_vars_z.html
index 9a6f5b3..a4c02fa 100644
--- a/doc/doxygen/output/html/functions_vars_z.html
+++ b/doc/doxygen/output/html/functions_vars_z.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/functions_w.html b/doc/doxygen/output/html/functions_w.html
index 570bfdd..c7f1611 100644
--- a/doc/doxygen/output/html/functions_w.html
+++ b/doc/doxygen/output/html/functions_w.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
 
 <h3><a id="index_w" name="index_w"></a>- w -</h3><ul>
-<li>w&#160;:&#160;<a class="el" href="structapi__msg.html#ac0637c6f4dbb3f64f95d5181d55e663c">api_msg</a></li>
+<li>w&#160;:&#160;<a class="el" href="structapi__msg.html#a0abfc9bda0b00554628bc3169d8f21bf">api_msg</a></li>
 <li>will_msg&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7">mqtt_connect_client_info_t</a></li>
 <li>will_qos&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9">mqtt_connect_client_info_t</a></li>
 <li>will_retain&#160;:&#160;<a class="el" href="structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3">mqtt_connect_client_info_t</a></li>
diff --git a/doc/doxygen/output/html/functions_z.html b/doc/doxygen/output/html/functions_z.html
index d95a323..4502203 100644
--- a/doc/doxygen/output/html/functions_z.html
+++ b/doc/doxygen/output/html/functions_z.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals.html b/doc/doxygen/output/html/globals.html
index ba9c6d1..f47be41 100644
--- a/doc/doxygen/output/html/globals.html
+++ b/doc/doxygen/output/html/globals.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,9 +100,21 @@
 <div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
 
 <h3><a id="index_a" name="index_a"></a>- a -</h3><ul>
+<li>acd_add()&#160;:&#160;<a class="el" href="group__acd.html#ga158856bf139cb2761837ddfa07303bdc">acd.c</a>, <a class="el" href="group__acd.html#ga158856bf139cb2761837ddfa07303bdc">acd.h</a></li>
+<li>acd_arp_reply()&#160;:&#160;<a class="el" href="acd_8c.html#aa92e21410d0f0d357ab9166cda24937a">acd.c</a>, <a class="el" href="acd_8h.html#aa92e21410d0f0d357ab9166cda24937a">acd.h</a></li>
+<li>acd_conflict_callback_t&#160;:&#160;<a class="el" href="acd_8h.html#abb446404752f56b028eafa8302db955f">acd.h</a></li>
+<li>ACD_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#ga87ff0c6077b9a36b05c3fc5b8fae8ad3">opt.h</a></li>
+<li>acd_netif_ip_addr_changed()&#160;:&#160;<a class="el" href="group__acd.html#ga18b444f6fc69325416b463208a754c97">acd.c</a>, <a class="el" href="group__acd.html#ga18b444f6fc69325416b463208a754c97">acd.h</a></li>
+<li>acd_network_changed_link_down()&#160;:&#160;<a class="el" href="group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff">acd.c</a>, <a class="el" href="group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff">acd.h</a></li>
+<li>acd_remove()&#160;:&#160;<a class="el" href="group__acd.html#ga70503696bca25e1cfb61fad38b4327da">acd.c</a>, <a class="el" href="group__acd.html#ga70503696bca25e1cfb61fad38b4327da">acd.h</a></li>
+<li>acd_start()&#160;:&#160;<a class="el" href="group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb">acd.c</a>, <a class="el" href="group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb">acd.h</a></li>
+<li>acd_stop()&#160;:&#160;<a class="el" href="group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7">acd.c</a>, <a class="el" href="group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7">acd.h</a></li>
+<li>acd_tmr()&#160;:&#160;<a class="el" href="acd_8c.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e">acd.c</a>, <a class="el" href="acd_8h.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e">acd.h</a></li>
+<li>ACD_TMR_INTERVAL&#160;:&#160;<a class="el" href="acd_8h.html#aace6da0b0dacd77a9d6bd11f424ffa82">acd.h</a></li>
 <li>altcp_abort()&#160;:&#160;<a class="el" href="group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab">altcp.c</a>, <a class="el" href="group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab">altcp.h</a></li>
 <li>altcp_accept()&#160;:&#160;<a class="el" href="group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9">altcp.c</a>, <a class="el" href="group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9">altcp.h</a></li>
 <li>altcp_alloc()&#160;:&#160;<a class="el" href="altcp_8c.html#aa74c9fc358cffeeb7311b4212b0d6fc7">altcp.c</a>, <a class="el" href="altcp__priv_8h.html#aa74c9fc358cffeeb7311b4212b0d6fc7">altcp_priv.h</a></li>
+<li>altcp_allocator_t&#160;:&#160;<a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp.h</a></li>
 <li>altcp_arg()&#160;:&#160;<a class="el" href="group__altcp.html#ga197a33af038556a04d8f27c7033d771f">altcp.c</a>, <a class="el" href="group__altcp.html#ga197a33af038556a04d8f27c7033d771f">altcp.h</a></li>
 <li>altcp_bind()&#160;:&#160;<a class="el" href="group__altcp.html#ga485b248680f73b9876d8674029c5157c">altcp.c</a>, <a class="el" href="group__altcp.html#ga485b248680f73b9876d8674029c5157c">altcp.h</a></li>
 <li>altcp_close()&#160;:&#160;<a class="el" href="group__altcp.html#ga4329798afdf3709c789a2ee060ee3993">altcp.c</a>, <a class="el" href="group__altcp.html#ga4329798afdf3709c789a2ee060ee3993">altcp.h</a></li>
@@ -110,6 +122,7 @@
 <li>altcp_err()&#160;:&#160;<a class="el" href="group__altcp.html#gadc76a1f3b2448559dc87da1b33291644">altcp.c</a>, <a class="el" href="group__altcp.html#gadc76a1f3b2448559dc87da1b33291644">altcp.h</a></li>
 <li>altcp_free()&#160;:&#160;<a class="el" href="altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d">altcp.c</a>, <a class="el" href="altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d">altcp_priv.h</a></li>
 <li>altcp_listen_with_backlog_and_err()&#160;:&#160;<a class="el" href="group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f">altcp.c</a>, <a class="el" href="group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f">altcp.h</a></li>
+<li>ALTCP_MBEDTLS_AUTHMODE&#160;:&#160;<a class="el" href="altcp__tls__mbedtls__opts_8h.html#a12aba61586bd71cb42b0925b9211b366">altcp_tls_mbedtls_opts.h</a></li>
 <li>ALTCP_MBEDTLS_DEBUG&#160;:&#160;<a class="el" href="altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989">altcp_tls_mbedtls_opts.h</a></li>
 <li>ALTCP_MBEDTLS_LIB_DEBUG&#160;:&#160;<a class="el" href="altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308">altcp_tls_mbedtls_opts.h</a></li>
 <li>ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN&#160;:&#160;<a class="el" href="altcp__tls__mbedtls__opts_8h.html#ad8561bbfabb4ec81ad1c4d7304d16bb5">altcp_tls_mbedtls_opts.h</a></li>
@@ -140,14 +153,19 @@
 <li>altcp_tcp_alloc()&#160;:&#160;<a class="el" href="altcp__tcp_8c.html#a77582c93bb8a0aa2719e86b8c8505e8a">altcp_tcp.c</a>, <a class="el" href="altcp__tcp_8h.html#a77582c93bb8a0aa2719e86b8c8505e8a">altcp_tcp.h</a></li>
 <li>altcp_tls_alloc()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc">altcp_alloc.c</a>, <a class="el" href="group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc">altcp_tls.h</a></li>
 <li>altcp_tls_config_server_add_privkey_cert()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e">altcp_tls.h</a></li>
+<li>altcp_tls_configure_alpn_protocols()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga1f60b12a6a4440214b7bcf2e3ba43126">altcp_tls.h</a></li>
 <li>altcp_tls_context()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7">altcp_tls.h</a></li>
 <li>altcp_tls_create_config_client()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170">altcp_tls.h</a></li>
 <li>altcp_tls_create_config_client_2wayauth()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597">altcp_tls.h</a></li>
-<li>altcp_tls_create_config_server()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gaf6ed13271394371cc89d70ef5128c411">altcp_tls.h</a></li>
+<li>altcp_tls_create_config_server()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gaa37649bf24ebea235a8e3e8f50b9831f">altcp_tls.h</a></li>
 <li>altcp_tls_create_config_server_privkey_cert()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e">altcp_tls.h</a></li>
 <li>altcp_tls_free_config()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145">altcp_tls.h</a></li>
 <li>altcp_tls_free_entropy()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2">altcp_tls.h</a></li>
+<li>altcp_tls_free_session()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga906eefcef66e9dd2b43c3392704905f5">altcp_tls.h</a></li>
+<li>altcp_tls_get_session()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga827c76a0bddc4923b9a17c813e13891e">altcp_tls.h</a></li>
+<li>altcp_tls_init_session()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gae6c3cf72fcd29e6ea4c74181370420c3">altcp_tls.h</a></li>
 <li>altcp_tls_new()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8">altcp_alloc.c</a>, <a class="el" href="group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8">altcp_tls.h</a></li>
+<li>altcp_tls_set_session()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga4aed4aa55d0e1b15f4118863cea06d18">altcp_tls.h</a></li>
 <li>altcp_tls_wrap()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c">altcp_tls.h</a></li>
 <li>altcp_write()&#160;:&#160;<a class="el" href="group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d">altcp.c</a>, <a class="el" href="group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d">altcp.h</a></li>
 <li>API_EVENT&#160;:&#160;<a class="el" href="api_8h.html#a3ce590f58be8f60dbde361920863b26d">api.h</a></li>
@@ -160,16 +178,14 @@
 <li>ARP_QUEUEING&#160;:&#160;<a class="el" href="group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58">opt.h</a></li>
 <li>ARP_TABLE_SIZE&#160;:&#160;<a class="el" href="group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9">opt.h</a></li>
 <li>ARP_TMR_INTERVAL&#160;:&#160;<a class="el" href="lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37">etharp.h</a></li>
-<li>autoip_arp_reply()&#160;:&#160;<a class="el" href="autoip_8c.html#acaf2793325c60dc4531c21a3fd55c16e">autoip.c</a>, <a class="el" href="autoip_8h.html#acaf2793325c60dc4531c21a3fd55c16e">autoip.h</a></li>
 <li>AUTOIP_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5">opt.h</a></li>
-<li>autoip_network_changed()&#160;:&#160;<a class="el" href="autoip_8c.html#a11df7a20d52680cd8c1c18fba2b91e9e">autoip.c</a>, <a class="el" href="autoip_8h.html#a11df7a20d52680cd8c1c18fba2b91e9e">autoip.h</a></li>
-<li>autoip_remove_struct&#160;:&#160;<a class="el" href="autoip_8h.html#aaeb4b778fce078bee84144ab50916b15">autoip.h</a></li>
+<li>autoip_network_changed_link_down()&#160;:&#160;<a class="el" href="autoip_8c.html#af93544c49f2c24b95a3981351d023056">autoip.c</a>, <a class="el" href="autoip_8h.html#af93544c49f2c24b95a3981351d023056">autoip.h</a></li>
+<li>autoip_network_changed_link_up()&#160;:&#160;<a class="el" href="autoip_8c.html#af2a36aee96cbdf8f4a8f1e69c91ff425">autoip.c</a>, <a class="el" href="autoip_8h.html#af2a36aee96cbdf8f4a8f1e69c91ff425">autoip.h</a></li>
+<li>autoip_remove_struct()&#160;:&#160;<a class="el" href="group__autoip.html#gac0c98035795500ede464aa4af2515f30">autoip.c</a>, <a class="el" href="group__autoip.html#gac0c98035795500ede464aa4af2515f30">autoip.h</a></li>
 <li>autoip_set_struct()&#160;:&#160;<a class="el" href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90">autoip.c</a>, <a class="el" href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90">autoip.h</a></li>
 <li>autoip_start()&#160;:&#160;<a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip.c</a>, <a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip.h</a></li>
 <li>autoip_stop()&#160;:&#160;<a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip.c</a>, <a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip.h</a></li>
-<li>autoip_supplied_address()&#160;:&#160;<a class="el" href="autoip_8c.html#a1b4f0c53da17395d9de92a85708a1bb9">autoip.c</a>, <a class="el" href="autoip_8h.html#a1b4f0c53da17395d9de92a85708a1bb9">autoip.h</a></li>
-<li>autoip_tmr()&#160;:&#160;<a class="el" href="autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip.c</a>, <a class="el" href="autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip.h</a></li>
-<li>AUTOIP_TMR_INTERVAL&#160;:&#160;<a class="el" href="autoip_8h.html#a8986919a452ab77eec9a199ff6668e92">autoip.h</a></li>
+<li>autoip_supplied_address()&#160;:&#160;<a class="el" href="autoip_8c.html#a6de97b7dcd98f9039d5c1ad11c257d62">autoip.c</a>, <a class="el" href="autoip_8h.html#a6de97b7dcd98f9039d5c1ad11c257d62">autoip.h</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/globals_b.html b/doc/doxygen/output/html/globals_b.html
index 7c1b561..4586727 100644
--- a/doc/doxygen/output/html/globals_b.html
+++ b/doc/doxygen/output/html/globals_b.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
 
 <h3><a id="index_b" name="index_b"></a>- b -</h3><ul>
-<li>ble_addr_to_eui64()&#160;:&#160;<a class="el" href="group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c">lowpan6_ble.h</a>, <a class="el" href="group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c">lowpan6_ble.c</a></li>
+<li>ble_addr_to_eui64()&#160;:&#160;<a class="el" href="group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f">lowpan6_ble.h</a>, <a class="el" href="group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f">lowpan6_ble.c</a></li>
 <li>bridgeif_add_port()&#160;:&#160;<a class="el" href="group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77">bridgeif.h</a>, <a class="el" href="group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77">bridgeif.c</a></li>
 <li>BRIDGEIF_DEBUG&#160;:&#160;<a class="el" href="group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73">bridgeif_opts.h</a></li>
 <li>bridgeif_fdb_add()&#160;:&#160;<a class="el" href="group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666">bridgeif.h</a>, <a class="el" href="group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666">bridgeif.c</a></li>
diff --git a/doc/doxygen/output/html/globals_c.html b/doc/doxygen/output/html/globals_c.html
index 5af471f..459fdd6 100644
--- a/doc/doxygen/output/html/globals_c.html
+++ b/doc/doxygen/output/html/globals_c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_d.html b/doc/doxygen/output/html/globals_d.html
index a6dd83a..96cb051 100644
--- a/doc/doxygen/output/html/globals_d.html
+++ b/doc/doxygen/output/html/globals_d.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -121,32 +121,30 @@
 <li>DHCP6_STATUS_SUCCESS&#160;:&#160;<a class="el" href="prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175">dhcp6.h</a></li>
 <li>DHCP6_TIMER_MSECS&#160;:&#160;<a class="el" href="dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f">dhcp6.h</a></li>
 <li>dhcp6_tmr()&#160;:&#160;<a class="el" href="dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d">dhcp6.c</a>, <a class="el" href="dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d">dhcp6.h</a></li>
-<li>dhcp_arp_reply()&#160;:&#160;<a class="el" href="dhcp_8c.html#a1fc0a94e0b94f13c5d302018f7ecb535">dhcp.c</a>, <a class="el" href="dhcp_8h.html#a1fc0a94e0b94f13c5d302018f7ecb535">dhcp.h</a></li>
+<li>DHCP_ADD_EXTRA_REQUEST_OPTIONS&#160;:&#160;<a class="el" href="dhcp_8c.html#aa29d020558b37b29d5d5ae50dfeb0c88">dhcp.c</a></li>
 <li>dhcp_cleanup()&#160;:&#160;<a class="el" href="group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64">dhcp.c</a>, <a class="el" href="group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64">dhcp.h</a></li>
 <li>DHCP_COARSE_TIMER_MSECS&#160;:&#160;<a class="el" href="dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6">dhcp.h</a></li>
 <li>DHCP_COARSE_TIMER_SECS&#160;:&#160;<a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">dhcp.h</a></li>
 <li>dhcp_coarse_tmr()&#160;:&#160;<a class="el" href="dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb">dhcp.c</a>, <a class="el" href="dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb">dhcp.h</a></li>
 <li>DHCP_CREATE_RAND_XID&#160;:&#160;<a class="el" href="dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835">dhcp.c</a></li>
 <li>DHCP_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee">opt.h</a></li>
-<li>DHCP_DOES_ARP_CHECK&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69">opt.h</a></li>
 <li>DHCP_FINE_TIMER_MSECS&#160;:&#160;<a class="el" href="dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f">dhcp.h</a></li>
 <li>dhcp_fine_tmr()&#160;:&#160;<a class="el" href="dhcp_8c.html#a601d97faa24fa7289244bb452f052045">dhcp.c</a>, <a class="el" href="dhcp_8h.html#a601d97faa24fa7289244bb452f052045">dhcp.h</a></li>
 <li>dhcp_inform()&#160;:&#160;<a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp.c</a>, <a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp.h</a></li>
 <li>DHCP_MAX_MSG_LEN&#160;:&#160;<a class="el" href="dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b">dhcp.c</a></li>
 <li>DHCP_MIN_REPLY_LEN&#160;:&#160;<a class="el" href="dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab">dhcp.c</a></li>
-<li>dhcp_network_changed()&#160;:&#160;<a class="el" href="dhcp_8c.html#a04f3824720223c439165243527906002">dhcp.c</a>, <a class="el" href="dhcp_8h.html#a04f3824720223c439165243527906002">dhcp.h</a></li>
+<li>dhcp_network_changed_link_up()&#160;:&#160;<a class="el" href="dhcp_8c.html#a2fd33722859054ea932ff05ff62dedaa">dhcp.c</a>, <a class="el" href="dhcp_8h.html#a2fd33722859054ea932ff05ff62dedaa">dhcp.h</a></li>
 <li>dhcp_option_idx&#160;:&#160;<a class="el" href="dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0">dhcp.c</a></li>
 <li>DHCP_OPTIONS_LEN&#160;:&#160;<a class="el" href="prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06">dhcp.h</a></li>
 <li>dhcp_release()&#160;:&#160;<a class="el" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp.c</a>, <a class="el" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp.h</a></li>
 <li>dhcp_release_and_stop()&#160;:&#160;<a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp.c</a>, <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp.h</a></li>
 <li>dhcp_remove_struct&#160;:&#160;<a class="el" href="dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc">dhcp.h</a></li>
 <li>dhcp_renew()&#160;:&#160;<a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp.c</a>, <a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp.h</a></li>
-<li>dhcp_rx_options_given&#160;:&#160;<a class="el" href="dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc">dhcp.c</a></li>
-<li>dhcp_rx_options_val&#160;:&#160;<a class="el" href="dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f">dhcp.c</a></li>
 <li>dhcp_set_struct()&#160;:&#160;<a class="el" href="group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8">dhcp.c</a>, <a class="el" href="group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8">dhcp.h</a></li>
 <li>dhcp_start()&#160;:&#160;<a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp.c</a>, <a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp.h</a></li>
 <li>dhcp_stop()&#160;:&#160;<a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp.c</a>, <a class="el" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp.h</a></li>
 <li>dhcp_supplied_address()&#160;:&#160;<a class="el" href="dhcp_8c.html#ae24a2529372218327ab9cb6592041c85">dhcp.c</a>, <a class="el" href="dhcp_8h.html#ae24a2529372218327ab9cb6592041c85">dhcp.h</a></li>
+<li>dhcp_timeout_t&#160;:&#160;<a class="el" href="dhcp_8h.html#aa85d661c7e160921c0497e7baa892b67">dhcp.h</a></li>
 <li>DNS_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f">opt.h</a></li>
 <li>DNS_DOES_NAME_CHECK&#160;:&#160;<a class="el" href="group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6">opt.h</a></li>
 <li>dns_found_callback&#160;:&#160;<a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns.h</a></li>
diff --git a/doc/doxygen/output/html/globals_defs.html b/doc/doxygen/output/html/globals_defs.html
index 3d910a6..11c1f01 100644
--- a/doc/doxygen/output/html/globals_defs.html
+++ b/doc/doxygen/output/html/globals_defs.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,6 +100,9 @@
 <div class="textblock">Here is a list of all documented macros with links to the documentation:</div>
 
 <h3><a id="index_a" name="index_a"></a>- a -</h3><ul>
+<li>ACD_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#ga87ff0c6077b9a36b05c3fc5b8fae8ad3">opt.h</a></li>
+<li>ACD_TMR_INTERVAL&#160;:&#160;<a class="el" href="acd_8h.html#aace6da0b0dacd77a9d6bd11f424ffa82">acd.h</a></li>
+<li>ALTCP_MBEDTLS_AUTHMODE&#160;:&#160;<a class="el" href="altcp__tls__mbedtls__opts_8h.html#a12aba61586bd71cb42b0925b9211b366">altcp_tls_mbedtls_opts.h</a></li>
 <li>ALTCP_MBEDTLS_DEBUG&#160;:&#160;<a class="el" href="altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989">altcp_tls_mbedtls_opts.h</a></li>
 <li>ALTCP_MBEDTLS_LIB_DEBUG&#160;:&#160;<a class="el" href="altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308">altcp_tls_mbedtls_opts.h</a></li>
 <li>ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN&#160;:&#160;<a class="el" href="altcp__tls__mbedtls__opts_8h.html#ad8561bbfabb4ec81ad1c4d7304d16bb5">altcp_tls_mbedtls_opts.h</a></li>
@@ -121,8 +124,6 @@
 <li>ARP_TABLE_SIZE&#160;:&#160;<a class="el" href="group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9">opt.h</a></li>
 <li>ARP_TMR_INTERVAL&#160;:&#160;<a class="el" href="lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37">etharp.h</a></li>
 <li>AUTOIP_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5">opt.h</a></li>
-<li>autoip_remove_struct&#160;:&#160;<a class="el" href="autoip_8h.html#aaeb4b778fce078bee84144ab50916b15">autoip.h</a></li>
-<li>AUTOIP_TMR_INTERVAL&#160;:&#160;<a class="el" href="autoip_8h.html#a8986919a452ab77eec9a199ff6668e92">autoip.h</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/globals_defs.js b/doc/doxygen/output/html/globals_defs.js
index f8875b2..3efe727 100644
--- a/doc/doxygen/output/html/globals_defs.js
+++ b/doc/doxygen/output/html/globals_defs.js
@@ -12,6 +12,7 @@
     [ "m", "globals_defs_m.html", null ],
     [ "n", "globals_defs_n.html", null ],
     [ "p", "globals_defs_p.html", null ],
+    [ "q", "globals_defs_q.html", null ],
     [ "r", "globals_defs_r.html", null ],
     [ "s", "globals_defs_s.html", null ],
     [ "t", "globals_defs_t.html", null ],
diff --git a/doc/doxygen/output/html/globals_defs_b.html b/doc/doxygen/output/html/globals_defs_b.html
index 0a68b8f..caaa707 100644
--- a/doc/doxygen/output/html/globals_defs_b.html
+++ b/doc/doxygen/output/html/globals_defs_b.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_defs_c.html b/doc/doxygen/output/html/globals_defs_c.html
index 7de495b..9e29f75 100644
--- a/doc/doxygen/output/html/globals_defs_c.html
+++ b/doc/doxygen/output/html/globals_defs_c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_defs_d.html b/doc/doxygen/output/html/globals_defs_d.html
index 94816c8..fcad1a8 100644
--- a/doc/doxygen/output/html/globals_defs_d.html
+++ b/doc/doxygen/output/html/globals_defs_d.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -112,11 +112,11 @@
 <li>dhcp6_remove_struct&#160;:&#160;<a class="el" href="dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3">dhcp6.h</a></li>
 <li>DHCP6_STATUS_SUCCESS&#160;:&#160;<a class="el" href="prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175">dhcp6.h</a></li>
 <li>DHCP6_TIMER_MSECS&#160;:&#160;<a class="el" href="dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f">dhcp6.h</a></li>
+<li>DHCP_ADD_EXTRA_REQUEST_OPTIONS&#160;:&#160;<a class="el" href="dhcp_8c.html#aa29d020558b37b29d5d5ae50dfeb0c88">dhcp.c</a></li>
 <li>DHCP_COARSE_TIMER_MSECS&#160;:&#160;<a class="el" href="dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6">dhcp.h</a></li>
 <li>DHCP_COARSE_TIMER_SECS&#160;:&#160;<a class="el" href="dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e">dhcp.h</a></li>
 <li>DHCP_CREATE_RAND_XID&#160;:&#160;<a class="el" href="dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835">dhcp.c</a></li>
 <li>DHCP_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee">opt.h</a></li>
-<li>DHCP_DOES_ARP_CHECK&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69">opt.h</a></li>
 <li>DHCP_FINE_TIMER_MSECS&#160;:&#160;<a class="el" href="dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f">dhcp.h</a></li>
 <li>DHCP_MAX_MSG_LEN&#160;:&#160;<a class="el" href="dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b">dhcp.c</a></li>
 <li>DHCP_MIN_REPLY_LEN&#160;:&#160;<a class="el" href="dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab">dhcp.c</a></li>
diff --git a/doc/doxygen/output/html/globals_defs_e.html b/doc/doxygen/output/html/globals_defs_e.html
index eef0f2a..1182376 100644
--- a/doc/doxygen/output/html/globals_defs_e.html
+++ b/doc/doxygen/output/html/globals_defs_e.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_defs_f.html b/doc/doxygen/output/html/globals_defs_f.html
index 1b78ae4..c339c1b 100644
--- a/doc/doxygen/output/html/globals_defs_f.html
+++ b/doc/doxygen/output/html/globals_defs_f.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_defs_h.html b/doc/doxygen/output/html/globals_defs_h.html
index 9785833..748ae81 100644
--- a/doc/doxygen/output/html/globals_defs_h.html
+++ b/doc/doxygen/output/html/globals_defs_h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,6 @@
 <div class="textblock">Here is a list of all documented macros with links to the documentation:</div>
 
 <h3><a id="index_h" name="index_h"></a>- h -</h3><ul>
-<li>HOSTENT_STORAGE&#160;:&#160;<a class="el" href="netdb_8c.html#acfc1e988534c0e497599b904739f92fe">netdb.c</a></li>
 <li>HTTP_DEFAULT_PORT&#160;:&#160;<a class="el" href="group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2">http_client.h</a></li>
 <li>HTTP_IS_DATA_VOLATILE&#160;:&#160;<a class="el" href="httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300">httpd.c</a></li>
 <li>HTTP_IS_HDR_VOLATILE&#160;:&#160;<a class="el" href="httpd_8c.html#af281bc4a762d56243e0b85dd4197174a">httpd.c</a></li>
diff --git a/doc/doxygen/output/html/globals_defs_i.html b/doc/doxygen/output/html/globals_defs_i.html
index 9690561..a9a437b 100644
--- a/doc/doxygen/output/html/globals_defs_i.html
+++ b/doc/doxygen/output/html/globals_defs_i.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -116,10 +116,12 @@
 <li>IP4_ADDR&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974">ip4_addr.h</a></li>
 <li>IP4_ADDR_ANY&#160;:&#160;<a class="el" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">ip_addr.h</a></li>
 <li>IP4_ADDR_ANY4&#160;:&#160;<a class="el" href="group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42">ip_addr.h</a></li>
+<li>ip4_addr_cmp&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a59494c562c62fdf62a6c9c6a66a50fb3">ip4_addr.h</a></li>
 <li>ip4_addr_copy&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5">ip4_addr.h</a></li>
 <li>ip4_addr_get_network&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9">ip4_addr.h</a></li>
 <li>ip4_addr_get_u32&#160;:&#160;<a class="el" href="ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b">ip4_addr.h</a></li>
 <li>ip4_addr_isloopback&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051">ip4_addr.h</a></li>
+<li>ip4_addr_net_eq&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a95d05df9201602fc873a97fb61fd1134">ip4_addr.h</a></li>
 <li>ip4_addr_netcmp&#160;:&#160;<a class="el" href="ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514">ip4_addr.h</a></li>
 <li>ip4_addr_set&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88">ip4_addr.h</a></li>
 <li>ip4_addr_set_any&#160;:&#160;<a class="el" href="ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567">ip4_addr.h</a></li>
@@ -145,18 +147,22 @@
 <li>ip6_addr_clear_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad">ip6_zone.h</a></li>
 <li>ip6_addr_cmp&#160;:&#160;<a class="el" href="ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1">ip6_addr.h</a></li>
 <li>ip6_addr_cmp_packed&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8">ip6_addr.h</a></li>
-<li>ip6_addr_cmp_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9">ip6_zone.h</a></li>
+<li>ip6_addr_cmp_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gac01d0bad0a682dcc239ba3d5695e0648">ip6_zone.h</a></li>
 <li>ip6_addr_cmp_zoneless&#160;:&#160;<a class="el" href="ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322">ip6_addr.h</a></li>
 <li>ip6_addr_copy&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073">ip6_addr.h</a></li>
 <li>ip6_addr_copy_from_packed&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3">ip6_addr.h</a></li>
 <li>ip6_addr_copy_to_packed&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b">ip6_addr.h</a></li>
 <li>ip6_addr_copy_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4">ip6_zone.h</a></li>
+<li>ip6_addr_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a9ea0b6b837baff1e1e62cccd4f17d50e">ip6_addr.h</a></li>
 <li>ip6_addr_equals_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f">ip6_zone.h</a></li>
 <li>ip6_addr_has_scope&#160;:&#160;<a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_zone.h</a></li>
 <li>ip6_addr_has_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78">ip6_zone.h</a></li>
 <li>ip6_addr_lacks_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97">ip6_zone.h</a></li>
+<li>ip6_addr_net_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a9a983c7d613ab45e37aaf66c067a0c7a">ip6_addr.h</a></li>
+<li>ip6_addr_net_zoneless_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#afc9d2b8d0a05f2ff23ab3b7fd3bf8229">ip6_addr.h</a></li>
 <li>ip6_addr_netcmp&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2">ip6_addr.h</a></li>
 <li>ip6_addr_netcmp_zoneless&#160;:&#160;<a class="el" href="ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342">ip6_addr.h</a></li>
+<li>ip6_addr_packed_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#aa324ac65d537997ebaaed78bd40f6da9">ip6_addr.h</a></li>
 <li>IP6_ADDR_PART&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd">ip6_addr.h</a></li>
 <li>ip6_addr_select_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c">ip6_zone.h</a></li>
 <li>ip6_addr_set&#160;:&#160;<a class="el" href="ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad">ip6_addr.h</a></li>
@@ -167,6 +173,8 @@
 <li>ip6_addr_set_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6">ip6_zone.h</a></li>
 <li>ip6_addr_test_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e">ip6_zone.h</a></li>
 <li>ip6_addr_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_zone.h</a></li>
+<li>ip6_addr_zone_eq&#160;:&#160;<a class="el" href="group__ip6__zones.html#gabc6d5f833b2abef31aa602dc11ace0a9">ip6_zone.h</a></li>
+<li>ip6_addr_zoneless_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a811d8a2aa6417ae22a7a46b27d9ead26">ip6_addr.h</a></li>
 <li>ip6_current_dest_addr&#160;:&#160;<a class="el" href="ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0">ip.h</a></li>
 <li>ip6_current_header&#160;:&#160;<a class="el" href="ip_8h.html#af9bf74750c9d7a219ee88d240300fe69">ip.h</a></li>
 <li>ip6_current_src_addr&#160;:&#160;<a class="el" href="ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245">ip.h</a></li>
@@ -179,6 +187,19 @@
 <li>ip_2_ip6&#160;:&#160;<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_addr.h</a></li>
 <li>IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT&#160;:&#160;<a class="el" href="ip4_8c.html#a185c7d6380711847105430931692b267">ip4.c</a></li>
 <li>IP_ADDR_ANY&#160;:&#160;<a class="el" href="group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c">ip_addr.h</a></li>
+<li>ip_addr_cmp&#160;:&#160;<a class="el" href="group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a">ip_addr.h</a></li>
+<li>ip_addr_cmp_zoneless&#160;:&#160;<a class="el" href="group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4">ip_addr.h</a></li>
+<li>ip_addr_eq&#160;:&#160;<a class="el" href="group__ipaddr.html#ga5b40158bdffa4b0c81c4ee77066e6b28">ip_addr.h</a></li>
+<li>ip_addr_isany&#160;:&#160;<a class="el" href="group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4">ip_addr.h</a></li>
+<li>ip_addr_isany_val&#160;:&#160;<a class="el" href="group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05">ip_addr.h</a></li>
+<li>ip_addr_isbroadcast&#160;:&#160;<a class="el" href="group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75">ip_addr.h</a></li>
+<li>ip_addr_islinklocal&#160;:&#160;<a class="el" href="group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653">ip_addr.h</a></li>
+<li>ip_addr_isloopback&#160;:&#160;<a class="el" href="group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e">ip_addr.h</a></li>
+<li>ip_addr_ismulticast&#160;:&#160;<a class="el" href="group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752">ip_addr.h</a></li>
+<li>ip_addr_net_eq&#160;:&#160;<a class="el" href="group__ipaddr.html#gad1bbbe4c93ea2368663e90814953b929">ip_addr.h</a></li>
+<li>ip_addr_netcmp&#160;:&#160;<a class="el" href="group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb">ip_addr.h</a></li>
+<li>ip_addr_zoneless_eq&#160;:&#160;<a class="el" href="group__ipaddr.html#ga8ac2686417ec2974bb0b3fc6ee0ee1a7">ip_addr.h</a></li>
+<li>IP_ANY_TYPE&#160;:&#160;<a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">ip_addr.h</a></li>
 <li>ip_current_dest_addr&#160;:&#160;<a class="el" href="ip_8h.html#a9135977868017c3deeec86b525e13997">ip.h</a></li>
 <li>ip_current_header_proto&#160;:&#160;<a class="el" href="ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f">ip.h</a></li>
 <li>ip_current_header_tot_len&#160;:&#160;<a class="el" href="ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2">ip.h</a></li>
diff --git a/doc/doxygen/output/html/globals_defs_l.html b/doc/doxygen/output/html/globals_defs_l.html
index 83593fc..56a955f 100644
--- a/doc/doxygen/output/html/globals_defs_l.html
+++ b/doc/doxygen/output/html/globals_defs_l.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -110,6 +110,7 @@
 <li>LWIP_6LOWPAN_INFER_SHORT_ADDRESS&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207">lowpan6_opts.h</a></li>
 <li>LWIP_6LOWPAN_IPHC&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa">lowpan6_opts.h</a></li>
 <li>LWIP_6LOWPAN_NUM_CONTEXTS&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a">lowpan6_opts.h</a></li>
+<li>LWIP_ACD&#160;:&#160;<a class="el" href="group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7">opt.h</a></li>
 <li>LWIP_ALIGNMENT_CAST&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8">arch.h</a></li>
 <li>LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT&#160;:&#160;<a class="el" href="group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2">opt.h</a></li>
 <li>LWIP_ALTCP&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77">opt.h</a></li>
@@ -120,7 +121,6 @@
 <li>LWIP_ASSERT_CORE_LOCKED&#160;:&#160;<a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">opt.h</a></li>
 <li>LWIP_AUTOIP&#160;:&#160;<a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">opt.h</a></li>
 <li>LWIP_AUTOIP_CREATE_SEED_ADDR&#160;:&#160;<a class="el" href="autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43">autoip.c</a></li>
-<li>LWIP_AUTOIP_RAND&#160;:&#160;<a class="el" href="autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59">autoip.c</a></li>
 <li>LWIP_BROADCAST_PING&#160;:&#160;<a class="el" href="group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9">opt.h</a></li>
 <li>LWIP_CHECKSUM_CTRL_PER_NETIF&#160;:&#160;<a class="el" href="group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004">opt.h</a></li>
 <li>LWIP_CHECKSUM_ON_COPY&#160;:&#160;<a class="el" href="group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613">opt.h</a></li>
@@ -148,6 +148,8 @@
 <li>LWIP_DHCP_AUTOIP_COOP&#160;:&#160;<a class="el" href="group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe">opt.h</a></li>
 <li>LWIP_DHCP_AUTOIP_COOP_TRIES&#160;:&#160;<a class="el" href="group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2">opt.h</a></li>
 <li>LWIP_DHCP_BOOTP_FILE&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423">opt.h</a></li>
+<li>LWIP_DHCP_DISCOVER_ADD_HOSTNAME&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#gad6b030f8e828666953661578f936e605">opt.h</a></li>
+<li>LWIP_DHCP_DOES_ACD_CHECK&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55">opt.h</a></li>
 <li>LWIP_DHCP_GET_NTP_SRV&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83">opt.h</a></li>
 <li>LWIP_DHCP_MAX_DNS_SERVERS&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6">opt.h</a></li>
 <li>LWIP_DHCP_MAX_NTP_SERVERS&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2">opt.h</a></li>
@@ -189,6 +191,7 @@
 <li>LWIP_HTTPD_CUSTOM_FILES&#160;:&#160;<a class="el" href="group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_DYNAMIC_FILE_READ&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_DYNAMIC_HEADERS&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7">httpd_opts.h</a></li>
+<li>LWIP_HTTPD_FILE_EXTENSION&#160;:&#160;<a class="el" href="group__httpd__opts.html#gaa3648a9fdefe3ab1c890b715a4786429">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_FILE_STATE&#160;:&#160;<a class="el" href="group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_FS_ASYNC_READ&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga0d5074965efd40786182287895feb691">httpd_opts.h</a></li>
@@ -200,6 +203,7 @@
 <li>LWIP_HTTPD_REQ_QUEUELEN&#160;:&#160;<a class="el" href="group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI&#160;:&#160;<a class="el" href="group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI_BY_FILE_EXTENSION&#160;:&#160;<a class="el" href="group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466">httpd_opts.h</a></li>
+<li>LWIP_HTTPD_SSI_EXTENSIONS&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga006baa7219cff5ee02f5a14ef7d7c89d">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI_INCLUDE_TAG&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI_MULTIPART&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI_RAW&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5">httpd_opts.h</a></li>
@@ -240,7 +244,8 @@
 <li>LWIP_LOWPAN6_DECOMPRESSION_DEBUG&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0">lowpan6_opts.h</a></li>
 <li>LWIP_LOWPAN6_IP_COMPRESSED_DEBUG&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8">lowpan6_opts.h</a></li>
 <li>LWIP_MAKEU32&#160;:&#160;<a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">def.h</a></li>
-<li>LWIP_MARK_TCPIP_THREAD&#160;:&#160;<a class="el" href="group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e">opt.h</a></li>
+<li>LWIP_MARK_TCPIP_THREAD&#160;:&#160;<a class="el" href="group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e">sys.h</a></li>
+<li>LWIP_MDNS_SEARCH&#160;:&#160;<a class="el" href="group__mdns__opts.html#gaaf489604dcdf94d2adcd723f6c7d7163">mdns_opts.h</a></li>
 <li>LWIP_MEM_ALIGN&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc">arch.h</a></li>
 <li>LWIP_MEM_ALIGN_BUFFER&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e">arch.h</a></li>
 <li>LWIP_MEM_ALIGN_SIZE&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">arch.h</a></li>
@@ -289,6 +294,7 @@
 <li>LWIP_NO_STDDEF_H&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d">arch.h</a></li>
 <li>LWIP_NO_STDINT_H&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1">arch.h</a></li>
 <li>LWIP_NOASSERT&#160;:&#160;<a class="el" href="group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41">debug.h</a></li>
+<li>LWIP_NSC_IPV4_ADDR_VALID&#160;:&#160;<a class="el" href="netif_8h.html#a716576f3485524d44ef0843839ef0564">netif.h</a></li>
 <li>LWIP_NSC_IPV4_ADDRESS_CHANGED&#160;:&#160;<a class="el" href="netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32">netif.h</a></li>
 <li>LWIP_NSC_IPV4_GATEWAY_CHANGED&#160;:&#160;<a class="el" href="netif_8h.html#a22400d2202581b4a7273cded712adf49">netif.h</a></li>
 <li>LWIP_NSC_IPV4_NETMASK_CHANGED&#160;:&#160;<a class="el" href="netif_8h.html#ad747072771a887443ab33f90a12077d4">netif.h</a></li>
@@ -325,6 +331,7 @@
 <li>LWIP_SO_SNDRCVTIMEO_NONSTANDARD&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942">opt.h</a></li>
 <li>LWIP_SO_SNDTIMEO&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58">opt.h</a></li>
 <li>LWIP_SOCKET&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f">opt.h</a></li>
+<li>LWIP_SOCKET_EXTERNAL_HEADERS&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga524c013ecdd8a45a2949f2a433469e82">opt.h</a></li>
 <li>LWIP_SOCKET_OFFSET&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e">opt.h</a></li>
 <li>LWIP_SOCKET_POLL&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200">opt.h</a></li>
 <li>LWIP_SOCKET_SELECT&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb">opt.h</a></li>
@@ -337,6 +344,7 @@
 <li>LWIP_TCP_KEEPALIVE&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77">opt.h</a></li>
 <li>LWIP_TCP_MAX_SACK_NUM&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc">opt.h</a></li>
 <li>LWIP_TCP_PCB_NUM_EXT_ARGS&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223">opt.h</a></li>
+<li>LWIP_TCP_RTO_TIME&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#gade23373901980c6e7a43cef813386ebe">opt.h</a></li>
 <li>LWIP_TCP_SACK_OUT&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f">opt.h</a></li>
 <li>LWIP_TCP_TIMESTAMPS&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd">opt.h</a></li>
 <li>LWIP_TCPIP_CORE_LOCKING&#160;:&#160;<a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">opt.h</a></li>
diff --git a/doc/doxygen/output/html/globals_defs_m.html b/doc/doxygen/output/html/globals_defs_m.html
index 27ee7c5..2930f78 100644
--- a/doc/doxygen/output/html/globals_defs_m.html
+++ b/doc/doxygen/output/html/globals_defs_m.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,9 +101,15 @@
 
 <h3><a id="index_m" name="index_m"></a>- m -</h3><ul>
 <li>MDNS_DEBUG&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9">mdns_opts.h</a></li>
+<li>MDNS_MAX_REQUESTS&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga17a9884af8169cf19d57d8005fc3d95e">mdns_opts.h</a></li>
 <li>MDNS_MAX_SERVICES&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6">mdns_opts.h</a></li>
+<li>MDNS_MAX_STORED_PKTS&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga827d1d2abd24a26638723cfd0a8b9efd">mdns_opts.h</a></li>
+<li>MDNS_OUTPUT_PACKET_SIZE&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga0f0adf7b1d742b4ea818c1b7f6b0c547">mdns_opts.h</a></li>
+<li>MDNS_PROBE_COUNT&#160;:&#160;<a class="el" href="mdns_8c.html#af24e590bf9c225a2efc0b55fac14809d">mdns.c</a></li>
+<li>MDNS_PROBE_DELAY_MS&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga7f6853d01ad32eb6ce99ae55307a37d9">mdns_opts.h</a></li>
 <li>mdns_resp_netif_settings_changed&#160;:&#160;<a class="el" href="group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec">mdns.h</a></li>
 <li>MDNS_RESP_USENETIF_EXTCALLBACK&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396">mdns_opts.h</a></li>
+<li>MDNS_RESPONSE_DELAY_MAX&#160;:&#160;<a class="el" href="mdns_8c.html#a482d6bf710af4424b71ee57034edbdbe">mdns.c</a></li>
 <li>MEM_ALIGNMENT&#160;:&#160;<a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">opt.h</a></li>
 <li>MEM_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe">opt.h</a></li>
 <li>MEM_LIBC_MALLOC&#160;:&#160;<a class="el" href="group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8">opt.h</a></li>
diff --git a/doc/doxygen/output/html/globals_defs_n.html b/doc/doxygen/output/html/globals_defs_n.html
index dc1a773..8b660e4 100644
--- a/doc/doxygen/output/html/globals_defs_n.html
+++ b/doc/doxygen/output/html/globals_defs_n.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -142,6 +142,8 @@
 <li>NETIF_FLAG_MLD6&#160;:&#160;<a class="el" href="group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508">netif.h</a></li>
 <li>NETIF_FLAG_UP&#160;:&#160;<a class="el" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">netif.h</a></li>
 <li>netif_get_client_data&#160;:&#160;<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif.h</a></li>
+<li>netif_get_igmp_mac_filter&#160;:&#160;<a class="el" href="netif_8h.html#a0a674553c18b429b53397372ea82fcaf">netif.h</a></li>
+<li>netif_get_mld_mac_filter&#160;:&#160;<a class="el" href="netif_8h.html#a046c4816e37c3c4b84b3634eeeea7029">netif.h</a></li>
 <li>netif_igmp_data&#160;:&#160;<a class="el" href="group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d">igmp.h</a></li>
 <li>netif_is_link_up&#160;:&#160;<a class="el" href="netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8">netif.h</a></li>
 <li>netif_is_up&#160;:&#160;<a class="el" href="group__netif.html#ga94a4c24c988afc0a577387730f303b19">netif.h</a></li>
@@ -149,6 +151,8 @@
 <li>netif_mld6_data&#160;:&#160;<a class="el" href="group__mld6.html#ga02a2259082f22c5989a3c929be95e641">mld6.h</a></li>
 <li>NETIF_NAMESIZE&#160;:&#160;<a class="el" href="netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a">netif.h</a></li>
 <li>netif_set_client_data&#160;:&#160;<a class="el" href="group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f">netif.h</a></li>
+<li>netif_set_igmp_mac_filter&#160;:&#160;<a class="el" href="group__netif.html#ga3428b3f8195249c6cd8704a4db46b401">netif.h</a></li>
+<li>netif_set_mld_mac_filter&#160;:&#160;<a class="el" href="group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c">netif.h</a></li>
 <li>netifapi_autoip_start&#160;:&#160;<a class="el" href="group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2">netifapi.h</a></li>
 <li>netifapi_autoip_stop&#160;:&#160;<a class="el" href="group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d">netifapi.h</a></li>
 <li>netifapi_dhcp_inform&#160;:&#160;<a class="el" href="group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0">netifapi.h</a></li>
diff --git a/doc/doxygen/output/html/globals_defs_p.html b/doc/doxygen/output/html/globals_defs_p.html
index db6e73e..ea1af50 100644
--- a/doc/doxygen/output/html/globals_defs_p.html
+++ b/doc/doxygen/output/html/globals_defs_p.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_defs_q.html b/doc/doxygen/output/html/globals_defs_q.html
new file mode 100644
index 0000000..59d17ef
--- /dev/null
+++ b/doc/doxygen/output/html/globals_defs_q.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('globals_defs_q.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented macros with links to the documentation:</div>
+
+<h3><a id="index_q" name="index_q"></a>- q -</h3><ul>
+<li>QUESTION_PROBE_HOST_ANY&#160;:&#160;<a class="el" href="mdns__out_8h.html#ab3297d69b0effb5eb01a9b8c5a708ea9">mdns_out.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_defs_r.html b/doc/doxygen/output/html/globals_defs_r.html
index 8fee92d..e9a4452 100644
--- a/doc/doxygen/output/html/globals_defs_r.html
+++ b/doc/doxygen/output/html/globals_defs_r.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_defs_s.html b/doc/doxygen/output/html/globals_defs_s.html
index 61450fa..143c1ef 100644
--- a/doc/doxygen/output/html/globals_defs_s.html
+++ b/doc/doxygen/output/html/globals_defs_s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,6 +101,7 @@
 
 <h3><a id="index_s" name="index_s"></a>- s -</h3><ul>
 <li>SELWAIT_T&#160;:&#160;<a class="el" href="sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196">sockets_priv.h</a></li>
+<li>SET_TIMEOUT_FROM_OFFERED&#160;:&#160;<a class="el" href="dhcp_8c.html#a33f306da575f8a437996d073b374df82">dhcp.c</a></li>
 <li>SLIP_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857">opt.h</a></li>
 <li>SLIP_MAX_SIZE&#160;:&#160;<a class="el" href="slipif_8c.html#accf448f9dabb0f33ef46b40355691cab">slipif.c</a></li>
 <li>SLIP_RX_QUEUE&#160;:&#160;<a class="el" href="slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668">slipif.h</a></li>
diff --git a/doc/doxygen/output/html/globals_defs_t.html b/doc/doxygen/output/html/globals_defs_t.html
index 07cbec9..d934562 100644
--- a/doc/doxygen/output/html/globals_defs_t.html
+++ b/doc/doxygen/output/html/globals_defs_t.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_defs_u.html b/doc/doxygen/output/html/globals_defs_u.html
index 3f3ea37..d528bd1 100644
--- a/doc/doxygen/output/html/globals_defs_u.html
+++ b/doc/doxygen/output/html/globals_defs_u.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_defs_z.html b/doc/doxygen/output/html/globals_defs_z.html
index 5a7394a..9c2e04f 100644
--- a/doc/doxygen/output/html/globals_defs_z.html
+++ b/doc/doxygen/output/html/globals_defs_z.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_dup.js b/doc/doxygen/output/html/globals_dup.js
index eaec4ec..fec82e9 100644
--- a/doc/doxygen/output/html/globals_dup.js
+++ b/doc/doxygen/output/html/globals_dup.js
@@ -6,12 +6,14 @@
     [ "d", "globals_d.html", null ],
     [ "e", "globals_e.html", null ],
     [ "f", "globals_f.html", null ],
+    [ "g", "globals_g.html", null ],
     [ "h", "globals_h.html", null ],
     [ "i", "globals_i.html", null ],
     [ "l", "globals_l.html", null ],
     [ "m", "globals_m.html", null ],
     [ "n", "globals_n.html", null ],
     [ "p", "globals_p.html", null ],
+    [ "q", "globals_q.html", null ],
     [ "r", "globals_r.html", null ],
     [ "s", "globals_s.html", null ],
     [ "t", "globals_t.html", null ],
diff --git a/doc/doxygen/output/html/globals_e.html b/doc/doxygen/output/html/globals_e.html
index aba838d..19ec2b3 100644
--- a/doc/doxygen/output/html/globals_e.html
+++ b/doc/doxygen/output/html/globals_e.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -123,6 +123,8 @@
 <li>ERR_WOULDBLOCK&#160;:&#160;<a class="el" href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad">err.h</a></li>
 <li>ETH_ADDR&#160;:&#160;<a class="el" href="lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee">ethernet.h</a></li>
 <li>ETH_PAD_SIZE&#160;:&#160;<a class="el" href="group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276">opt.h</a></li>
+<li>etharp_acd_announce()&#160;:&#160;<a class="el" href="etharp_8c.html#a7c41ba8b145fa4d06f8d6af3df44c4ff">etharp.c</a>, <a class="el" href="lwip_2etharp_8h.html#a7c41ba8b145fa4d06f8d6af3df44c4ff">etharp.h</a></li>
+<li>etharp_acd_probe()&#160;:&#160;<a class="el" href="etharp_8c.html#aac7d5048a81ef1c63b18d769700f4899">etharp.c</a>, <a class="el" href="lwip_2etharp_8h.html#aac7d5048a81ef1c63b18d769700f4899">etharp.h</a></li>
 <li>etharp_cleanup_netif()&#160;:&#160;<a class="el" href="etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05">etharp.c</a>, <a class="el" href="lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05">etharp.h</a></li>
 <li>ETHARP_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e">opt.h</a></li>
 <li>etharp_find_addr()&#160;:&#160;<a class="el" href="etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c">etharp.c</a>, <a class="el" href="lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c">etharp.h</a></li>
@@ -158,7 +160,7 @@
 <li>ETHTYPE_SERCOS&#160;:&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14">ieee.h</a></li>
 <li>ETHTYPE_VLAN&#160;:&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903">ieee.h</a></li>
 <li>ETHTYPE_WOL&#160;:&#160;<a class="el" href="group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b">ieee.h</a></li>
-<li>eui64_to_ble_addr()&#160;:&#160;<a class="el" href="group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d">lowpan6_ble.h</a>, <a class="el" href="group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d">lowpan6_ble.c</a></li>
+<li>eui64_to_ble_addr()&#160;:&#160;<a class="el" href="group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4">lowpan6_ble.h</a>, <a class="el" href="group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4">lowpan6_ble.c</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/globals_enum.html b/doc/doxygen/output/html/globals_enum.html
index 9e2420f..c1b70dd 100644
--- a/doc/doxygen/output/html/globals_enum.html
+++ b/doc/doxygen/output/html/globals_enum.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_eval.html b/doc/doxygen/output/html/globals_eval.html
index 7db1e2d..51bc13c 100644
--- a/doc/doxygen/output/html/globals_eval.html
+++ b/doc/doxygen/output/html/globals_eval.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -243,7 +243,7 @@
 <li>MQTT_CONNECT_REFUSED_SERVER&#160;:&#160;<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a">mqtt.h</a></li>
 <li>MQTT_CONNECT_REFUSED_USERNAME_PASS&#160;:&#160;<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a">mqtt.h</a></li>
 <li>MQTT_CONNECT_TIMEOUT&#160;:&#160;<a class="el" href="group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62">mqtt.h</a></li>
-<li>MQTT_DATA_FLAG_LAST&#160;:&#160;<a class="el" href="group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f">mqtt.h</a></li>
+<li>MQTT_DATA_FLAG_LAST&#160;:&#160;<a class="el" href="group__mqtt.html#ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f">mqtt.h</a></li>
 </ul>
 
 
diff --git a/doc/doxygen/output/html/globals_f.html b/doc/doxygen/output/html/globals_f.html
index 0a21414..355ab7e 100644
--- a/doc/doxygen/output/html/globals_f.html
+++ b/doc/doxygen/output/html/globals_f.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_func.html b/doc/doxygen/output/html/globals_func.html
index ee2397b..7916da1 100644
--- a/doc/doxygen/output/html/globals_func.html
+++ b/doc/doxygen/output/html/globals_func.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,6 +100,14 @@
 <div class="textblock">Here is a list of all documented functions with links to the documentation:</div>
 
 <h3><a id="index_a" name="index_a"></a>- a -</h3><ul>
+<li>acd_add()&#160;:&#160;<a class="el" href="group__acd.html#ga158856bf139cb2761837ddfa07303bdc">acd.c</a>, <a class="el" href="group__acd.html#ga158856bf139cb2761837ddfa07303bdc">acd.h</a></li>
+<li>acd_arp_reply()&#160;:&#160;<a class="el" href="acd_8c.html#aa92e21410d0f0d357ab9166cda24937a">acd.c</a>, <a class="el" href="acd_8h.html#aa92e21410d0f0d357ab9166cda24937a">acd.h</a></li>
+<li>acd_netif_ip_addr_changed()&#160;:&#160;<a class="el" href="group__acd.html#ga18b444f6fc69325416b463208a754c97">acd.c</a>, <a class="el" href="group__acd.html#ga18b444f6fc69325416b463208a754c97">acd.h</a></li>
+<li>acd_network_changed_link_down()&#160;:&#160;<a class="el" href="group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff">acd.c</a>, <a class="el" href="group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff">acd.h</a></li>
+<li>acd_remove()&#160;:&#160;<a class="el" href="group__acd.html#ga70503696bca25e1cfb61fad38b4327da">acd.c</a>, <a class="el" href="group__acd.html#ga70503696bca25e1cfb61fad38b4327da">acd.h</a></li>
+<li>acd_start()&#160;:&#160;<a class="el" href="group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb">acd.c</a>, <a class="el" href="group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb">acd.h</a></li>
+<li>acd_stop()&#160;:&#160;<a class="el" href="group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7">acd.c</a>, <a class="el" href="group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7">acd.h</a></li>
+<li>acd_tmr()&#160;:&#160;<a class="el" href="acd_8c.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e">acd.c</a>, <a class="el" href="acd_8h.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e">acd.h</a></li>
 <li>altcp_abort()&#160;:&#160;<a class="el" href="group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab">altcp.c</a>, <a class="el" href="group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab">altcp.h</a></li>
 <li>altcp_accept()&#160;:&#160;<a class="el" href="group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9">altcp.c</a>, <a class="el" href="group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9">altcp.h</a></li>
 <li>altcp_alloc()&#160;:&#160;<a class="el" href="altcp_8c.html#aa74c9fc358cffeeb7311b4212b0d6fc7">altcp.c</a>, <a class="el" href="altcp__priv_8h.html#aa74c9fc358cffeeb7311b4212b0d6fc7">altcp_priv.h</a></li>
@@ -130,23 +138,28 @@
 <li>altcp_tcp_alloc()&#160;:&#160;<a class="el" href="altcp__tcp_8c.html#a77582c93bb8a0aa2719e86b8c8505e8a">altcp_tcp.c</a>, <a class="el" href="altcp__tcp_8h.html#a77582c93bb8a0aa2719e86b8c8505e8a">altcp_tcp.h</a></li>
 <li>altcp_tls_alloc()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc">altcp_alloc.c</a>, <a class="el" href="group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc">altcp_tls.h</a></li>
 <li>altcp_tls_config_server_add_privkey_cert()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e">altcp_tls.h</a></li>
+<li>altcp_tls_configure_alpn_protocols()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga1f60b12a6a4440214b7bcf2e3ba43126">altcp_tls.h</a></li>
 <li>altcp_tls_context()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7">altcp_tls.h</a></li>
 <li>altcp_tls_create_config_client()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170">altcp_tls.h</a></li>
 <li>altcp_tls_create_config_client_2wayauth()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597">altcp_tls.h</a></li>
-<li>altcp_tls_create_config_server()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gaf6ed13271394371cc89d70ef5128c411">altcp_tls.h</a></li>
+<li>altcp_tls_create_config_server()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gaa37649bf24ebea235a8e3e8f50b9831f">altcp_tls.h</a></li>
 <li>altcp_tls_create_config_server_privkey_cert()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e">altcp_tls.h</a></li>
 <li>altcp_tls_free_config()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145">altcp_tls.h</a></li>
 <li>altcp_tls_free_entropy()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2">altcp_tls.h</a></li>
+<li>altcp_tls_free_session()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga906eefcef66e9dd2b43c3392704905f5">altcp_tls.h</a></li>
+<li>altcp_tls_get_session()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga827c76a0bddc4923b9a17c813e13891e">altcp_tls.h</a></li>
+<li>altcp_tls_init_session()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gae6c3cf72fcd29e6ea4c74181370420c3">altcp_tls.h</a></li>
 <li>altcp_tls_new()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8">altcp_alloc.c</a>, <a class="el" href="group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8">altcp_tls.h</a></li>
+<li>altcp_tls_set_session()&#160;:&#160;<a class="el" href="group__altcp__tls.html#ga4aed4aa55d0e1b15f4118863cea06d18">altcp_tls.h</a></li>
 <li>altcp_tls_wrap()&#160;:&#160;<a class="el" href="group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c">altcp_tls.h</a></li>
 <li>altcp_write()&#160;:&#160;<a class="el" href="group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d">altcp.c</a>, <a class="el" href="group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d">altcp.h</a></li>
-<li>autoip_arp_reply()&#160;:&#160;<a class="el" href="autoip_8c.html#acaf2793325c60dc4531c21a3fd55c16e">autoip.c</a>, <a class="el" href="autoip_8h.html#acaf2793325c60dc4531c21a3fd55c16e">autoip.h</a></li>
-<li>autoip_network_changed()&#160;:&#160;<a class="el" href="autoip_8c.html#a11df7a20d52680cd8c1c18fba2b91e9e">autoip.c</a>, <a class="el" href="autoip_8h.html#a11df7a20d52680cd8c1c18fba2b91e9e">autoip.h</a></li>
+<li>autoip_network_changed_link_down()&#160;:&#160;<a class="el" href="autoip_8c.html#af93544c49f2c24b95a3981351d023056">autoip.c</a>, <a class="el" href="autoip_8h.html#af93544c49f2c24b95a3981351d023056">autoip.h</a></li>
+<li>autoip_network_changed_link_up()&#160;:&#160;<a class="el" href="autoip_8c.html#af2a36aee96cbdf8f4a8f1e69c91ff425">autoip.c</a>, <a class="el" href="autoip_8h.html#af2a36aee96cbdf8f4a8f1e69c91ff425">autoip.h</a></li>
+<li>autoip_remove_struct()&#160;:&#160;<a class="el" href="group__autoip.html#gac0c98035795500ede464aa4af2515f30">autoip.c</a>, <a class="el" href="group__autoip.html#gac0c98035795500ede464aa4af2515f30">autoip.h</a></li>
 <li>autoip_set_struct()&#160;:&#160;<a class="el" href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90">autoip.c</a>, <a class="el" href="group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90">autoip.h</a></li>
 <li>autoip_start()&#160;:&#160;<a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip.c</a>, <a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip.h</a></li>
 <li>autoip_stop()&#160;:&#160;<a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip.c</a>, <a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip.h</a></li>
-<li>autoip_supplied_address()&#160;:&#160;<a class="el" href="autoip_8c.html#a1b4f0c53da17395d9de92a85708a1bb9">autoip.c</a>, <a class="el" href="autoip_8h.html#a1b4f0c53da17395d9de92a85708a1bb9">autoip.h</a></li>
-<li>autoip_tmr()&#160;:&#160;<a class="el" href="autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip.c</a>, <a class="el" href="autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d">autoip.h</a></li>
+<li>autoip_supplied_address()&#160;:&#160;<a class="el" href="autoip_8c.html#a6de97b7dcd98f9039d5c1ad11c257d62">autoip.c</a>, <a class="el" href="autoip_8h.html#a6de97b7dcd98f9039d5c1ad11c257d62">autoip.h</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/globals_func.js b/doc/doxygen/output/html/globals_func.js
index adcb785..7c2e2c2 100644
--- a/doc/doxygen/output/html/globals_func.js
+++ b/doc/doxygen/output/html/globals_func.js
@@ -4,6 +4,7 @@
     [ "b", "globals_func_b.html", null ],
     [ "d", "globals_func_d.html", null ],
     [ "e", "globals_func_e.html", null ],
+    [ "g", "globals_func_g.html", null ],
     [ "h", "globals_func_h.html", null ],
     [ "i", "globals_func_i.html", null ],
     [ "l", "globals_func_l.html", null ],
diff --git a/doc/doxygen/output/html/globals_func_b.html b/doc/doxygen/output/html/globals_func_b.html
index 699a232..2926053 100644
--- a/doc/doxygen/output/html/globals_func_b.html
+++ b/doc/doxygen/output/html/globals_func_b.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,7 +100,7 @@
 <div class="textblock">Here is a list of all documented functions with links to the documentation:</div>
 
 <h3><a id="index_b" name="index_b"></a>- b -</h3><ul>
-<li>ble_addr_to_eui64()&#160;:&#160;<a class="el" href="group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c">lowpan6_ble.h</a>, <a class="el" href="group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c">lowpan6_ble.c</a></li>
+<li>ble_addr_to_eui64()&#160;:&#160;<a class="el" href="group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f">lowpan6_ble.h</a>, <a class="el" href="group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f">lowpan6_ble.c</a></li>
 <li>bridgeif_add_port()&#160;:&#160;<a class="el" href="group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77">bridgeif.h</a>, <a class="el" href="group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77">bridgeif.c</a></li>
 <li>bridgeif_fdb_add()&#160;:&#160;<a class="el" href="group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666">bridgeif.h</a>, <a class="el" href="group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666">bridgeif.c</a></li>
 <li>bridgeif_fdb_get_dst_ports()&#160;:&#160;<a class="el" href="group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750">bridgeif.h</a>, <a class="el" href="group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750">bridgeif_fdb.c</a></li>
diff --git a/doc/doxygen/output/html/globals_func_d.html b/doc/doxygen/output/html/globals_func_d.html
index d1c1887..b350cb6 100644
--- a/doc/doxygen/output/html/globals_func_d.html
+++ b/doc/doxygen/output/html/globals_func_d.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -107,12 +107,11 @@
 <li>dhcp6_nd6_ra_trigger()&#160;:&#160;<a class="el" href="dhcp6_8c.html#af0f47aac3c04c84a7143fa6925e9fdba">dhcp6.c</a>, <a class="el" href="dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba">dhcp6.h</a></li>
 <li>dhcp6_set_struct()&#160;:&#160;<a class="el" href="group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">dhcp6.c</a>, <a class="el" href="group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453">dhcp6.h</a></li>
 <li>dhcp6_tmr()&#160;:&#160;<a class="el" href="dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d">dhcp6.c</a>, <a class="el" href="dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d">dhcp6.h</a></li>
-<li>dhcp_arp_reply()&#160;:&#160;<a class="el" href="dhcp_8c.html#a1fc0a94e0b94f13c5d302018f7ecb535">dhcp.c</a>, <a class="el" href="dhcp_8h.html#a1fc0a94e0b94f13c5d302018f7ecb535">dhcp.h</a></li>
 <li>dhcp_cleanup()&#160;:&#160;<a class="el" href="group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64">dhcp.c</a>, <a class="el" href="group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64">dhcp.h</a></li>
 <li>dhcp_coarse_tmr()&#160;:&#160;<a class="el" href="dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb">dhcp.c</a>, <a class="el" href="dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb">dhcp.h</a></li>
 <li>dhcp_fine_tmr()&#160;:&#160;<a class="el" href="dhcp_8c.html#a601d97faa24fa7289244bb452f052045">dhcp.c</a>, <a class="el" href="dhcp_8h.html#a601d97faa24fa7289244bb452f052045">dhcp.h</a></li>
 <li>dhcp_inform()&#160;:&#160;<a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp.c</a>, <a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp.h</a></li>
-<li>dhcp_network_changed()&#160;:&#160;<a class="el" href="dhcp_8c.html#a04f3824720223c439165243527906002">dhcp.c</a>, <a class="el" href="dhcp_8h.html#a04f3824720223c439165243527906002">dhcp.h</a></li>
+<li>dhcp_network_changed_link_up()&#160;:&#160;<a class="el" href="dhcp_8c.html#a2fd33722859054ea932ff05ff62dedaa">dhcp.c</a>, <a class="el" href="dhcp_8h.html#a2fd33722859054ea932ff05ff62dedaa">dhcp.h</a></li>
 <li>dhcp_release()&#160;:&#160;<a class="el" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp.c</a>, <a class="el" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp.h</a></li>
 <li>dhcp_release_and_stop()&#160;:&#160;<a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp.c</a>, <a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp.h</a></li>
 <li>dhcp_renew()&#160;:&#160;<a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp.c</a>, <a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp.h</a></li>
diff --git a/doc/doxygen/output/html/globals_func_e.html b/doc/doxygen/output/html/globals_func_e.html
index 5e03c6a..3069bf1 100644
--- a/doc/doxygen/output/html/globals_func_e.html
+++ b/doc/doxygen/output/html/globals_func_e.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,6 +100,8 @@
 <div class="textblock">Here is a list of all documented functions with links to the documentation:</div>
 
 <h3><a id="index_e" name="index_e"></a>- e -</h3><ul>
+<li>etharp_acd_announce()&#160;:&#160;<a class="el" href="etharp_8c.html#a7c41ba8b145fa4d06f8d6af3df44c4ff">etharp.c</a>, <a class="el" href="lwip_2etharp_8h.html#a7c41ba8b145fa4d06f8d6af3df44c4ff">etharp.h</a></li>
+<li>etharp_acd_probe()&#160;:&#160;<a class="el" href="etharp_8c.html#aac7d5048a81ef1c63b18d769700f4899">etharp.c</a>, <a class="el" href="lwip_2etharp_8h.html#aac7d5048a81ef1c63b18d769700f4899">etharp.h</a></li>
 <li>etharp_cleanup_netif()&#160;:&#160;<a class="el" href="etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05">etharp.c</a>, <a class="el" href="lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05">etharp.h</a></li>
 <li>etharp_find_addr()&#160;:&#160;<a class="el" href="etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c">etharp.c</a>, <a class="el" href="lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c">etharp.h</a></li>
 <li>etharp_get_entry()&#160;:&#160;<a class="el" href="etharp_8c.html#ab93df7ccb26496100d45137541e863c8">etharp.c</a>, <a class="el" href="lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8">etharp.h</a></li>
@@ -111,7 +113,7 @@
 <li>ethernet_input()&#160;:&#160;<a class="el" href="group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet.h</a>, <a class="el" href="group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet.c</a></li>
 <li>ethernet_output()&#160;:&#160;<a class="el" href="group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet.h</a>, <a class="el" href="group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet.c</a></li>
 <li>ethip6_output()&#160;:&#160;<a class="el" href="ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd">ethip6.c</a>, <a class="el" href="ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd">ethip6.h</a></li>
-<li>eui64_to_ble_addr()&#160;:&#160;<a class="el" href="group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d">lowpan6_ble.h</a>, <a class="el" href="group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d">lowpan6_ble.c</a></li>
+<li>eui64_to_ble_addr()&#160;:&#160;<a class="el" href="group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4">lowpan6_ble.h</a>, <a class="el" href="group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4">lowpan6_ble.c</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/globals_func_g.html b/doc/doxygen/output/html/globals_func_g.html
new file mode 100644
index 0000000..690e5d1
--- /dev/null
+++ b/doc/doxygen/output/html/globals_func_g.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('globals_func_g.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions with links to the documentation:</div>
+
+<h3><a id="index_g" name="index_g"></a>- g -</h3><ul>
+<li>get_mdns_pcb()&#160;:&#160;<a class="el" href="mdns_8c.html#aa31b798a5fb96b6ef0dde5d4f32371af">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#aa31b798a5fb96b6ef0dde5d4f32371af">mdns_priv.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_func_h.html b/doc/doxygen/output/html/globals_func_h.html
index 246778c..d395937 100644
--- a/doc/doxygen/output/html/globals_func_h.html
+++ b/doc/doxygen/output/html/globals_func_h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_func_i.html b/doc/doxygen/output/html/globals_func_i.html
index ec75099..9f87175 100644
--- a/doc/doxygen/output/html/globals_func_i.html
+++ b/doc/doxygen/output/html/globals_func_i.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_func_l.html b/doc/doxygen/output/html/globals_func_l.html
index f465bc1..518c7cb 100644
--- a/doc/doxygen/output/html/globals_func_l.html
+++ b/doc/doxygen/output/html/globals_func_l.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -140,6 +140,7 @@
 <li>lwip_socket_thread_init()&#160;:&#160;<a class="el" href="sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0">sockets.c</a>, <a class="el" href="sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0">sockets.h</a></li>
 <li>lwip_stricmp()&#160;:&#160;<a class="el" href="group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a">def.c</a>, <a class="el" href="group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a">def.h</a></li>
 <li>lwip_strnicmp()&#160;:&#160;<a class="el" href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a">def.c</a>, <a class="el" href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a">def.h</a></li>
+<li>lwip_strnistr()&#160;:&#160;<a class="el" href="group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa">def.c</a>, <a class="el" href="group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa">def.h</a></li>
 <li>lwip_strnstr()&#160;:&#160;<a class="el" href="group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e">def.c</a>, <a class="el" href="group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e">def.h</a></li>
 <li>lwiperf_abort()&#160;:&#160;<a class="el" href="group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004">lwiperf.c</a>, <a class="el" href="group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004">lwiperf.h</a></li>
 <li>lwiperf_start_tcp_client()&#160;:&#160;<a class="el" href="group__iperf.html#ga1088722d967f0f465d45fd3b15dde445">lwiperf.c</a>, <a class="el" href="group__iperf.html#ga1088722d967f0f465d45fd3b15dde445">lwiperf.h</a></li>
diff --git a/doc/doxygen/output/html/globals_func_m.html b/doc/doxygen/output/html/globals_func_m.html
index 3b1578b..95ee391 100644
--- a/doc/doxygen/output/html/globals_func_m.html
+++ b/doc/doxygen/output/html/globals_func_m.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,21 +100,53 @@
 <div class="textblock">Here is a list of all documented functions with links to the documentation:</div>
 
 <h3><a id="index_m" name="index_m"></a>- m -</h3><ul>
-<li>mdns_compress_domain()&#160;:&#160;<a class="el" href="mdns_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_priv.h</a></li>
-<li>mdns_domain_add_label()&#160;:&#160;<a class="el" href="mdns_8c.html#a17db69fa887515374452b945e959bbf9">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#a17db69fa887515374452b945e959bbf9">mdns_priv.h</a></li>
-<li>mdns_domain_eq()&#160;:&#160;<a class="el" href="mdns_8c.html#a52d8f70432ae998814f16b18431213cd">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#a52d8f70432ae998814f16b18431213cd">mdns_priv.h</a></li>
-<li>mdns_readname()&#160;:&#160;<a class="el" href="mdns_8c.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns_priv.h</a></li>
-<li>mdns_resp_add_netif()&#160;:&#160;<a class="el" href="group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb">mdns.c</a>, <a class="el" href="group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb">mdns.h</a></li>
-<li>mdns_resp_add_service()&#160;:&#160;<a class="el" href="group__mdns.html#ga824e992e94be216c8e059f48f49a59ce">mdns.c</a>, <a class="el" href="group__mdns.html#ga824e992e94be216c8e059f48f49a59ce">mdns.h</a></li>
+<li>mdns_build_dnssd_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a7485d75976b73354668a5a54bc8658ed">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a7485d75976b73354668a5a54bc8658ed">mdns_domain.h</a></li>
+<li>mdns_build_host_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a191d9b70a66083f40aaa022c2ed88b12">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a191d9b70a66083f40aaa022c2ed88b12">mdns_domain.h</a></li>
+<li>mdns_build_request_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a7221cb1a83ed6dcfb3a2b1365154b43d">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a7221cb1a83ed6dcfb3a2b1365154b43d">mdns_domain.h</a></li>
+<li>mdns_build_reverse_v4_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#ac2d8951e2435f93fdc889f6a71e0c8a6">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#ac2d8951e2435f93fdc889f6a71e0c8a6">mdns_domain.h</a></li>
+<li>mdns_build_reverse_v6_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a9cde39039e0e1e21b4851d840d733926">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a9cde39039e0e1e21b4851d840d733926">mdns_domain.h</a></li>
+<li>mdns_build_service_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a29ddb0a6ba0edcf34104ec1f6322968b">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a29ddb0a6ba0edcf34104ec1f6322968b">mdns_domain.h</a></li>
+<li>mdns_compress_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_domain.h</a></li>
+<li>mdns_create_outpacket()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a5a051eb81d6bd37365973d1215af23ba">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a5a051eb81d6bd37365973d1215af23ba">mdns_out.h</a></li>
+<li>mdns_domain_add_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a642449cbf0074f1a2504e72158e75859">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a642449cbf0074f1a2504e72158e75859">mdns_domain.h</a></li>
+<li>mdns_domain_add_label()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a17db69fa887515374452b945e959bbf9">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a17db69fa887515374452b945e959bbf9">mdns_domain.h</a></li>
+<li>mdns_domain_add_string()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#af228d1cf8d779c714a016702db095db6">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#af228d1cf8d779c714a016702db095db6">mdns_domain.h</a></li>
+<li>mdns_domain_debug_print()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a0aff096695eebacb2668d2762722860c">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a0aff096695eebacb2668d2762722860c">mdns_domain.h</a></li>
+<li>mdns_domain_eq()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a52d8f70432ae998814f16b18431213cd">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a52d8f70432ae998814f16b18431213cd">mdns_domain.h</a></li>
+<li>mdns_get_service_txt_userdata()&#160;:&#160;<a class="el" href="group__mdns.html#gaee5b489b77b74511517d41f7609ccd49">mdns.c</a>, <a class="el" href="group__mdns.html#gaee5b489b77b74511517d41f7609ccd49">mdns.h</a></li>
+<li>mdns_multicast_probe_timeout_reset_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#add64c83f753842f2ceb40079217c66a1">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#add64c83f753842f2ceb40079217c66a1">mdns_out.h</a></li>
+<li>mdns_multicast_probe_timeout_reset_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f">mdns_out.h</a></li>
+<li>mdns_multicast_timeout_25ttl_reset_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#ae4a0ae6a039210f60f666999f9b807f7">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#ae4a0ae6a039210f60f666999f9b807f7">mdns_out.h</a></li>
+<li>mdns_multicast_timeout_25ttl_reset_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a5de741fd85c3675e3d2161727dd9a220">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a5de741fd85c3675e3d2161727dd9a220">mdns_out.h</a></li>
+<li>mdns_multicast_timeout_reset_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a7b637b6f41976f35f7b48e7f2904829b">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a7b637b6f41976f35f7b48e7f2904829b">mdns_out.h</a></li>
+<li>mdns_multicast_timeout_reset_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a790ea0aba2d252f96c23748ea0c033a7">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a790ea0aba2d252f96c23748ea0c033a7">mdns_out.h</a></li>
+<li>mdns_prepare_txtdata()&#160;:&#160;<a class="el" href="mdns__out_8c.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f">mdns_out.h</a></li>
+<li>mdns_readname()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns_domain.h</a></li>
+<li>mdns_resp_add_netif()&#160;:&#160;<a class="el" href="group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e">mdns.c</a>, <a class="el" href="group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e">mdns.h</a></li>
+<li>mdns_resp_add_service()&#160;:&#160;<a class="el" href="group__mdns.html#ga2130111662d044b32970ce9c763bd409">mdns.c</a>, <a class="el" href="group__mdns.html#ga2130111662d044b32970ce9c763bd409">mdns.h</a></li>
 <li>mdns_resp_add_service_txtitem()&#160;:&#160;<a class="el" href="group__mdns.html#ga01c85202f4b85edc8b571f2f419db576">mdns.c</a>, <a class="el" href="group__mdns.html#ga01c85202f4b85edc8b571f2f419db576">mdns.h</a></li>
 <li>mdns_resp_announce()&#160;:&#160;<a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns.c</a>, <a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns.h</a></li>
-<li>mdns_resp_del_service()&#160;:&#160;<a class="el" href="group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad">mdns.c</a>, <a class="el" href="group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad">mdns.h</a></li>
+<li>mdns_resp_del_service()&#160;:&#160;<a class="el" href="group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a">mdns.c</a>, <a class="el" href="group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a">mdns.h</a></li>
 <li>mdns_resp_init()&#160;:&#160;<a class="el" href="group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3">mdns.c</a>, <a class="el" href="group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3">mdns.h</a></li>
+<li>mdns_resp_netif_active()&#160;:&#160;<a class="el" href="group__mdns.html#ga09b7a259f497648d8ef734b080f997c1">mdns.c</a>, <a class="el" href="group__mdns.html#ga09b7a259f497648d8ef734b080f997c1">mdns.h</a></li>
 <li>mdns_resp_register_name_result_cb()&#160;:&#160;<a class="el" href="mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1">mdns.c</a>, <a class="el" href="mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1">mdns.h</a></li>
 <li>mdns_resp_remove_netif()&#160;:&#160;<a class="el" href="group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c">mdns.c</a>, <a class="el" href="group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c">mdns.h</a></li>
 <li>mdns_resp_rename_netif()&#160;:&#160;<a class="el" href="group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e">mdns.c</a>, <a class="el" href="group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e">mdns.h</a></li>
-<li>mdns_resp_rename_service()&#160;:&#160;<a class="el" href="group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9">mdns.c</a>, <a class="el" href="group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9">mdns.h</a></li>
+<li>mdns_resp_rename_service()&#160;:&#160;<a class="el" href="group__mdns.html#gab1e989a4c7305d754377c76052474beb">mdns.c</a>, <a class="el" href="group__mdns.html#gab1e989a4c7305d754377c76052474beb">mdns.h</a></li>
 <li>mdns_resp_restart()&#160;:&#160;<a class="el" href="group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a">mdns.c</a>, <a class="el" href="group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a">mdns.h</a></li>
+<li>mdns_resp_restart_delay()&#160;:&#160;<a class="el" href="group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737">mdns.c</a>, <a class="el" href="group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737">mdns.h</a></li>
+<li>mdns_search_service()&#160;:&#160;<a class="el" href="group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725">mdns.c</a>, <a class="el" href="group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725">mdns.h</a></li>
+<li>mdns_search_stop()&#160;:&#160;<a class="el" href="group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac">mdns.c</a>, <a class="el" href="group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac">mdns.h</a></li>
+<li>mdns_send_multicast_msg_delayed_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#acbf59dca94f241c1b58c7df1ec4b85e1">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#acbf59dca94f241c1b58c7df1ec4b85e1">mdns_out.h</a></li>
+<li>mdns_send_multicast_msg_delayed_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#af3e118eb80760a958265f6a4c59b2e49">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#af3e118eb80760a958265f6a4c59b2e49">mdns_out.h</a></li>
+<li>mdns_send_outpacket()&#160;:&#160;<a class="el" href="mdns__out_8c.html#ae8c9d2bd89d6ca7e8668ba708925d2e8">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#ae8c9d2bd89d6ca7e8668ba708925d2e8">mdns_out.h</a></li>
+<li>mdns_send_request()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a1f7dc9536f124263573518e6e8e1a162">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a1f7dc9536f124263573518e6e8e1a162">mdns_out.h</a></li>
+<li>mdns_send_unicast_msg_delayed_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a2b7a721b19fa33813133bc97f503c199">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a2b7a721b19fa33813133bc97f503c199">mdns_out.h</a></li>
+<li>mdns_send_unicast_msg_delayed_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a2713348b1b314d5e880442f2c130e1dc">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a2713348b1b314d5e880442f2c130e1dc">mdns_out.h</a></li>
+<li>mdns_set_timeout()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a6195808be1840daa8a100b5954a30cfe">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a6195808be1840daa8a100b5954a30cfe">mdns_out.h</a></li>
+<li>mdns_start_multicast_timeouts_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a2dd35cb1e1fae888c05c2b7f8bd717cc">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a2dd35cb1e1fae888c05c2b7f8bd717cc">mdns_out.h</a></li>
+<li>mdns_start_multicast_timeouts_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a10f6f22640ac837a233bf43334dfb02a">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a10f6f22640ac837a233bf43334dfb02a">mdns_out.h</a></li>
+<li>mdns_write_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a92de54d2f384a4e4ffa85e529cc05411">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a92de54d2f384a4e4ffa85e529cc05411">mdns_domain.h</a></li>
 <li>mem_calloc()&#160;:&#160;<a class="el" href="mem_8c.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7">mem.c</a>, <a class="el" href="mem_8h.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7">mem.h</a></li>
 <li>mem_free()&#160;:&#160;<a class="el" href="mem_8c.html#a65169147c44e9db60d997819af9b455c">mem.c</a>, <a class="el" href="mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a">mem.h</a></li>
 <li>mem_free_callback()&#160;:&#160;<a class="el" href="tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c">tcpip.c</a>, <a class="el" href="tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c">tcpip.h</a></li>
diff --git a/doc/doxygen/output/html/globals_func_n.html b/doc/doxygen/output/html/globals_func_n.html
index 963e571..33f9855 100644
--- a/doc/doxygen/output/html/globals_func_n.html
+++ b/doc/doxygen/output/html/globals_func_n.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -163,6 +163,7 @@
 <li>netif_ip6_addr_set()&#160;:&#160;<a class="el" href="group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb">netif.c</a>, <a class="el" href="group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb">netif.h</a></li>
 <li>netif_ip6_addr_set_state()&#160;:&#160;<a class="el" href="group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f">netif.c</a>, <a class="el" href="group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f">netif.h</a></li>
 <li>netif_loop_output()&#160;:&#160;<a class="el" href="group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif.c</a>, <a class="el" href="group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif.h</a></li>
+<li>netif_mdns_data()&#160;:&#160;<a class="el" href="mdns_8c.html#af15fa5b6331bec605f68f53cb87f58fa">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#af15fa5b6331bec605f68f53cb87f58fa">mdns_priv.h</a></li>
 <li>netif_name_to_index()&#160;:&#160;<a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif.c</a>, <a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif.h</a></li>
 <li>netif_poll()&#160;:&#160;<a class="el" href="netif_8c.html#a0fbaed78253d21e1b54e65651da3e327">netif.c</a>, <a class="el" href="netif_8h.html#a0fbaed78253d21e1b54e65651da3e327">netif.h</a></li>
 <li>netif_remove()&#160;:&#160;<a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif.c</a>, <a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif.h</a></li>
@@ -180,8 +181,8 @@
 <li>netif_set_status_callback()&#160;:&#160;<a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif.c</a>, <a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif.h</a></li>
 <li>netif_set_up()&#160;:&#160;<a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif.c</a>, <a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif.h</a></li>
 <li>netif_to_num()&#160;:&#160;<a class="el" href="snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de">snmp_core.c</a>, <a class="el" href="snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de">snmp_core.h</a></li>
-<li>netifapi_arp_add()&#160;:&#160;<a class="el" href="netifapi_8c.html#a62b0bdbb3783eb27aa73485081306119">netifapi.c</a>, <a class="el" href="netifapi_8h.html#a62b0bdbb3783eb27aa73485081306119">netifapi.h</a></li>
-<li>netifapi_arp_remove()&#160;:&#160;<a class="el" href="netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8">netifapi.c</a>, <a class="el" href="netifapi_8h.html#a037c3d05c19b4d467b6ce06eb4639ee8">netifapi.h</a></li>
+<li>netifapi_arp_add()&#160;:&#160;<a class="el" href="group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119">netifapi.c</a></li>
+<li>netifapi_arp_remove()&#160;:&#160;<a class="el" href="group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8">netifapi.c</a></li>
 <li>netifapi_netif_add()&#160;:&#160;<a class="el" href="group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519">netifapi.c</a>, <a class="el" href="group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519">netifapi.h</a></li>
 <li>netifapi_netif_common()&#160;:&#160;<a class="el" href="netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi.c</a>, <a class="el" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi.h</a></li>
 <li>netifapi_netif_index_to_name()&#160;:&#160;<a class="el" href="group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6">netifapi.c</a></li>
diff --git a/doc/doxygen/output/html/globals_func_p.html b/doc/doxygen/output/html/globals_func_p.html
index 3550ebf..619df92 100644
--- a/doc/doxygen/output/html/globals_func_p.html
+++ b/doc/doxygen/output/html/globals_func_p.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_func_r.html b/doc/doxygen/output/html/globals_func_r.html
index 0cf3488..0b3e362 100644
--- a/doc/doxygen/output/html/globals_func_r.html
+++ b/doc/doxygen/output/html/globals_func_r.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_func_s.html b/doc/doxygen/output/html/globals_func_s.html
index 53837a2..c87e9c0 100644
--- a/doc/doxygen/output/html/globals_func_s.html
+++ b/doc/doxygen/output/html/globals_func_s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -134,6 +134,7 @@
 <li>snmp_get_community()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8">snmp.h</a></li>
 <li>snmp_get_community_trap()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba">snmp_msg.c</a>, <a class="el" href="group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba">snmp.h</a></li>
 <li>snmp_get_community_write()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e">snmp.h</a></li>
+<li>snmp_get_default_trap_version()&#160;:&#160;<a class="el" href="group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359">snmp.h</a></li>
 <li>snmp_get_device_enterprise_oid()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8">snmp_core.c</a>, <a class="el" href="group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8">snmp.h</a></li>
 <li>snmp_init()&#160;:&#160;<a class="el" href="snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5">snmp_netconn.c</a>, <a class="el" href="group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5">snmp_raw.c</a></li>
 <li>snmp_ip4_to_oid()&#160;:&#160;<a class="el" href="snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1">snmp_core.c</a>, <a class="el" href="snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1">snmp_core.h</a></li>
@@ -162,14 +163,19 @@
 <li>snmp_oid_to_ip4()&#160;:&#160;<a class="el" href="snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77">snmp_core.c</a>, <a class="el" href="snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77">snmp_core.h</a></li>
 <li>snmp_oid_to_ip6()&#160;:&#160;<a class="el" href="snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09">snmp_core.c</a>, <a class="el" href="snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09">snmp_core.h</a></li>
 <li>snmp_oid_to_ip_port()&#160;:&#160;<a class="el" href="snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507">snmp_core.c</a>, <a class="el" href="snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507">snmp_core.h</a></li>
-<li>snmp_send_trap()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd">snmp.h</a></li>
+<li>snmp_send_inform()&#160;:&#160;<a class="el" href="group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692">snmp.h</a></li>
+<li>snmp_send_inform_generic()&#160;:&#160;<a class="el" href="group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275">snmp.h</a></li>
+<li>snmp_send_inform_specific()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210">snmp.h</a></li>
+<li>snmp_send_trap()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c">snmp.h</a></li>
 <li>snmp_send_trap_generic()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga0e044259289cb690197173f93c17607d">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga0e044259289cb690197173f93c17607d">snmp.h</a></li>
 <li>snmp_send_trap_specific()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1">snmp.h</a></li>
 <li>snmp_set_auth_traps_enabled()&#160;:&#160;<a class="el" href="group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c">snmp.h</a></li>
 <li>snmp_set_community()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1">snmp.h</a></li>
 <li>snmp_set_community_trap()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp_msg.c</a>, <a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp.h</a></li>
 <li>snmp_set_community_write()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga341461766863cff46a44e5f431f2da01">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga341461766863cff46a44e5f431f2da01">snmp.h</a></li>
+<li>snmp_set_default_trap_version()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455">snmp.h</a></li>
 <li>snmp_set_device_enterprise_oid()&#160;:&#160;<a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp_core.c</a>, <a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp.h</a></li>
+<li>snmp_set_inform_callback()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838">snmp.h</a></li>
 <li>snmp_set_mibs()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp_core.c</a>, <a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp.h</a></li>
 <li>snmp_set_write_callback()&#160;:&#160;<a class="el" href="group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b">snmp.h</a></li>
 <li>snmp_threadsync_init()&#160;:&#160;<a class="el" href="snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6">snmp_threadsync.c</a>, <a class="el" href="snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6">snmp_threadsync.h</a></li>
@@ -177,6 +183,7 @@
 <li>snmp_trap_dst_ip_set()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86">snmp.h</a></li>
 <li>snmp_varbind_length()&#160;:&#160;<a class="el" href="snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5">snmp_msg.c</a>, <a class="el" href="snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5">snmp_msg.h</a></li>
 <li>sntp_enabled()&#160;:&#160;<a class="el" href="group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5">sntp.c</a>, <a class="el" href="group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5">sntp.h</a></li>
+<li>sntp_getkodreceived()&#160;:&#160;<a class="el" href="group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e">sntp.c</a>, <a class="el" href="group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e">sntp.h</a></li>
 <li>sntp_getoperatingmode()&#160;:&#160;<a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp.c</a>, <a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp.h</a></li>
 <li>sntp_getreachability()&#160;:&#160;<a class="el" href="group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e">sntp.c</a>, <a class="el" href="group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e">sntp.h</a></li>
 <li>sntp_getserver()&#160;:&#160;<a class="el" href="group__sntp.html#gab114c12154cf2c3e3a733724c6a77429">sntp.c</a>, <a class="el" href="group__sntp.html#gab114c12154cf2c3e3a733724c6a77429">sntp.h</a></li>
diff --git a/doc/doxygen/output/html/globals_func_t.html b/doc/doxygen/output/html/globals_func_t.html
index e8f0606..6e0bc38 100644
--- a/doc/doxygen/output/html/globals_func_t.html
+++ b/doc/doxygen/output/html/globals_func_t.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -115,10 +115,10 @@
 <li>tcp_enqueue_flags()&#160;:&#160;<a class="el" href="tcp__out_8c.html#aa7d5d552647d567095876aab202bfd1a">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#aa7d5d552647d567095876aab202bfd1a">tcp_priv.h</a></li>
 <li>tcp_err()&#160;:&#160;<a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp.c</a>, <a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp.h</a></li>
 <li>tcp_ext_arg_alloc_id()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp.h</a></li>
-<li>tcp_ext_arg_get()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855">tcp.h</a></li>
+<li>tcp_ext_arg_get()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56">tcp.h</a></li>
 <li>tcp_ext_arg_invoke_callbacks_passive_open()&#160;:&#160;<a class="el" href="tcp_8c.html#a5265b1df024d04287ed3edc02b1b9ccc">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#a5265b1df024d04287ed3edc02b1b9ccc">tcp_priv.h</a></li>
-<li>tcp_ext_arg_set()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318">tcp.h</a></li>
-<li>tcp_ext_arg_set_callbacks()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316">tcp.h</a></li>
+<li>tcp_ext_arg_set()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e">tcp.h</a></li>
+<li>tcp_ext_arg_set_callbacks()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5">tcp.h</a></li>
 <li>tcp_fasttmr()&#160;:&#160;<a class="el" href="tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d">tcp_priv.h</a></li>
 <li>tcp_free()&#160;:&#160;<a class="el" href="tcp_8c.html#aa2b6b075c27c64dfb8c402ac961fb910">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#aa2b6b075c27c64dfb8c402ac961fb910">tcp_priv.h</a></li>
 <li>tcp_init()&#160;:&#160;<a class="el" href="tcp_8c.html#a51de4ded7d342456d31722493c92c969">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#a51de4ded7d342456d31722493c92c969">tcp_priv.h</a></li>
@@ -144,13 +144,14 @@
 <li>tcp_rexmit_rto_commit()&#160;:&#160;<a class="el" href="tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#a9ef9dc094e21bdf0779aed25ab0b08d4">tcp_priv.h</a></li>
 <li>tcp_rexmit_rto_prepare()&#160;:&#160;<a class="el" href="tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39">tcp_priv.h</a></li>
 <li>tcp_rst()&#160;:&#160;<a class="el" href="tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014">tcp_priv.h</a></li>
+<li>tcp_rst_netif()&#160;:&#160;<a class="el" href="tcp__out_8c.html#a7cf7cbc5aa473de8116dc9f00cbc5d57">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#a7cf7cbc5aa473de8116dc9f00cbc5d57">tcp_priv.h</a></li>
 <li>tcp_seg_copy()&#160;:&#160;<a class="el" href="tcp_8c.html#a9384b436de95d5bf8550438b9d3c8cd4">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4">tcp_priv.h</a></li>
 <li>tcp_seg_free()&#160;:&#160;<a class="el" href="tcp_8c.html#ac6283651b26f74dba2444159aee88b20">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20">tcp_priv.h</a></li>
 <li>tcp_segs_free()&#160;:&#160;<a class="el" href="tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c">tcp_priv.h</a></li>
 <li>tcp_send_empty_ack()&#160;:&#160;<a class="el" href="tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996">tcp_priv.h</a></li>
 <li>tcp_send_fin()&#160;:&#160;<a class="el" href="tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342">tcp_priv.h</a></li>
 <li>tcp_sent()&#160;:&#160;<a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp.c</a>, <a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp.h</a></li>
-<li>tcp_setprio()&#160;:&#160;<a class="el" href="tcp_8c.html#a2c4234f1e95b6bde0e84d4ea97ae95bc">tcp.c</a>, <a class="el" href="tcp_8h.html#a2c4234f1e95b6bde0e84d4ea97ae95bc">tcp.h</a></li>
+<li>tcp_setprio()&#160;:&#160;<a class="el" href="group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc">tcp.c</a>, <a class="el" href="group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc">tcp.h</a></li>
 <li>tcp_shutdown()&#160;:&#160;<a class="el" href="group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd">tcp.c</a>, <a class="el" href="group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd">tcp.h</a></li>
 <li>tcp_slowtmr()&#160;:&#160;<a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905">tcp_priv.h</a></li>
 <li>tcp_split_unsent_seg()&#160;:&#160;<a class="el" href="tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5">tcp_priv.h</a></li>
@@ -163,6 +164,7 @@
 <li>tcpip_6lowpan_input()&#160;:&#160;<a class="el" href="group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b">lowpan6.h</a>, <a class="el" href="group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b">lowpan6.c</a></li>
 <li>tcpip_api_call()&#160;:&#160;<a class="el" href="tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08">tcpip.c</a>, <a class="el" href="tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08">tcpip_priv.h</a></li>
 <li>tcpip_callback()&#160;:&#160;<a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip.c</a>, <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip.h</a></li>
+<li>tcpip_callback_wait()&#160;:&#160;<a class="el" href="tcpip_8c.html#a8d8a2ac0271def71a4ca31b24a31228f">tcpip.c</a>, <a class="el" href="tcpip_8h.html#a8d8a2ac0271def71a4ca31b24a31228f">tcpip.h</a></li>
 <li>tcpip_callbackmsg_delete()&#160;:&#160;<a class="el" href="group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd">tcpip.c</a>, <a class="el" href="group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd">tcpip.h</a></li>
 <li>tcpip_callbackmsg_new()&#160;:&#160;<a class="el" href="group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1">tcpip.c</a>, <a class="el" href="group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1">tcpip.h</a></li>
 <li>tcpip_callbackmsg_trycallback()&#160;:&#160;<a class="el" href="group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip.c</a>, <a class="el" href="group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8">tcpip.h</a></li>
@@ -173,8 +175,10 @@
 <li>tcpip_rfc7668_input()&#160;:&#160;<a class="el" href="lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a">lowpan6_ble.h</a>, <a class="el" href="lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a">lowpan6_ble.c</a></li>
 <li>tcpip_send_msg_wait_sem()&#160;:&#160;<a class="el" href="tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d">tcpip.c</a>, <a class="el" href="tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d">tcpip_priv.h</a></li>
 <li>tcpip_try_callback()&#160;:&#160;<a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip.c</a>, <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip.h</a></li>
-<li>tftp_cleanup()&#160;:&#160;<a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_server.c</a>, <a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_server.h</a></li>
-<li>tftp_init()&#160;:&#160;<a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_server.c</a>, <a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_server.h</a></li>
+<li>tftp_cleanup()&#160;:&#160;<a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp.c</a>, <a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_common.h</a></li>
+<li>tftp_init_client()&#160;:&#160;<a class="el" href="group__tftp.html#gaa6b743a64287206acb825bd60448e5f8">tftp.c</a>, <a class="el" href="group__tftp.html#gaa6b743a64287206acb825bd60448e5f8">tftp_client.h</a></li>
+<li>tftp_init_common()&#160;:&#160;<a class="el" href="tftp_8c.html#a5c6cf3de84a0dc990c055d66e574ca70">tftp.c</a>, <a class="el" href="tftp__common_8h.html#a5c6cf3de84a0dc990c055d66e574ca70">tftp_common.h</a></li>
+<li>tftp_init_server()&#160;:&#160;<a class="el" href="group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40">tftp.c</a>, <a class="el" href="group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40">tftp_server.h</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/globals_func_u.html b/doc/doxygen/output/html/globals_func_u.html
index 443db3b..4387c86 100644
--- a/doc/doxygen/output/html/globals_func_u.html
+++ b/doc/doxygen/output/html/globals_func_u.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_func_z.html b/doc/doxygen/output/html/globals_func_z.html
index d3aef46..6ad6450 100644
--- a/doc/doxygen/output/html/globals_func_z.html
+++ b/doc/doxygen/output/html/globals_func_z.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_g.html b/doc/doxygen/output/html/globals_g.html
new file mode 100644
index 0000000..635de54
--- /dev/null
+++ b/doc/doxygen/output/html/globals_g.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('globals_g.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_g" name="index_g"></a>- g -</h3><ul>
+<li>get_mdns_pcb()&#160;:&#160;<a class="el" href="mdns_8c.html#aa31b798a5fb96b6ef0dde5d4f32371af">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#aa31b798a5fb96b6ef0dde5d4f32371af">mdns_priv.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_h.html b/doc/doxygen/output/html/globals_h.html
index f6f8d65..88977b8 100644
--- a/doc/doxygen/output/html/globals_h.html
+++ b/doc/doxygen/output/html/globals_h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,7 +101,6 @@
 
 <h3><a id="index_h" name="index_h"></a>- h -</h3><ul>
 <li>h_errno&#160;:&#160;<a class="el" href="netdb_8c.html#a2a1ce3f2040007303d36c0b682b5ac10">netdb.c</a>, <a class="el" href="lwip_2netdb_8h.html#a2a1ce3f2040007303d36c0b682b5ac10">netdb.h</a></li>
-<li>HOSTENT_STORAGE&#160;:&#160;<a class="el" href="netdb_8c.html#acfc1e988534c0e497599b904739f92fe">netdb.c</a></li>
 <li>HTTP_DEFAULT_PORT&#160;:&#160;<a class="el" href="group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2">http_client.h</a></li>
 <li>HTTP_IS_DATA_VOLATILE&#160;:&#160;<a class="el" href="httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300">httpd.c</a></li>
 <li>HTTP_IS_HDR_VOLATILE&#160;:&#160;<a class="el" href="httpd_8c.html#af281bc4a762d56243e0b85dd4197174a">httpd.c</a></li>
diff --git a/doc/doxygen/output/html/globals_i.html b/doc/doxygen/output/html/globals_i.html
index d1ea4a1..a702c9a 100644
--- a/doc/doxygen/output/html/globals_i.html
+++ b/doc/doxygen/output/html/globals_i.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -187,11 +187,13 @@
 <li>IP4_ADDR&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974">ip4_addr.h</a></li>
 <li>IP4_ADDR_ANY&#160;:&#160;<a class="el" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">ip_addr.h</a></li>
 <li>IP4_ADDR_ANY4&#160;:&#160;<a class="el" href="group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42">ip_addr.h</a></li>
+<li>ip4_addr_cmp&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a59494c562c62fdf62a6c9c6a66a50fb3">ip4_addr.h</a></li>
 <li>ip4_addr_copy&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5">ip4_addr.h</a></li>
 <li>ip4_addr_get_network&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9">ip4_addr.h</a></li>
 <li>ip4_addr_get_u32&#160;:&#160;<a class="el" href="ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b">ip4_addr.h</a></li>
 <li>ip4_addr_isbroadcast_u32()&#160;:&#160;<a class="el" href="ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421">ip4_addr.c</a>, <a class="el" href="ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421">ip4_addr.h</a></li>
 <li>ip4_addr_isloopback&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051">ip4_addr.h</a></li>
+<li>ip4_addr_net_eq&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a95d05df9201602fc873a97fb61fd1134">ip4_addr.h</a></li>
 <li>ip4_addr_netcmp&#160;:&#160;<a class="el" href="ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514">ip4_addr.h</a></li>
 <li>ip4_addr_netmask_valid()&#160;:&#160;<a class="el" href="ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071">ip4_addr.c</a>, <a class="el" href="ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071">ip4_addr.h</a></li>
 <li>ip4_addr_set&#160;:&#160;<a class="el" href="ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88">ip4_addr.h</a></li>
@@ -233,18 +235,22 @@
 <li>ip6_addr_clear_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad">ip6_zone.h</a></li>
 <li>ip6_addr_cmp&#160;:&#160;<a class="el" href="ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1">ip6_addr.h</a></li>
 <li>ip6_addr_cmp_packed&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8">ip6_addr.h</a></li>
-<li>ip6_addr_cmp_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9">ip6_zone.h</a></li>
+<li>ip6_addr_cmp_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gac01d0bad0a682dcc239ba3d5695e0648">ip6_zone.h</a></li>
 <li>ip6_addr_cmp_zoneless&#160;:&#160;<a class="el" href="ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322">ip6_addr.h</a></li>
 <li>ip6_addr_copy&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073">ip6_addr.h</a></li>
 <li>ip6_addr_copy_from_packed&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3">ip6_addr.h</a></li>
 <li>ip6_addr_copy_to_packed&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b">ip6_addr.h</a></li>
 <li>ip6_addr_copy_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4">ip6_zone.h</a></li>
+<li>ip6_addr_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a9ea0b6b837baff1e1e62cccd4f17d50e">ip6_addr.h</a></li>
 <li>ip6_addr_equals_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f">ip6_zone.h</a></li>
 <li>ip6_addr_has_scope&#160;:&#160;<a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_zone.h</a></li>
 <li>ip6_addr_has_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78">ip6_zone.h</a></li>
 <li>ip6_addr_lacks_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97">ip6_zone.h</a></li>
+<li>ip6_addr_net_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a9a983c7d613ab45e37aaf66c067a0c7a">ip6_addr.h</a></li>
+<li>ip6_addr_net_zoneless_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#afc9d2b8d0a05f2ff23ab3b7fd3bf8229">ip6_addr.h</a></li>
 <li>ip6_addr_netcmp&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2">ip6_addr.h</a></li>
 <li>ip6_addr_netcmp_zoneless&#160;:&#160;<a class="el" href="ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342">ip6_addr.h</a></li>
+<li>ip6_addr_packed_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#aa324ac65d537997ebaaed78bd40f6da9">ip6_addr.h</a></li>
 <li>IP6_ADDR_PART&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd">ip6_addr.h</a></li>
 <li>ip6_addr_select_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c">ip6_zone.h</a></li>
 <li>ip6_addr_set&#160;:&#160;<a class="el" href="ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad">ip6_addr.h</a></li>
@@ -256,6 +262,8 @@
 <li>ip6_addr_t&#160;:&#160;<a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr.h</a></li>
 <li>ip6_addr_test_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e">ip6_zone.h</a></li>
 <li>ip6_addr_zone&#160;:&#160;<a class="el" href="group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634">ip6_zone.h</a></li>
+<li>ip6_addr_zone_eq&#160;:&#160;<a class="el" href="group__ip6__zones.html#gabc6d5f833b2abef31aa602dc11ace0a9">ip6_zone.h</a></li>
+<li>ip6_addr_zoneless_eq&#160;:&#160;<a class="el" href="ip6__addr_8h.html#a811d8a2aa6417ae22a7a46b27d9ead26">ip6_addr.h</a></li>
 <li>ip6_chksum_pseudo()&#160;:&#160;<a class="el" href="inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88">inet_chksum.c</a>, <a class="el" href="inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88">inet_chksum.h</a></li>
 <li>ip6_chksum_pseudo_partial()&#160;:&#160;<a class="el" href="inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b">inet_chksum.c</a>, <a class="el" href="inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b">inet_chksum.h</a></li>
 <li>ip6_current_dest_addr&#160;:&#160;<a class="el" href="ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0">ip.h</a></li>
@@ -285,7 +293,20 @@
 <li>ip_2_ip6&#160;:&#160;<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_addr.h</a></li>
 <li>IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT&#160;:&#160;<a class="el" href="ip4_8c.html#a185c7d6380711847105430931692b267">ip4.c</a></li>
 <li>IP_ADDR_ANY&#160;:&#160;<a class="el" href="group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c">ip_addr.h</a></li>
+<li>ip_addr_cmp&#160;:&#160;<a class="el" href="group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a">ip_addr.h</a></li>
+<li>ip_addr_cmp_zoneless&#160;:&#160;<a class="el" href="group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4">ip_addr.h</a></li>
+<li>ip_addr_eq&#160;:&#160;<a class="el" href="group__ipaddr.html#ga5b40158bdffa4b0c81c4ee77066e6b28">ip_addr.h</a></li>
+<li>ip_addr_isany&#160;:&#160;<a class="el" href="group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4">ip_addr.h</a></li>
+<li>ip_addr_isany_val&#160;:&#160;<a class="el" href="group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05">ip_addr.h</a></li>
+<li>ip_addr_isbroadcast&#160;:&#160;<a class="el" href="group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75">ip_addr.h</a></li>
+<li>ip_addr_islinklocal&#160;:&#160;<a class="el" href="group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653">ip_addr.h</a></li>
+<li>ip_addr_isloopback&#160;:&#160;<a class="el" href="group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e">ip_addr.h</a></li>
+<li>ip_addr_ismulticast&#160;:&#160;<a class="el" href="group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752">ip_addr.h</a></li>
+<li>ip_addr_net_eq&#160;:&#160;<a class="el" href="group__ipaddr.html#gad1bbbe4c93ea2368663e90814953b929">ip_addr.h</a></li>
+<li>ip_addr_netcmp&#160;:&#160;<a class="el" href="group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb">ip_addr.h</a></li>
 <li>ip_addr_t&#160;:&#160;<a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr.h</a></li>
+<li>ip_addr_zoneless_eq&#160;:&#160;<a class="el" href="group__ipaddr.html#ga8ac2686417ec2974bb0b3fc6ee0ee1a7">ip_addr.h</a></li>
+<li>IP_ANY_TYPE&#160;:&#160;<a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">ip_addr.h</a></li>
 <li>ip_current_dest_addr&#160;:&#160;<a class="el" href="ip_8h.html#a9135977868017c3deeec86b525e13997">ip.h</a></li>
 <li>ip_current_header_proto&#160;:&#160;<a class="el" href="ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f">ip.h</a></li>
 <li>ip_current_header_tot_len&#160;:&#160;<a class="el" href="ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2">ip.h</a></li>
diff --git a/doc/doxygen/output/html/globals_l.html b/doc/doxygen/output/html/globals_l.html
index 5b98b5a..b5aa2a0 100644
--- a/doc/doxygen/output/html/globals_l.html
+++ b/doc/doxygen/output/html/globals_l.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -118,6 +118,7 @@
 <li>LWIP_6LOWPAN_INFER_SHORT_ADDRESS&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207">lowpan6_opts.h</a></li>
 <li>LWIP_6LOWPAN_IPHC&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa">lowpan6_opts.h</a></li>
 <li>LWIP_6LOWPAN_NUM_CONTEXTS&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a">lowpan6_opts.h</a></li>
+<li>LWIP_ACD&#160;:&#160;<a class="el" href="group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7">opt.h</a></li>
 <li>LWIP_ALIGNMENT_CAST&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8">arch.h</a></li>
 <li>LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT&#160;:&#160;<a class="el" href="group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2">opt.h</a></li>
 <li>LWIP_ALTCP&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77">opt.h</a></li>
@@ -128,7 +129,6 @@
 <li>LWIP_ASSERT_CORE_LOCKED&#160;:&#160;<a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">opt.h</a></li>
 <li>LWIP_AUTOIP&#160;:&#160;<a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">opt.h</a></li>
 <li>LWIP_AUTOIP_CREATE_SEED_ADDR&#160;:&#160;<a class="el" href="autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43">autoip.c</a></li>
-<li>LWIP_AUTOIP_RAND&#160;:&#160;<a class="el" href="autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59">autoip.c</a></li>
 <li>LWIP_BROADCAST_PING&#160;:&#160;<a class="el" href="group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9">opt.h</a></li>
 <li>LWIP_CHECKSUM_CTRL_PER_NETIF&#160;:&#160;<a class="el" href="group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004">opt.h</a></li>
 <li>LWIP_CHECKSUM_ON_COPY&#160;:&#160;<a class="el" href="group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613">opt.h</a></li>
@@ -158,6 +158,8 @@
 <li>LWIP_DHCP_AUTOIP_COOP&#160;:&#160;<a class="el" href="group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe">opt.h</a></li>
 <li>LWIP_DHCP_AUTOIP_COOP_TRIES&#160;:&#160;<a class="el" href="group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2">opt.h</a></li>
 <li>LWIP_DHCP_BOOTP_FILE&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423">opt.h</a></li>
+<li>LWIP_DHCP_DISCOVER_ADD_HOSTNAME&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#gad6b030f8e828666953661578f936e605">opt.h</a></li>
+<li>LWIP_DHCP_DOES_ACD_CHECK&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55">opt.h</a></li>
 <li>LWIP_DHCP_GET_NTP_SRV&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83">opt.h</a></li>
 <li>LWIP_DHCP_MAX_DNS_SERVERS&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6">opt.h</a></li>
 <li>LWIP_DHCP_MAX_NTP_SERVERS&#160;:&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2">opt.h</a></li>
@@ -206,6 +208,7 @@
 <li>LWIP_HTTPD_CUSTOM_FILES&#160;:&#160;<a class="el" href="group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_DYNAMIC_FILE_READ&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_DYNAMIC_HEADERS&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7">httpd_opts.h</a></li>
+<li>LWIP_HTTPD_FILE_EXTENSION&#160;:&#160;<a class="el" href="group__httpd__opts.html#gaa3648a9fdefe3ab1c890b715a4786429">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_FILE_STATE&#160;:&#160;<a class="el" href="group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_FS_ASYNC_READ&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga0d5074965efd40786182287895feb691">httpd_opts.h</a></li>
@@ -217,6 +220,7 @@
 <li>LWIP_HTTPD_REQ_QUEUELEN&#160;:&#160;<a class="el" href="group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI&#160;:&#160;<a class="el" href="group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI_BY_FILE_EXTENSION&#160;:&#160;<a class="el" href="group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466">httpd_opts.h</a></li>
+<li>LWIP_HTTPD_SSI_EXTENSIONS&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga006baa7219cff5ee02f5a14ef7d7c89d">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI_INCLUDE_TAG&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI_MULTIPART&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0">httpd_opts.h</a></li>
 <li>LWIP_HTTPD_SSI_RAW&#160;:&#160;<a class="el" href="group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5">httpd_opts.h</a></li>
@@ -282,7 +286,8 @@
 <li>LWIP_LOWPAN6_DECOMPRESSION_DEBUG&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0">lowpan6_opts.h</a></li>
 <li>LWIP_LOWPAN6_IP_COMPRESSED_DEBUG&#160;:&#160;<a class="el" href="lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8">lowpan6_opts.h</a></li>
 <li>LWIP_MAKEU32&#160;:&#160;<a class="el" href="def_8h.html#acf56d3da92a0a7a8a62a617e793e948c">def.h</a></li>
-<li>LWIP_MARK_TCPIP_THREAD&#160;:&#160;<a class="el" href="group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e">opt.h</a></li>
+<li>LWIP_MARK_TCPIP_THREAD&#160;:&#160;<a class="el" href="group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e">sys.h</a></li>
+<li>LWIP_MDNS_SEARCH&#160;:&#160;<a class="el" href="group__mdns__opts.html#gaaf489604dcdf94d2adcd723f6c7d7163">mdns_opts.h</a></li>
 <li>LWIP_MEM_ALIGN&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc">arch.h</a></li>
 <li>LWIP_MEM_ALIGN_BUFFER&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e">arch.h</a></li>
 <li>LWIP_MEM_ALIGN_SIZE&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18">arch.h</a></li>
@@ -347,6 +352,7 @@
 <li>LWIP_NO_STDDEF_H&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d">arch.h</a></li>
 <li>LWIP_NO_STDINT_H&#160;:&#160;<a class="el" href="group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1">arch.h</a></li>
 <li>LWIP_NOASSERT&#160;:&#160;<a class="el" href="group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41">debug.h</a></li>
+<li>LWIP_NSC_IPV4_ADDR_VALID&#160;:&#160;<a class="el" href="netif_8h.html#a716576f3485524d44ef0843839ef0564">netif.h</a></li>
 <li>LWIP_NSC_IPV4_ADDRESS_CHANGED&#160;:&#160;<a class="el" href="netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32">netif.h</a></li>
 <li>LWIP_NSC_IPV4_GATEWAY_CHANGED&#160;:&#160;<a class="el" href="netif_8h.html#a22400d2202581b4a7273cded712adf49">netif.h</a></li>
 <li>LWIP_NSC_IPV4_NETMASK_CHANGED&#160;:&#160;<a class="el" href="netif_8h.html#ad747072771a887443ab33f90a12077d4">netif.h</a></li>
@@ -389,6 +395,7 @@
 <li>LWIP_SO_SNDRCVTIMEO_NONSTANDARD&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942">opt.h</a></li>
 <li>LWIP_SO_SNDTIMEO&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58">opt.h</a></li>
 <li>LWIP_SOCKET&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f">opt.h</a></li>
+<li>LWIP_SOCKET_EXTERNAL_HEADERS&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga524c013ecdd8a45a2949f2a433469e82">opt.h</a></li>
 <li>LWIP_SOCKET_OFFSET&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e">opt.h</a></li>
 <li>LWIP_SOCKET_POLL&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200">opt.h</a></li>
 <li>LWIP_SOCKET_SELECT&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb">opt.h</a></li>
@@ -399,6 +406,7 @@
 <li>LWIP_STATS_DISPLAY&#160;:&#160;<a class="el" href="group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1">opt.h</a></li>
 <li>lwip_stricmp()&#160;:&#160;<a class="el" href="group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a">def.c</a>, <a class="el" href="group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a">def.h</a></li>
 <li>lwip_strnicmp()&#160;:&#160;<a class="el" href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a">def.c</a>, <a class="el" href="group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a">def.h</a></li>
+<li>lwip_strnistr()&#160;:&#160;<a class="el" href="group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa">def.c</a>, <a class="el" href="group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa">def.h</a></li>
 <li>lwip_strnstr()&#160;:&#160;<a class="el" href="group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e">def.c</a>, <a class="el" href="group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e">def.h</a></li>
 <li>LWIP_SUPPORT_CUSTOM_PBUF&#160;:&#160;<a class="el" href="pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9">pbuf.h</a></li>
 <li>LWIP_TCP&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">opt.h</a></li>
@@ -407,6 +415,7 @@
 <li>LWIP_TCP_KEEPALIVE&#160;:&#160;<a class="el" href="group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77">opt.h</a></li>
 <li>LWIP_TCP_MAX_SACK_NUM&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc">opt.h</a></li>
 <li>LWIP_TCP_PCB_NUM_EXT_ARGS&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223">opt.h</a></li>
+<li>LWIP_TCP_RTO_TIME&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#gade23373901980c6e7a43cef813386ebe">opt.h</a></li>
 <li>LWIP_TCP_SACK_OUT&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f">opt.h</a></li>
 <li>LWIP_TCP_TIMESTAMPS&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd">opt.h</a></li>
 <li>LWIP_TCPIP_CORE_LOCKING&#160;:&#160;<a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">opt.h</a></li>
diff --git a/doc/doxygen/output/html/globals_m.html b/doc/doxygen/output/html/globals_m.html
index 0e208d2..14ccdd8 100644
--- a/doc/doxygen/output/html/globals_m.html
+++ b/doc/doxygen/output/html/globals_m.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,26 +100,64 @@
 <div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
 
 <h3><a id="index_m" name="index_m"></a>- m -</h3><ul>
-<li>mdns_compress_domain()&#160;:&#160;<a class="el" href="mdns_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_priv.h</a></li>
+<li>mdns_build_dnssd_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a7485d75976b73354668a5a54bc8658ed">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a7485d75976b73354668a5a54bc8658ed">mdns_domain.h</a></li>
+<li>mdns_build_host_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a191d9b70a66083f40aaa022c2ed88b12">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a191d9b70a66083f40aaa022c2ed88b12">mdns_domain.h</a></li>
+<li>mdns_build_request_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a7221cb1a83ed6dcfb3a2b1365154b43d">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a7221cb1a83ed6dcfb3a2b1365154b43d">mdns_domain.h</a></li>
+<li>mdns_build_reverse_v4_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#ac2d8951e2435f93fdc889f6a71e0c8a6">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#ac2d8951e2435f93fdc889f6a71e0c8a6">mdns_domain.h</a></li>
+<li>mdns_build_reverse_v6_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a9cde39039e0e1e21b4851d840d733926">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a9cde39039e0e1e21b4851d840d733926">mdns_domain.h</a></li>
+<li>mdns_build_service_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a29ddb0a6ba0edcf34104ec1f6322968b">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a29ddb0a6ba0edcf34104ec1f6322968b">mdns_domain.h</a></li>
+<li>mdns_compress_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_domain.h</a></li>
+<li>mdns_create_outpacket()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a5a051eb81d6bd37365973d1215af23ba">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a5a051eb81d6bd37365973d1215af23ba">mdns_out.h</a></li>
 <li>MDNS_DEBUG&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9">mdns_opts.h</a></li>
-<li>mdns_domain_add_label()&#160;:&#160;<a class="el" href="mdns_8c.html#a17db69fa887515374452b945e959bbf9">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#a17db69fa887515374452b945e959bbf9">mdns_priv.h</a></li>
-<li>mdns_domain_eq()&#160;:&#160;<a class="el" href="mdns_8c.html#a52d8f70432ae998814f16b18431213cd">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#a52d8f70432ae998814f16b18431213cd">mdns_priv.h</a></li>
+<li>mdns_domain_add_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a642449cbf0074f1a2504e72158e75859">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a642449cbf0074f1a2504e72158e75859">mdns_domain.h</a></li>
+<li>mdns_domain_add_label()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a17db69fa887515374452b945e959bbf9">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a17db69fa887515374452b945e959bbf9">mdns_domain.h</a></li>
+<li>mdns_domain_add_string()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#af228d1cf8d779c714a016702db095db6">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#af228d1cf8d779c714a016702db095db6">mdns_domain.h</a></li>
+<li>mdns_domain_debug_print()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a0aff096695eebacb2668d2762722860c">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a0aff096695eebacb2668d2762722860c">mdns_domain.h</a></li>
+<li>mdns_domain_eq()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a52d8f70432ae998814f16b18431213cd">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a52d8f70432ae998814f16b18431213cd">mdns_domain.h</a></li>
+<li>mdns_get_service_txt_userdata()&#160;:&#160;<a class="el" href="group__mdns.html#gaee5b489b77b74511517d41f7609ccd49">mdns.c</a>, <a class="el" href="group__mdns.html#gaee5b489b77b74511517d41f7609ccd49">mdns.h</a></li>
+<li>MDNS_MAX_REQUESTS&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga17a9884af8169cf19d57d8005fc3d95e">mdns_opts.h</a></li>
 <li>MDNS_MAX_SERVICES&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6">mdns_opts.h</a></li>
-<li>mdns_name_result_cb_t&#160;:&#160;<a class="el" href="mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536">mdns.h</a></li>
-<li>mdns_readname()&#160;:&#160;<a class="el" href="mdns_8c.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns_priv.h</a></li>
-<li>mdns_resp_add_netif()&#160;:&#160;<a class="el" href="group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb">mdns.c</a>, <a class="el" href="group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb">mdns.h</a></li>
-<li>mdns_resp_add_service()&#160;:&#160;<a class="el" href="group__mdns.html#ga824e992e94be216c8e059f48f49a59ce">mdns.c</a>, <a class="el" href="group__mdns.html#ga824e992e94be216c8e059f48f49a59ce">mdns.h</a></li>
+<li>MDNS_MAX_STORED_PKTS&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga827d1d2abd24a26638723cfd0a8b9efd">mdns_opts.h</a></li>
+<li>mdns_multicast_probe_timeout_reset_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#add64c83f753842f2ceb40079217c66a1">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#add64c83f753842f2ceb40079217c66a1">mdns_out.h</a></li>
+<li>mdns_multicast_probe_timeout_reset_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f">mdns_out.h</a></li>
+<li>mdns_multicast_timeout_25ttl_reset_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#ae4a0ae6a039210f60f666999f9b807f7">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#ae4a0ae6a039210f60f666999f9b807f7">mdns_out.h</a></li>
+<li>mdns_multicast_timeout_25ttl_reset_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a5de741fd85c3675e3d2161727dd9a220">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a5de741fd85c3675e3d2161727dd9a220">mdns_out.h</a></li>
+<li>mdns_multicast_timeout_reset_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a7b637b6f41976f35f7b48e7f2904829b">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a7b637b6f41976f35f7b48e7f2904829b">mdns_out.h</a></li>
+<li>mdns_multicast_timeout_reset_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a790ea0aba2d252f96c23748ea0c033a7">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a790ea0aba2d252f96c23748ea0c033a7">mdns_out.h</a></li>
+<li>mdns_name_result_cb_t&#160;:&#160;<a class="el" href="mdns_8h.html#a6d658e2c5228b224b89488663d2b72f7">mdns.h</a></li>
+<li>MDNS_OUTPUT_PACKET_SIZE&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga0f0adf7b1d742b4ea818c1b7f6b0c547">mdns_opts.h</a></li>
+<li>mdns_prepare_txtdata()&#160;:&#160;<a class="el" href="mdns__out_8c.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f">mdns_out.h</a></li>
+<li>MDNS_PROBE_COUNT&#160;:&#160;<a class="el" href="mdns_8c.html#af24e590bf9c225a2efc0b55fac14809d">mdns.c</a></li>
+<li>MDNS_PROBE_DELAY_MS&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga7f6853d01ad32eb6ce99ae55307a37d9">mdns_opts.h</a></li>
+<li>mdns_readname()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#ab5f49d9356a76879e0e6a14eb0643b23">mdns_domain.h</a></li>
+<li>mdns_resp_add_netif()&#160;:&#160;<a class="el" href="group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e">mdns.c</a>, <a class="el" href="group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e">mdns.h</a></li>
+<li>mdns_resp_add_service()&#160;:&#160;<a class="el" href="group__mdns.html#ga2130111662d044b32970ce9c763bd409">mdns.c</a>, <a class="el" href="group__mdns.html#ga2130111662d044b32970ce9c763bd409">mdns.h</a></li>
 <li>mdns_resp_add_service_txtitem()&#160;:&#160;<a class="el" href="group__mdns.html#ga01c85202f4b85edc8b571f2f419db576">mdns.c</a>, <a class="el" href="group__mdns.html#ga01c85202f4b85edc8b571f2f419db576">mdns.h</a></li>
 <li>mdns_resp_announce()&#160;:&#160;<a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns.c</a>, <a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns.h</a></li>
-<li>mdns_resp_del_service()&#160;:&#160;<a class="el" href="group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad">mdns.c</a>, <a class="el" href="group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad">mdns.h</a></li>
+<li>mdns_resp_del_service()&#160;:&#160;<a class="el" href="group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a">mdns.c</a>, <a class="el" href="group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a">mdns.h</a></li>
 <li>mdns_resp_init()&#160;:&#160;<a class="el" href="group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3">mdns.c</a>, <a class="el" href="group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3">mdns.h</a></li>
+<li>mdns_resp_netif_active()&#160;:&#160;<a class="el" href="group__mdns.html#ga09b7a259f497648d8ef734b080f997c1">mdns.c</a>, <a class="el" href="group__mdns.html#ga09b7a259f497648d8ef734b080f997c1">mdns.h</a></li>
 <li>mdns_resp_netif_settings_changed&#160;:&#160;<a class="el" href="group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec">mdns.h</a></li>
 <li>mdns_resp_register_name_result_cb()&#160;:&#160;<a class="el" href="mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1">mdns.c</a>, <a class="el" href="mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1">mdns.h</a></li>
 <li>mdns_resp_remove_netif()&#160;:&#160;<a class="el" href="group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c">mdns.c</a>, <a class="el" href="group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c">mdns.h</a></li>
 <li>mdns_resp_rename_netif()&#160;:&#160;<a class="el" href="group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e">mdns.c</a>, <a class="el" href="group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e">mdns.h</a></li>
-<li>mdns_resp_rename_service()&#160;:&#160;<a class="el" href="group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9">mdns.c</a>, <a class="el" href="group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9">mdns.h</a></li>
+<li>mdns_resp_rename_service()&#160;:&#160;<a class="el" href="group__mdns.html#gab1e989a4c7305d754377c76052474beb">mdns.c</a>, <a class="el" href="group__mdns.html#gab1e989a4c7305d754377c76052474beb">mdns.h</a></li>
 <li>mdns_resp_restart()&#160;:&#160;<a class="el" href="group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a">mdns.c</a>, <a class="el" href="group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a">mdns.h</a></li>
+<li>mdns_resp_restart_delay()&#160;:&#160;<a class="el" href="group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737">mdns.c</a>, <a class="el" href="group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737">mdns.h</a></li>
 <li>MDNS_RESP_USENETIF_EXTCALLBACK&#160;:&#160;<a class="el" href="group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396">mdns_opts.h</a></li>
+<li>MDNS_RESPONSE_DELAY_MAX&#160;:&#160;<a class="el" href="mdns_8c.html#a482d6bf710af4424b71ee57034edbdbe">mdns.c</a></li>
+<li>mdns_search_service()&#160;:&#160;<a class="el" href="group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725">mdns.c</a>, <a class="el" href="group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725">mdns.h</a></li>
+<li>mdns_search_stop()&#160;:&#160;<a class="el" href="group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac">mdns.c</a>, <a class="el" href="group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac">mdns.h</a></li>
+<li>mdns_send_multicast_msg_delayed_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#acbf59dca94f241c1b58c7df1ec4b85e1">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#acbf59dca94f241c1b58c7df1ec4b85e1">mdns_out.h</a></li>
+<li>mdns_send_multicast_msg_delayed_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#af3e118eb80760a958265f6a4c59b2e49">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#af3e118eb80760a958265f6a4c59b2e49">mdns_out.h</a></li>
+<li>mdns_send_outpacket()&#160;:&#160;<a class="el" href="mdns__out_8c.html#ae8c9d2bd89d6ca7e8668ba708925d2e8">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#ae8c9d2bd89d6ca7e8668ba708925d2e8">mdns_out.h</a></li>
+<li>mdns_send_request()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a1f7dc9536f124263573518e6e8e1a162">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a1f7dc9536f124263573518e6e8e1a162">mdns_out.h</a></li>
+<li>mdns_send_unicast_msg_delayed_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a2b7a721b19fa33813133bc97f503c199">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a2b7a721b19fa33813133bc97f503c199">mdns_out.h</a></li>
+<li>mdns_send_unicast_msg_delayed_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a2713348b1b314d5e880442f2c130e1dc">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a2713348b1b314d5e880442f2c130e1dc">mdns_out.h</a></li>
+<li>mdns_set_timeout()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a6195808be1840daa8a100b5954a30cfe">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a6195808be1840daa8a100b5954a30cfe">mdns_out.h</a></li>
+<li>mdns_start_multicast_timeouts_ipv4()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a2dd35cb1e1fae888c05c2b7f8bd717cc">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a2dd35cb1e1fae888c05c2b7f8bd717cc">mdns_out.h</a></li>
+<li>mdns_start_multicast_timeouts_ipv6()&#160;:&#160;<a class="el" href="mdns__out_8c.html#a10f6f22640ac837a233bf43334dfb02a">mdns_out.c</a>, <a class="el" href="mdns__out_8h.html#a10f6f22640ac837a233bf43334dfb02a">mdns_out.h</a></li>
+<li>mdns_write_domain()&#160;:&#160;<a class="el" href="mdns__domain_8c.html#a92de54d2f384a4e4ffa85e529cc05411">mdns_domain.c</a>, <a class="el" href="mdns__domain_8h.html#a92de54d2f384a4e4ffa85e529cc05411">mdns_domain.h</a></li>
 <li>MEM_ALIGNMENT&#160;:&#160;<a class="el" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">opt.h</a></li>
 <li>mem_calloc()&#160;:&#160;<a class="el" href="mem_8c.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7">mem.c</a>, <a class="el" href="mem_8h.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7">mem.h</a></li>
 <li>MEM_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe">opt.h</a></li>
@@ -211,7 +249,7 @@
 <li>mqtt_connection_status_t&#160;:&#160;<a class="el" href="group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d">mqtt.h</a></li>
 <li>MQTT_CTL_PACKET_TYPE&#160;:&#160;<a class="el" href="mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b">mqtt.c</a></li>
 <li>MQTT_CYCLIC_TIMER_INTERVAL&#160;:&#160;<a class="el" href="group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e">mqtt_opts.h</a></li>
-<li>MQTT_DATA_FLAG_LAST&#160;:&#160;<a class="el" href="group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f">mqtt.h</a></li>
+<li>MQTT_DATA_FLAG_LAST&#160;:&#160;<a class="el" href="group__mqtt.html#ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f">mqtt.h</a></li>
 <li>MQTT_DEBUG&#160;:&#160;<a class="el" href="mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d">mqtt.c</a></li>
 <li>mqtt_disconnect()&#160;:&#160;<a class="el" href="group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6">mqtt.c</a>, <a class="el" href="group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6">mqtt.h</a></li>
 <li>mqtt_incoming_data_cb_t&#160;:&#160;<a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt.h</a></li>
diff --git a/doc/doxygen/output/html/globals_n.html b/doc/doxygen/output/html/globals_n.html
index 130d27e..cab098c 100644
--- a/doc/doxygen/output/html/globals_n.html
+++ b/doc/doxygen/output/html/globals_n.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -215,7 +215,9 @@
 <li>NETIF_FLAG_UP&#160;:&#160;<a class="el" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">netif.h</a></li>
 <li>netif_get_by_index()&#160;:&#160;<a class="el" href="group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a">netif.c</a>, <a class="el" href="group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a">netif.h</a></li>
 <li>netif_get_client_data&#160;:&#160;<a class="el" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif.h</a></li>
+<li>netif_get_igmp_mac_filter&#160;:&#160;<a class="el" href="netif_8h.html#a0a674553c18b429b53397372ea82fcaf">netif.h</a></li>
 <li>netif_get_ip6_addr_match()&#160;:&#160;<a class="el" href="netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc">netif.c</a>, <a class="el" href="netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc">netif.h</a></li>
+<li>netif_get_mld_mac_filter&#160;:&#160;<a class="el" href="netif_8h.html#a046c4816e37c3c4b84b3634eeeea7029">netif.h</a></li>
 <li>netif_igmp_data&#160;:&#160;<a class="el" href="group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d">igmp.h</a></li>
 <li>netif_igmp_mac_filter_fn&#160;:&#160;<a class="el" href="netif_8h.html#a71cad3277efe29191eef3348f4bf21f7">netif.h</a></li>
 <li>netif_index_to_name()&#160;:&#160;<a class="el" href="group__netif.html#ga0e755cb6624d3365551eeed5430fa226">netif.c</a>, <a class="el" href="group__netif.html#ga0e755cb6624d3365551eeed5430fa226">netif.h</a></li>
@@ -232,6 +234,7 @@
 <li>netif_loop_output()&#160;:&#160;<a class="el" href="group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif.c</a>, <a class="el" href="group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2">netif.h</a></li>
 <li>netif_mac_filter_action&#160;:&#160;<a class="el" href="netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0">netif.h</a></li>
 <li>NETIF_MAX_HWADDR_LEN&#160;:&#160;<a class="el" href="netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41">netif.h</a></li>
+<li>netif_mdns_data()&#160;:&#160;<a class="el" href="mdns_8c.html#af15fa5b6331bec605f68f53cb87f58fa">mdns.c</a>, <a class="el" href="mdns__priv_8h.html#af15fa5b6331bec605f68f53cb87f58fa">mdns_priv.h</a></li>
 <li>netif_mld6_data&#160;:&#160;<a class="el" href="group__mld6.html#ga02a2259082f22c5989a3c929be95e641">mld6.h</a></li>
 <li>netif_mld_mac_filter_fn&#160;:&#160;<a class="el" href="netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468">netif.h</a></li>
 <li>netif_name_to_index()&#160;:&#160;<a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif.c</a>, <a class="el" href="group__netif.html#gac763a1f647fb9e8af4254418e813a6ae">netif.h</a></li>
@@ -247,18 +250,20 @@
 <li>netif_set_default()&#160;:&#160;<a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif.c</a>, <a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif.h</a></li>
 <li>netif_set_down()&#160;:&#160;<a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif.c</a>, <a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif.h</a></li>
 <li>netif_set_gw()&#160;:&#160;<a class="el" href="group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520">netif.c</a>, <a class="el" href="group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520">netif.h</a></li>
+<li>netif_set_igmp_mac_filter&#160;:&#160;<a class="el" href="group__netif.html#ga3428b3f8195249c6cd8704a4db46b401">netif.h</a></li>
 <li>netif_set_ipaddr()&#160;:&#160;<a class="el" href="group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca">netif.c</a>, <a class="el" href="group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca">netif.h</a></li>
 <li>netif_set_link_callback()&#160;:&#160;<a class="el" href="group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4">netif.c</a>, <a class="el" href="group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4">netif.h</a></li>
 <li>netif_set_link_down()&#160;:&#160;<a class="el" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif.c</a>, <a class="el" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif.h</a></li>
 <li>netif_set_link_up()&#160;:&#160;<a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif.c</a>, <a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif.h</a></li>
+<li>netif_set_mld_mac_filter&#160;:&#160;<a class="el" href="group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c">netif.h</a></li>
 <li>netif_set_netmask()&#160;:&#160;<a class="el" href="group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53">netif.c</a>, <a class="el" href="group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53">netif.h</a></li>
 <li>netif_set_remove_callback()&#160;:&#160;<a class="el" href="group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce">netif.c</a>, <a class="el" href="group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce">netif.h</a></li>
 <li>netif_set_status_callback()&#160;:&#160;<a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif.c</a>, <a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif.h</a></li>
 <li>netif_set_up()&#160;:&#160;<a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif.c</a>, <a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif.h</a></li>
 <li>netif_status_callback_fn&#160;:&#160;<a class="el" href="netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436">netif.h</a></li>
 <li>netif_to_num()&#160;:&#160;<a class="el" href="snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de">snmp_core.c</a>, <a class="el" href="snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de">snmp_core.h</a></li>
-<li>netifapi_arp_add()&#160;:&#160;<a class="el" href="netifapi_8c.html#a62b0bdbb3783eb27aa73485081306119">netifapi.c</a>, <a class="el" href="netifapi_8h.html#a62b0bdbb3783eb27aa73485081306119">netifapi.h</a></li>
-<li>netifapi_arp_remove()&#160;:&#160;<a class="el" href="netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8">netifapi.c</a>, <a class="el" href="netifapi_8h.html#a037c3d05c19b4d467b6ce06eb4639ee8">netifapi.h</a></li>
+<li>netifapi_arp_add()&#160;:&#160;<a class="el" href="group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119">netifapi.c</a></li>
+<li>netifapi_arp_remove()&#160;:&#160;<a class="el" href="group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8">netifapi.c</a></li>
 <li>netifapi_autoip_start&#160;:&#160;<a class="el" href="group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2">netifapi.h</a></li>
 <li>netifapi_autoip_stop&#160;:&#160;<a class="el" href="group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d">netifapi.h</a></li>
 <li>netifapi_dhcp_inform&#160;:&#160;<a class="el" href="group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0">netifapi.h</a></li>
diff --git a/doc/doxygen/output/html/globals_p.html b/doc/doxygen/output/html/globals_p.html
index 867b69d..ff85ea6 100644
--- a/doc/doxygen/output/html/globals_p.html
+++ b/doc/doxygen/output/html/globals_p.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_q.html b/doc/doxygen/output/html/globals_q.html
new file mode 100644
index 0000000..08ebf9b
--- /dev/null
+++ b/doc/doxygen/output/html/globals_q.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('globals_q.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_q" name="index_q"></a>- q -</h3><ul>
+<li>QUESTION_PROBE_HOST_ANY&#160;:&#160;<a class="el" href="mdns__out_8h.html#ab3297d69b0effb5eb01a9b8c5a708ea9">mdns_out.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/globals_r.html b/doc/doxygen/output/html/globals_r.html
index a4ea085..229f5a2 100644
--- a/doc/doxygen/output/html/globals_r.html
+++ b/doc/doxygen/output/html/globals_r.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_s.html b/doc/doxygen/output/html/globals_s.html
index b7a6886..909cad2 100644
--- a/doc/doxygen/output/html/globals_s.html
+++ b/doc/doxygen/output/html/globals_s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,6 +102,7 @@
 <h3><a id="index_s" name="index_s"></a>- s -</h3><ul>
 <li>SELWAIT_T&#160;:&#160;<a class="el" href="sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196">sockets_priv.h</a></li>
 <li>service_get_txt_fn_t&#160;:&#160;<a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">mdns.h</a></li>
+<li>SET_TIMEOUT_FROM_OFFERED&#160;:&#160;<a class="el" href="dhcp_8c.html#a33f306da575f8a437996d073b374df82">dhcp.c</a></li>
 <li>SLIP_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857">opt.h</a></li>
 <li>SLIP_MAX_SIZE&#160;:&#160;<a class="el" href="slipif_8c.html#accf448f9dabb0f33ef46b40355691cab">slipif.c</a></li>
 <li>SLIP_RX_QUEUE&#160;:&#160;<a class="el" href="slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668">slipif.h</a></li>
@@ -169,6 +170,7 @@
 <li>snmp_get_community()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8">snmp.h</a></li>
 <li>snmp_get_community_trap()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba">snmp_msg.c</a>, <a class="el" href="group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba">snmp.h</a></li>
 <li>snmp_get_community_write()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e">snmp.h</a></li>
+<li>snmp_get_default_trap_version()&#160;:&#160;<a class="el" href="group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359">snmp.h</a></li>
 <li>snmp_get_device_enterprise_oid()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8">snmp_core.c</a>, <a class="el" href="group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8">snmp.h</a></li>
 <li>snmp_ifType&#160;:&#160;<a class="el" href="group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba">snmp.h</a></li>
 <li>snmp_init()&#160;:&#160;<a class="el" href="snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5">snmp_netconn.c</a>, <a class="el" href="group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5">snmp_raw.c</a></li>
@@ -213,14 +215,19 @@
 <li>snmp_oid_to_ip6()&#160;:&#160;<a class="el" href="snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09">snmp_core.c</a>, <a class="el" href="snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09">snmp_core.h</a></li>
 <li>snmp_oid_to_ip_port()&#160;:&#160;<a class="el" href="snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507">snmp_core.c</a>, <a class="el" href="snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507">snmp_core.h</a></li>
 <li>SNMP_SAFE_REQUESTS&#160;:&#160;<a class="el" href="group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261">snmp_opts.h</a></li>
-<li>snmp_send_trap()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd">snmp.h</a></li>
+<li>snmp_send_inform()&#160;:&#160;<a class="el" href="group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692">snmp.h</a></li>
+<li>snmp_send_inform_generic()&#160;:&#160;<a class="el" href="group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275">snmp.h</a></li>
+<li>snmp_send_inform_specific()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210">snmp.h</a></li>
+<li>snmp_send_trap()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c">snmp.h</a></li>
 <li>snmp_send_trap_generic()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga0e044259289cb690197173f93c17607d">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga0e044259289cb690197173f93c17607d">snmp.h</a></li>
 <li>snmp_send_trap_specific()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1">snmp.h</a></li>
 <li>snmp_set_auth_traps_enabled()&#160;:&#160;<a class="el" href="group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c">snmp.h</a></li>
 <li>snmp_set_community()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1">snmp.h</a></li>
 <li>snmp_set_community_trap()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp_msg.c</a>, <a class="el" href="group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760">snmp.h</a></li>
 <li>snmp_set_community_write()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga341461766863cff46a44e5f431f2da01">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga341461766863cff46a44e5f431f2da01">snmp.h</a></li>
+<li>snmp_set_default_trap_version()&#160;:&#160;<a class="el" href="group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455">snmp_traps.c</a>, <a class="el" href="group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455">snmp.h</a></li>
 <li>snmp_set_device_enterprise_oid()&#160;:&#160;<a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp_core.c</a>, <a class="el" href="group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a">snmp.h</a></li>
+<li>snmp_set_inform_callback()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838">snmp.h</a></li>
 <li>snmp_set_mibs()&#160;:&#160;<a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp_core.c</a>, <a class="el" href="group__snmp__core.html#ga29c76474971f25d038fd486447c70e21">snmp.h</a></li>
 <li>snmp_set_write_callback()&#160;:&#160;<a class="el" href="group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b">snmp_msg.c</a>, <a class="el" href="group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b">snmp.h</a></li>
 <li>SNMP_STACK_SIZE&#160;:&#160;<a class="el" href="group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242">snmp_opts.h</a></li>
@@ -242,6 +249,7 @@
 <li>SNTP_GET_SERVERS_FROM_DHCP&#160;:&#160;<a class="el" href="group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade">sntp_opts.h</a></li>
 <li>SNTP_GET_SERVERS_FROM_DHCPV6&#160;:&#160;<a class="el" href="group__sntp__opts.html#ga0d5b4f1e382d08f0df9dbe0c9da64006">sntp_opts.h</a></li>
 <li>SNTP_GET_SYSTEM_TIME&#160;:&#160;<a class="el" href="group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63">sntp_opts.h</a></li>
+<li>sntp_getkodreceived()&#160;:&#160;<a class="el" href="group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e">sntp.c</a>, <a class="el" href="group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e">sntp.h</a></li>
 <li>sntp_getoperatingmode()&#160;:&#160;<a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp.c</a>, <a class="el" href="group__sntp.html#gae66404a551d5cef420cf844a71356fae">sntp.h</a></li>
 <li>sntp_getreachability()&#160;:&#160;<a class="el" href="group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e">sntp.c</a>, <a class="el" href="group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e">sntp.h</a></li>
 <li>sntp_getserver()&#160;:&#160;<a class="el" href="group__sntp.html#gab114c12154cf2c3e3a733724c6a77429">sntp.c</a>, <a class="el" href="group__sntp.html#gab114c12154cf2c3e3a733724c6a77429">sntp.h</a></li>
diff --git a/doc/doxygen/output/html/globals_t.html b/doc/doxygen/output/html/globals_t.html
index af31c54..0c7b771 100644
--- a/doc/doxygen/output/html/globals_t.html
+++ b/doc/doxygen/output/html/globals_t.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -129,10 +129,10 @@
 <li>tcp_err()&#160;:&#160;<a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp.c</a>, <a class="el" href="group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121">tcp.h</a></li>
 <li>tcp_err_fn&#160;:&#160;<a class="el" href="tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55">tcp.h</a></li>
 <li>tcp_ext_arg_alloc_id()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp.h</a></li>
-<li>tcp_ext_arg_get()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855">tcp.h</a></li>
+<li>tcp_ext_arg_get()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56">tcp.h</a></li>
 <li>tcp_ext_arg_invoke_callbacks_passive_open()&#160;:&#160;<a class="el" href="tcp_8c.html#a5265b1df024d04287ed3edc02b1b9ccc">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#a5265b1df024d04287ed3edc02b1b9ccc">tcp_priv.h</a></li>
-<li>tcp_ext_arg_set()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318">tcp.h</a></li>
-<li>tcp_ext_arg_set_callbacks()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316">tcp.h</a></li>
+<li>tcp_ext_arg_set()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e">tcp.h</a></li>
+<li>tcp_ext_arg_set_callbacks()&#160;:&#160;<a class="el" href="group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5">tcp.c</a>, <a class="el" href="group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5">tcp.h</a></li>
 <li>tcp_extarg_callback_passive_open_fn&#160;:&#160;<a class="el" href="tcp_8h.html#aba649c5bdf19d47e39643392b6d88588">tcp.h</a></li>
 <li>tcp_extarg_callback_pcb_destroyed_fn&#160;:&#160;<a class="el" href="tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd">tcp.h</a></li>
 <li>tcp_fasttmr()&#160;:&#160;<a class="el" href="tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d">tcp_priv.h</a></li>
@@ -179,6 +179,7 @@
 <li>tcp_rexmit_rto_prepare()&#160;:&#160;<a class="el" href="tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39">tcp_priv.h</a></li>
 <li>tcp_rst()&#160;:&#160;<a class="el" href="tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014">tcp_priv.h</a></li>
 <li>TCP_RST_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679">opt.h</a></li>
+<li>tcp_rst_netif()&#160;:&#160;<a class="el" href="tcp__out_8c.html#a7cf7cbc5aa473de8116dc9f00cbc5d57">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#a7cf7cbc5aa473de8116dc9f00cbc5d57">tcp_priv.h</a></li>
 <li>TCP_RTO_DEBUG&#160;:&#160;<a class="el" href="group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662">opt.h</a></li>
 <li>tcp_seg_copy()&#160;:&#160;<a class="el" href="tcp_8c.html#a9384b436de95d5bf8550438b9d3c8cd4">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4">tcp_priv.h</a></li>
 <li>tcp_seg_free()&#160;:&#160;<a class="el" href="tcp_8c.html#ac6283651b26f74dba2444159aee88b20">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20">tcp_priv.h</a></li>
@@ -187,7 +188,7 @@
 <li>tcp_send_fin()&#160;:&#160;<a class="el" href="tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342">tcp_out.c</a>, <a class="el" href="tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342">tcp_priv.h</a></li>
 <li>tcp_sent()&#160;:&#160;<a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp.c</a>, <a class="el" href="group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808">tcp.h</a></li>
 <li>tcp_sent_fn&#160;:&#160;<a class="el" href="tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18">tcp.h</a></li>
-<li>tcp_setprio()&#160;:&#160;<a class="el" href="tcp_8c.html#a2c4234f1e95b6bde0e84d4ea97ae95bc">tcp.c</a>, <a class="el" href="tcp_8h.html#a2c4234f1e95b6bde0e84d4ea97ae95bc">tcp.h</a></li>
+<li>tcp_setprio()&#160;:&#160;<a class="el" href="group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc">tcp.c</a>, <a class="el" href="group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc">tcp.h</a></li>
 <li>tcp_shutdown()&#160;:&#160;<a class="el" href="group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd">tcp.c</a>, <a class="el" href="group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd">tcp.h</a></li>
 <li>tcp_slowtmr()&#160;:&#160;<a class="el" href="tcp_8c.html#a421fb42ef919018e14ae413adfee9905">tcp.c</a>, <a class="el" href="tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905">tcp_priv.h</a></li>
 <li>TCP_SND_BUF&#160;:&#160;<a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">opt.h</a></li>
@@ -212,6 +213,7 @@
 <li>tcpip_api_call()&#160;:&#160;<a class="el" href="tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08">tcpip.c</a>, <a class="el" href="tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08">tcpip_priv.h</a></li>
 <li>tcpip_callback()&#160;:&#160;<a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip.c</a>, <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip.h</a></li>
 <li>tcpip_callback_fn&#160;:&#160;<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip.h</a></li>
+<li>tcpip_callback_wait()&#160;:&#160;<a class="el" href="tcpip_8c.html#a8d8a2ac0271def71a4ca31b24a31228f">tcpip.c</a>, <a class="el" href="tcpip_8h.html#a8d8a2ac0271def71a4ca31b24a31228f">tcpip.h</a></li>
 <li>tcpip_callback_with_block&#160;:&#160;<a class="el" href="group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df">tcpip.h</a></li>
 <li>tcpip_callbackmsg_delete()&#160;:&#160;<a class="el" href="group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd">tcpip.c</a>, <a class="el" href="group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd">tcpip.h</a></li>
 <li>tcpip_callbackmsg_new()&#160;:&#160;<a class="el" href="group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1">tcpip.c</a>, <a class="el" href="group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1">tcpip.h</a></li>
@@ -230,9 +232,11 @@
 <li>TCPIP_THREAD_STACKSIZE&#160;:&#160;<a class="el" href="group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0">opt.h</a></li>
 <li>tcpip_try_callback()&#160;:&#160;<a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip.c</a>, <a class="el" href="group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip.h</a></li>
 <li>TF_RESET&#160;:&#160;<a class="el" href="tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990">tcp_priv.h</a></li>
-<li>tftp_cleanup()&#160;:&#160;<a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_server.c</a>, <a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_server.h</a></li>
+<li>tftp_cleanup()&#160;:&#160;<a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp.c</a>, <a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_common.h</a></li>
 <li>TFTP_DEBUG&#160;:&#160;<a class="el" href="group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981">tftp_opts.h</a></li>
-<li>tftp_init()&#160;:&#160;<a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_server.c</a>, <a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_server.h</a></li>
+<li>tftp_init_client()&#160;:&#160;<a class="el" href="group__tftp.html#gaa6b743a64287206acb825bd60448e5f8">tftp.c</a>, <a class="el" href="group__tftp.html#gaa6b743a64287206acb825bd60448e5f8">tftp_client.h</a></li>
+<li>tftp_init_common()&#160;:&#160;<a class="el" href="tftp_8c.html#a5c6cf3de84a0dc990c055d66e574ca70">tftp.c</a>, <a class="el" href="tftp__common_8h.html#a5c6cf3de84a0dc990c055d66e574ca70">tftp_common.h</a></li>
+<li>tftp_init_server()&#160;:&#160;<a class="el" href="group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40">tftp.c</a>, <a class="el" href="group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40">tftp_server.h</a></li>
 <li>TFTP_MAX_FILENAME_LEN&#160;:&#160;<a class="el" href="group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b">tftp_opts.h</a></li>
 <li>TFTP_MAX_MODE_LEN&#160;:&#160;<a class="el" href="group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055">tftp_opts.h</a></li>
 <li>TFTP_MAX_RETRIES&#160;:&#160;<a class="el" href="group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313">tftp_opts.h</a></li>
diff --git a/doc/doxygen/output/html/globals_type.html b/doc/doxygen/output/html/globals_type.html
index a23f364..0efb12a 100644
--- a/doc/doxygen/output/html/globals_type.html
+++ b/doc/doxygen/output/html/globals_type.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -99,12 +99,19 @@
 <div class="contents">
 <div class="textblock">Here is a list of all documented typedefs with links to the documentation:</div>
 
+<h3><a id="index_a" name="index_a"></a>- a -</h3><ul>
+<li>acd_conflict_callback_t&#160;:&#160;<a class="el" href="acd_8h.html#abb446404752f56b028eafa8302db955f">acd.h</a></li>
+<li>altcp_allocator_t&#160;:&#160;<a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp.h</a></li>
+</ul>
+
+
 <h3><a id="index_b" name="index_b"></a>- b -</h3><ul>
 <li>bridgeif_initdata_t&#160;:&#160;<a class="el" href="group__bridgeif.html#ga61c8f232a5907f3662157746e71d35cc">bridgeif.h</a></li>
 </ul>
 
 
 <h3><a id="index_d" name="index_d"></a>- d -</h3><ul>
+<li>dhcp_timeout_t&#160;:&#160;<a class="el" href="dhcp_8h.html#aa85d661c7e160921c0497e7baa892b67">dhcp.h</a></li>
 <li>dns_found_callback&#160;:&#160;<a class="el" href="dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae">dns.h</a></li>
 </ul>
 
@@ -138,7 +145,7 @@
 
 
 <h3><a id="index_m" name="index_m"></a>- m -</h3><ul>
-<li>mdns_name_result_cb_t&#160;:&#160;<a class="el" href="mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536">mdns.h</a></li>
+<li>mdns_name_result_cb_t&#160;:&#160;<a class="el" href="mdns_8h.html#a6d658e2c5228b224b89488663d2b72f7">mdns.h</a></li>
 <li>mqtt_connection_cb_t&#160;:&#160;<a class="el" href="group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f">mqtt.h</a></li>
 <li>mqtt_incoming_data_cb_t&#160;:&#160;<a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt.h</a></li>
 <li>mqtt_incoming_publish_cb_t&#160;:&#160;<a class="el" href="group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29">mqtt.h</a></li>
diff --git a/doc/doxygen/output/html/globals_u.html b/doc/doxygen/output/html/globals_u.html
index 3d0792d..f3339cc 100644
--- a/doc/doxygen/output/html/globals_u.html
+++ b/doc/doxygen/output/html/globals_u.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/globals_vars.html b/doc/doxygen/output/html/globals_vars.html
index 706f701..f42a8bb 100644
--- a/doc/doxygen/output/html/globals_vars.html
+++ b/doc/doxygen/output/html/globals_vars.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,8 +101,6 @@
 
 <h3><a id="index_d" name="index_d"></a>- d -</h3><ul>
 <li>dhcp6_rx_options&#160;:&#160;<a class="el" href="dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0">dhcp6.c</a></li>
-<li>dhcp_rx_options_given&#160;:&#160;<a class="el" href="dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc">dhcp.c</a></li>
-<li>dhcp_rx_options_val&#160;:&#160;<a class="el" href="dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f">dhcp.c</a></li>
 </ul>
 
 
diff --git a/doc/doxygen/output/html/globals_z.html b/doc/doxygen/output/html/globals_z.html
index 13d916e..1e5553e 100644
--- a/doc/doxygen/output/html/globals_z.html
+++ b/doc/doxygen/output/html/globals_z.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__acd.html b/doc/doxygen/output/html/group__acd.html
new file mode 100644
index 0000000..fc5f046
--- /dev/null
+++ b/doc/doxygen/output/html/group__acd.html
@@ -0,0 +1,325 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ACD</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('group__acd.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle"><div class="title">ACD<div class="ingroups"><a class="el" href="group__api.html">APIs</a> &raquo; <a class="el" href="group__callbackstyle__api.html">&quot;raw&quot; APIs</a> &raquo; <a class="el" href="group__ip.html">IP</a> &raquo; <a class="el" href="group__ip4.html">IPv4</a></div></div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga158856bf139cb2761837ddfa07303bdc" id="r_ga158856bf139cb2761837ddfa07303bdc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga158856bf139cb2761837ddfa07303bdc">acd_add</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>, <a class="el" href="acd_8h.html#abb446404752f56b028eafa8302db955f">acd_conflict_callback_t</a> acd_conflict_callback)</td></tr>
+<tr class="separator:ga158856bf139cb2761837ddfa07303bdc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga70503696bca25e1cfb61fad38b4327da" id="r_ga70503696bca25e1cfb61fad38b4327da"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga70503696bca25e1cfb61fad38b4327da">acd_remove</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>)</td></tr>
+<tr class="separator:ga70503696bca25e1cfb61fad38b4327da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2ca2e2dbb9713f90515d443dc691b5cb" id="r_ga2ca2e2dbb9713f90515d443dc691b5cb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga2ca2e2dbb9713f90515d443dc691b5cb">acd_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>, <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> ipaddr)</td></tr>
+<tr class="separator:ga2ca2e2dbb9713f90515d443dc691b5cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga36da2b23951a14ca3c92f5e78db2f1b7" id="r_ga36da2b23951a14ca3c92f5e78db2f1b7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga36da2b23951a14ca3c92f5e78db2f1b7">acd_stop</a> (struct <a class="el" href="structacd.html">acd</a> *<a class="el" href="structacd.html">acd</a>)</td></tr>
+<tr class="separator:ga36da2b23951a14ca3c92f5e78db2f1b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2872fa375f9cd8f5b095639d652f6bff" id="r_ga2872fa375f9cd8f5b095639d652f6bff"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga2872fa375f9cd8f5b095639d652f6bff">acd_network_changed_link_down</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga2872fa375f9cd8f5b095639d652f6bff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga18b444f6fc69325416b463208a754c97" id="r_ga18b444f6fc69325416b463208a754c97"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga18b444f6fc69325416b463208a754c97">acd_netif_ip_addr_changed</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *old_addr, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *new_addr)</td></tr>
+<tr class="separator:ga18b444f6fc69325416b463208a754c97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>ACD related functions USAGE:</p>
+<p>define <a class="el" href="group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7">LWIP_ACD</a> 1 in your lwipopts.h Options: ACD_TMR_INTERVAL msecs, I recommend a value of 100. The value must divide 1000 with a remainder almost 0. Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 ....</p>
+<p>For fixed IP:</p><ul>
+<li>call acd_start after selecting an IP address. The caller will be informed on conflict status via the callback function.</li>
+</ul>
+<p>With AUTOIP:</p><ul>
+<li>will be called from the autoip module. No extra's needed.</li>
+</ul>
+<p>With DHCP:</p><ul>
+<li>enable LWIP_DHCP_DOES_ACD_CHECK. Then it will be called from the dhcp module. No extra's needed. </li>
+</ul>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga158856bf139cb2761837ddfa07303bdc" name="ga158856bf139cb2761837ddfa07303bdc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga158856bf139cb2761837ddfa07303bdc">&#9670;&#160;</a></span>acd_add()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> acd_add </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structacd.html">acd</a> *</td>          <td class="paramname"><span class="paramname"><em>acd</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="acd_8h.html#abb446404752f56b028eafa8302db955f">acd_conflict_callback_t</a></td>          <td class="paramname"><span class="paramname"><em>acd_conflict_callback</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add ACD client to the client list and initialize callback function</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which to start the acd client </td></tr>
+    <tr><td class="paramname">acd</td><td>acd module to be added to the list </td></tr>
+    <tr><td class="paramname">acd_conflict_callback</td><td>callback to be called when conflict information is available </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga18b444f6fc69325416b463208a754c97" name="ga18b444f6fc69325416b463208a754c97"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga18b444f6fc69325416b463208a754c97">&#9670;&#160;</a></span>acd_netif_ip_addr_changed()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void acd_netif_ip_addr_changed </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>old_addr</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>new_addr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Inform the ACD modules of address changes</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which the address is changing </td></tr>
+    <tr><td class="paramname">old_addr</td><td>old ip address </td></tr>
+    <tr><td class="paramname">new_addr</td><td>new ip address </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga2872fa375f9cd8f5b095639d652f6bff" name="ga2872fa375f9cd8f5b095639d652f6bff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2872fa375f9cd8f5b095639d652f6bff">&#9670;&#160;</a></span>acd_network_changed_link_down()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void acd_network_changed_link_down </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Inform the ACD modules when the link goes down</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which to inform the ACD clients </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga70503696bca25e1cfb61fad38b4327da" name="ga70503696bca25e1cfb61fad38b4327da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga70503696bca25e1cfb61fad38b4327da">&#9670;&#160;</a></span>acd_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void acd_remove </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structacd.html">acd</a> *</td>          <td class="paramname"><span class="paramname"><em>acd</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remvoe ACD client from the client list</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface from which to remove the acd client </td></tr>
+    <tr><td class="paramname">acd</td><td>acd module to be removed from the list </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga2ca2e2dbb9713f90515d443dc691b5cb" name="ga2ca2e2dbb9713f90515d443dc691b5cb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2ca2e2dbb9713f90515d443dc691b5cb">&#9670;&#160;</a></span>acd_start()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> acd_start </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structacd.html">acd</a> *</td>          <td class="paramname"><span class="paramname"><em>acd</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a></td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start ACD client</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface on which to start the acd client </td></tr>
+    <tr><td class="paramname">acd</td><td>acd module to start </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>ip address to perform acd on </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga36da2b23951a14ca3c92f5e78db2f1b7" name="ga36da2b23951a14ca3c92f5e78db2f1b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga36da2b23951a14ca3c92f5e78db2f1b7">&#9670;&#160;</a></span>acd_stop()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> acd_stop </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structacd.html">acd</a> *</td>          <td class="paramname"><span class="paramname"><em>acd</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop ACD client</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">acd</td><td>acd module to stop </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__acd.js b/doc/doxygen/output/html/group__acd.js
new file mode 100644
index 0000000..de98917
--- /dev/null
+++ b/doc/doxygen/output/html/group__acd.js
@@ -0,0 +1,9 @@
+var group__acd =
+[
+    [ "acd_add", "group__acd.html#ga158856bf139cb2761837ddfa07303bdc", null ],
+    [ "acd_netif_ip_addr_changed", "group__acd.html#ga18b444f6fc69325416b463208a754c97", null ],
+    [ "acd_network_changed_link_down", "group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff", null ],
+    [ "acd_remove", "group__acd.html#ga70503696bca25e1cfb61fad38b4327da", null ],
+    [ "acd_start", "group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb", null ],
+    [ "acd_stop", "group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__altcp.html b/doc/doxygen/output/html/group__altcp.html
index 10c2327..86a69a4 100644
--- a/doc/doxygen/output/html/group__altcp.html
+++ b/doc/doxygen/output/html/group__altcp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -99,6 +99,8 @@
 <div class="header">
   <div class="summary">
 <a href="#groups">Topics</a> &#124;
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle"><div class="title">Application layered TCP Functions<div class="ingroups"><a class="el" href="group__api.html">APIs</a> &raquo; <a class="el" href="group__callbackstyle__api.html">&quot;raw&quot; APIs</a> &raquo; <a class="el" href="group__altcp__api.html">Application layered TCP Introduction</a></div></div></div>
 </div><!--header-->
@@ -109,13 +111,23 @@
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__altcp__tls.html">TLS layer</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaltcp__allocator__s.html">altcp_allocator_s</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga04a328f67359ee03d1ec6824978b7209" id="r_ga04a328f67359ee03d1ec6824978b7209"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structaltcp__allocator__s.html">altcp_allocator_s</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a></td></tr>
+<tr class="separator:ga04a328f67359ee03d1ec6824978b7209"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:gaffc72b9dc85bb0a9e83d04921d4c7bcd" id="r_gaffc72b9dc85bb0a9e83d04921d4c7bcd"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaffc72b9dc85bb0a9e83d04921d4c7bcd">altcp_new_ip6</a> (altcp_allocator_t *allocator)</td></tr>
+<tr class="memitem:gaffc72b9dc85bb0a9e83d04921d4c7bcd" id="r_gaffc72b9dc85bb0a9e83d04921d4c7bcd"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaffc72b9dc85bb0a9e83d04921d4c7bcd">altcp_new_ip6</a> (<a class="el" href="#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *allocator)</td></tr>
 <tr class="separator:gaffc72b9dc85bb0a9e83d04921d4c7bcd"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga6b0fc20cce40364aa821c07dc34cb908" id="r_ga6b0fc20cce40364aa821c07dc34cb908"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a> (altcp_allocator_t *allocator)</td></tr>
+<tr class="memitem:ga6b0fc20cce40364aa821c07dc34cb908" id="r_ga6b0fc20cce40364aa821c07dc34cb908"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a> (<a class="el" href="#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *allocator)</td></tr>
 <tr class="separator:ga6b0fc20cce40364aa821c07dc34cb908"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaba885062fe43d317e66c25feb9f7f71d" id="r_gaba885062fe43d317e66c25feb9f7f71d"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaba885062fe43d317e66c25feb9f7f71d">altcp_new_ip_type</a> (altcp_allocator_t *allocator, u8_t ip_type)</td></tr>
+<tr class="memitem:gaba885062fe43d317e66c25feb9f7f71d" id="r_gaba885062fe43d317e66c25feb9f7f71d"><td class="memItemLeft" align="right" valign="top">struct altcp_pcb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaba885062fe43d317e66c25feb9f7f71d">altcp_new_ip_type</a> (<a class="el" href="#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *allocator, u8_t ip_type)</td></tr>
 <tr class="separator:gaba885062fe43d317e66c25feb9f7f71d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga197a33af038556a04d8f27c7033d771f" id="r_ga197a33af038556a04d8f27c7033d771f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga197a33af038556a04d8f27c7033d771f">altcp_arg</a> (struct altcp_pcb *conn, void *arg)</td></tr>
 <tr class="separator:ga197a33af038556a04d8f27c7033d771f"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -158,6 +170,22 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>This file contains the common functions for altcp to work. For more details see <a class="el" href="group__altcp__api.html">Application layered TCP Introduction</a>. </p>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ga04a328f67359ee03d1ec6824978b7209" name="ga04a328f67359ee03d1ec6824978b7209"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga04a328f67359ee03d1ec6824978b7209">&#9670;&#160;</a></span>altcp_allocator_t</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structaltcp__allocator__s.html">altcp_allocator_s</a> <a class="el" href="#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Struct containing an allocator and its state. </p>
+
+</div>
+</div>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="ga7f6fab99fed448385a76b4a5100796ab" name="ga7f6fab99fed448385a76b4a5100796ab"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga7f6fab99fed448385a76b4a5100796ab">&#9670;&#160;</a></span>altcp_abort()</h2>
@@ -374,7 +402,7 @@
         <tr>
           <td class="memname">struct altcp_pcb * altcp_new </td>
           <td>(</td>
-          <td class="paramtype">altcp_allocator_t *</td>          <td class="paramname"><span class="paramname"><em>allocator</em></span></td><td>)</td>
+          <td class="paramtype"><a class="el" href="#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *</td>          <td class="paramname"><span class="paramname"><em>allocator</em></span></td><td>)</td>
           <td></td>
         </tr>
       </table>
@@ -392,7 +420,7 @@
         <tr>
           <td class="memname">struct altcp_pcb * altcp_new_ip6 </td>
           <td>(</td>
-          <td class="paramtype">altcp_allocator_t *</td>          <td class="paramname"><span class="paramname"><em>allocator</em></span></td><td>)</td>
+          <td class="paramtype"><a class="el" href="#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *</td>          <td class="paramname"><span class="paramname"><em>allocator</em></span></td><td>)</td>
           <td></td>
         </tr>
       </table>
@@ -410,7 +438,7 @@
         <tr>
           <td class="memname">struct altcp_pcb * altcp_new_ip_type </td>
           <td>(</td>
-          <td class="paramtype">altcp_allocator_t *</td>          <td class="paramname"><span class="paramname"><em>allocator</em></span>, </td>
+          <td class="paramtype"><a class="el" href="#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> *</td>          <td class="paramname"><span class="paramname"><em>allocator</em></span>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -560,7 +588,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<dl class="section see"><dt>See also</dt><dd><a class="el" href="tcp_8c.html#a2c4234f1e95b6bde0e84d4ea97ae95bc">tcp_setprio()</a> </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc">tcp_setprio()</a> </dd></dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__altcp.js b/doc/doxygen/output/html/group__altcp.js
index d69507f..b3ef0ea 100644
--- a/doc/doxygen/output/html/group__altcp.js
+++ b/doc/doxygen/output/html/group__altcp.js
@@ -1,6 +1,11 @@
 var group__altcp =
 [
     [ "TLS layer", "group__altcp__tls.html", "group__altcp__tls" ],
+    [ "altcp_allocator_s", "structaltcp__allocator__s.html", [
+      [ "alloc", "structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687", null ],
+      [ "arg", "structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1", null ]
+    ] ],
+    [ "altcp_allocator_t", "group__altcp.html#ga04a328f67359ee03d1ec6824978b7209", null ],
     [ "altcp_abort", "group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab", null ],
     [ "altcp_accept", "group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9", null ],
     [ "altcp_arg", "group__altcp.html#ga197a33af038556a04d8f27c7033d771f", null ],
diff --git a/doc/doxygen/output/html/group__altcp__api.html b/doc/doxygen/output/html/group__altcp__api.html
index 96decf9..5640938 100644
--- a/doc/doxygen/output/html/group__altcp__api.html
+++ b/doc/doxygen/output/html/group__altcp__api.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -122,8 +122,8 @@
 <li>Include "lwip/altcp.h" instead of "lwip/tcp.h"</li>
 <li>Replace "struct tcp_pcb" with "struct altcp_pcb"</li>
 <li>Prefix all called tcp API functions with "altcp_" instead of "tcp_" to link against the altcp functions</li>
-<li><a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a> (and altcp_new_ip_type/ altcp_new_ip6) take an altcp_allocator_t as an argument, whereas the original tcp API functions take no arguments.</li>
-<li>An altcp_allocator_t allocator is an object that holds a pointer to an allocator object and a corresponding state (e.g. for TLS, the corresponding state may hold certificates or keys). This way, the application does not even need to know if it uses TLS or pure TCP, this is handled at runtime by passing a specific allocator.</li>
+<li><a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a> (and <a class="el" href="group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d">altcp_new_ip_type</a> / <a class="el" href="group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd">altcp_new_ip6</a>) take an <a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> as an argument, whereas the original tcp API functions take no arguments.</li>
+<li>An <a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> allocator is an object that holds a pointer to an allocator object and a corresponding state (e.g. for TLS, the corresponding state may hold certificates or keys). This way, the application does not even need to know if it uses TLS or pure TCP, this is handled at runtime by passing a specific allocator.</li>
 <li>An application can alternatively bind hard to the altcp_tls API by calling <a class="el" href="group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8">altcp_tls_new</a> or <a class="el" href="group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c">altcp_tls_wrap</a>.</li>
 <li>The TLS layer is not directly implemented by lwIP, but a port to mbedTLS is provided.</li>
 <li>Another altcp layer is proxy-connect to use TLS behind a HTTP proxy (see <a class="el" href="altcp__proxyconnect_8h.html">altcp_proxyconnect.h</a>)</li>
@@ -131,14 +131,15 @@
 <h2>altcp_allocator_t </h2>
 <p>An altcp allocator is created by the application by combining an allocator callback function and a corresponding state, e.g.:</p><div class="fragment"><div class="line"><span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cert[] = {0x2D, ... (see mbedTLS doc <span class="keywordflow">for</span> how to create <span class="keyword">this</span>)};</div>
 <div class="line"><span class="keyword">struct </span>altcp_tls_config * conf = <a class="code hl_function" href="group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170">altcp_tls_create_config_client</a>(cert, <span class="keyword">sizeof</span>(cert));</div>
-<div class="line">altcp_allocator_t tls_allocator = {</div>
+<div class="line"><a class="code hl_struct" href="structaltcp__allocator__s.html">altcp_allocator_t</a> tls_allocator = {</div>
 <div class="line">  <a class="code hl_function" href="group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc">altcp_tls_alloc</a>, conf</div>
 <div class="line">};</div>
 <div class="ttc" id="agroup__altcp__tls_html_ga7b3c11c8a273d68acc332c55e6b38170"><div class="ttname"><a href="group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170">altcp_tls_create_config_client</a></div><div class="ttdeci">struct altcp_tls_config * altcp_tls_create_config_client(const u8_t *cert, size_t cert_len)</div></div>
 <div class="ttc" id="agroup__altcp__tls_html_gab0bdfd2ede0df4d47b6e12ccac2b14bc"><div class="ttname"><a href="group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc">altcp_tls_alloc</a></div><div class="ttdeci">struct altcp_pcb * altcp_tls_alloc(void *arg, u8_t ip_type)</div><div class="ttdef"><b>Definition</b> altcp_alloc.c:80</div></div>
+<div class="ttc" id="astructaltcp__allocator__s_html"><div class="ttname"><a href="structaltcp__allocator__s.html">altcp_allocator_s</a></div><div class="ttdef"><b>Definition</b> altcp.h:85</div></div>
 </div><!-- fragment --><h2>struct altcp_tls_config </h2>
 <p>The struct altcp_tls_config holds state that is needed to create new TLS client or server connections (e.g. certificates and private keys).</p>
-<p>It is not defined by lwIP itself but by the TLS port (e.g. altcp_tls to mbedTLS adaption). However, the parameters used to create it are defined in <a class="el" href="altcp__tls_8h.html">altcp_tls.h</a> (see <a class="el" href="group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e">altcp_tls_create_config_server_privkey_cert</a> for servers and altcp_tls_create_config_client/ altcp_tls_create_config_client_2wayauth for clients).</p>
+<p>It is not defined by lwIP itself but by the TLS port (e.g. altcp_tls to mbedTLS adaption). However, the parameters used to create it are defined in <a class="el" href="altcp__tls_8h.html">altcp_tls.h</a> (see <a class="el" href="group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e">altcp_tls_create_config_server_privkey_cert</a> for servers and <a class="el" href="group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170">altcp_tls_create_config_client</a> / <a class="el" href="group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597">altcp_tls_create_config_client_2wayauth</a> for clients).</p>
 <p>For mbedTLS, ensure that certificates can be parsed by 'mbedtls_x509_crt_parse()' and private keys can be parsed by 'mbedtls_pk_parse_key()'. </p>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/group__altcp__tls.html b/doc/doxygen/output/html/group__altcp__tls.html
index d2b85d7..1918faf 100644
--- a/doc/doxygen/output/html/group__altcp__tls.html
+++ b/doc/doxygen/output/html/group__altcp__tls.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -105,8 +105,8 @@
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:gaf6ed13271394371cc89d70ef5128c411" id="r_gaf6ed13271394371cc89d70ef5128c411"><td class="memItemLeft" align="right" valign="top">struct altcp_tls_config *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaf6ed13271394371cc89d70ef5128c411">altcp_tls_create_config_server</a> (uint8_t cert_count)</td></tr>
-<tr class="separator:gaf6ed13271394371cc89d70ef5128c411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa37649bf24ebea235a8e3e8f50b9831f" id="r_gaa37649bf24ebea235a8e3e8f50b9831f"><td class="memItemLeft" align="right" valign="top">struct altcp_tls_config *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa37649bf24ebea235a8e3e8f50b9831f">altcp_tls_create_config_server</a> (u8_t cert_count)</td></tr>
+<tr class="separator:gaa37649bf24ebea235a8e3e8f50b9831f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gae6f52370b62b0f4ba8d373c5186c9e7e" id="r_gae6f52370b62b0f4ba8d373c5186c9e7e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gae6f52370b62b0f4ba8d373c5186c9e7e">altcp_tls_config_server_add_privkey_cert</a> (struct altcp_tls_config *config, const u8_t *privkey, size_t privkey_len, const u8_t *privkey_pass, size_t privkey_pass_len, const u8_t *cert, size_t cert_len)</td></tr>
 <tr class="separator:gae6f52370b62b0f4ba8d373c5186c9e7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga60b4635c80b832a8c3b332fdede69d5e" id="r_ga60b4635c80b832a8c3b332fdede69d5e"><td class="memItemLeft" align="right" valign="top">struct altcp_tls_config *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga60b4635c80b832a8c3b332fdede69d5e">altcp_tls_create_config_server_privkey_cert</a> (const u8_t *privkey, size_t privkey_len, const u8_t *privkey_pass, size_t privkey_pass_len, const u8_t *cert, size_t cert_len)</td></tr>
@@ -115,6 +115,8 @@
 <tr class="separator:ga7b3c11c8a273d68acc332c55e6b38170"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga4dccbd861c03a9c09eae6799da004597" id="r_ga4dccbd861c03a9c09eae6799da004597"><td class="memItemLeft" align="right" valign="top">struct altcp_tls_config *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga4dccbd861c03a9c09eae6799da004597">altcp_tls_create_config_client_2wayauth</a> (const u8_t *ca, size_t ca_len, const u8_t *privkey, size_t privkey_len, const u8_t *privkey_pass, size_t privkey_pass_len, const u8_t *cert, size_t cert_len)</td></tr>
 <tr class="separator:ga4dccbd861c03a9c09eae6799da004597"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga1f60b12a6a4440214b7bcf2e3ba43126" id="r_ga1f60b12a6a4440214b7bcf2e3ba43126"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga1f60b12a6a4440214b7bcf2e3ba43126">altcp_tls_configure_alpn_protocols</a> (struct altcp_tls_config *conf, const char **protos)</td></tr>
+<tr class="separator:ga1f60b12a6a4440214b7bcf2e3ba43126"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga8fb8a92fa3f84170050ddab2888b9145" id="r_ga8fb8a92fa3f84170050ddab2888b9145"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga8fb8a92fa3f84170050ddab2888b9145">altcp_tls_free_config</a> (struct altcp_tls_config *conf)</td></tr>
 <tr class="separator:ga8fb8a92fa3f84170050ddab2888b9145"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga75675ccec142d17fc0695b425f3ec1c2" id="r_ga75675ccec142d17fc0695b425f3ec1c2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga75675ccec142d17fc0695b425f3ec1c2">altcp_tls_free_entropy</a> (void)</td></tr>
@@ -127,6 +129,14 @@
 <tr class="separator:gab0bdfd2ede0df4d47b6e12ccac2b14bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga85d20b4dc321342cf09ad93086309bb7" id="r_ga85d20b4dc321342cf09ad93086309bb7"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga85d20b4dc321342cf09ad93086309bb7">altcp_tls_context</a> (struct altcp_pcb *conn)</td></tr>
 <tr class="separator:ga85d20b4dc321342cf09ad93086309bb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae6c3cf72fcd29e6ea4c74181370420c3" id="r_gae6c3cf72fcd29e6ea4c74181370420c3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gae6c3cf72fcd29e6ea4c74181370420c3">altcp_tls_init_session</a> (struct altcp_tls_session *dest)</td></tr>
+<tr class="separator:gae6c3cf72fcd29e6ea4c74181370420c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga827c76a0bddc4923b9a17c813e13891e" id="r_ga827c76a0bddc4923b9a17c813e13891e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga827c76a0bddc4923b9a17c813e13891e">altcp_tls_get_session</a> (struct altcp_pcb *conn, struct altcp_tls_session *dest)</td></tr>
+<tr class="separator:ga827c76a0bddc4923b9a17c813e13891e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4aed4aa55d0e1b15f4118863cea06d18" id="r_ga4aed4aa55d0e1b15f4118863cea06d18"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga4aed4aa55d0e1b15f4118863cea06d18">altcp_tls_set_session</a> (struct altcp_pcb *conn, struct altcp_tls_session *from)</td></tr>
+<tr class="separator:ga4aed4aa55d0e1b15f4118863cea06d18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga906eefcef66e9dd2b43c3392704905f5" id="r_ga906eefcef66e9dd2b43c3392704905f5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga906eefcef66e9dd2b43c3392704905f5">altcp_tls_free_session</a> (struct altcp_tls_session *dest)</td></tr>
+<tr class="separator:ga906eefcef66e9dd2b43c3392704905f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>This file contains function prototypes for a TLS layer. A port to ARM mbedtls is provided in the apps/ tree (LWIP_ALTCP_TLS_MBEDTLS option). </p>
@@ -149,7 +159,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Create new ALTCP_TLS layer pcb and its inner tcp pcb. Same as <a class="el" href="#gab6a717446af931949bc3e0daceb090c8">altcp_tls_new</a> but this allocator function fits to altcp_allocator_t / altcp_new.<br  />
+<p>Create new ALTCP_TLS layer pcb and its inner tcp pcb. Same as <a class="el" href="#gab6a717446af931949bc3e0daceb090c8">altcp_tls_new</a> but this allocator function fits to <a class="el" href="group__altcp.html#ga04a328f67359ee03d1ec6824978b7209">altcp_allocator_t</a> / <a class="el" href="group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908">altcp_new</a>.<br  />
  'arg' must contain a struct altcp_tls_config *.</p>
 <p>This standard allocator function creates an altcp pcb for TLS over TCP </p>
 
@@ -202,6 +212,32 @@
 
 </div>
 </div>
+<a id="ga1f60b12a6a4440214b7bcf2e3ba43126" name="ga1f60b12a6a4440214b7bcf2e3ba43126"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga1f60b12a6a4440214b7bcf2e3ba43126">&#9670;&#160;</a></span>altcp_tls_configure_alpn_protocols()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int altcp_tls_configure_alpn_protocols </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_tls_config *</td>          <td class="paramname"><span class="paramname"><em>conf</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char **</td>          <td class="paramname"><span class="paramname"><em>protos</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Configure ALPN TLS extension Example:<br  />
+ static const char *g_alpn_protocols[] = { "x-amzn-mqtt-ca", NULL };<br  />
+ tls_config = altcp_tls_create_config_client(ca, ca_len);<br  />
+ altcp_tls_conf_alpn_protocols(tls_config, g_alpn_protocols);<br  />
+ </p>
+
+</div>
+</div>
 <a id="ga85d20b4dc321342cf09ad93086309bb7" name="ga85d20b4dc321342cf09ad93086309bb7"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga85d20b4dc321342cf09ad93086309bb7">&#9670;&#160;</a></span>altcp_tls_context()</h2>
 
@@ -294,8 +330,8 @@
 
 </div>
 </div>
-<a id="gaf6ed13271394371cc89d70ef5128c411" name="gaf6ed13271394371cc89d70ef5128c411"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#gaf6ed13271394371cc89d70ef5128c411">&#9670;&#160;</a></span>altcp_tls_create_config_server()</h2>
+<a id="gaa37649bf24ebea235a8e3e8f50b9831f" name="gaa37649bf24ebea235a8e3e8f50b9831f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa37649bf24ebea235a8e3e8f50b9831f">&#9670;&#160;</a></span>altcp_tls_create_config_server()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -303,7 +339,7 @@
         <tr>
           <td class="memname">struct altcp_tls_config * altcp_tls_create_config_server </td>
           <td>(</td>
-          <td class="paramtype">uint8_t</td>          <td class="paramname"><span class="paramname"><em>cert_count</em></span></td><td>)</td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>cert_count</em></span></td><td>)</td>
           <td></td>
         </tr>
       </table>
@@ -350,7 +386,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Create an ALTCP_TLS server configuration handle with one certificate (short version of calling <a class="el" href="#gaf6ed13271394371cc89d70ef5128c411">altcp_tls_create_config_server</a> and <a class="el" href="#gae6f52370b62b0f4ba8d373c5186c9e7e">altcp_tls_config_server_add_privkey_cert</a>) </p>
+<p>Create an ALTCP_TLS server configuration handle with one certificate (short version of calling <a class="el" href="#gaa37649bf24ebea235a8e3e8f50b9831f">altcp_tls_create_config_server</a> and <a class="el" href="#gae6f52370b62b0f4ba8d373c5186c9e7e">altcp_tls_config_server_add_privkey_cert</a>) </p>
 
 </div>
 </div>
@@ -390,6 +426,64 @@
 
 </div>
 </div>
+<a id="ga906eefcef66e9dd2b43c3392704905f5" name="ga906eefcef66e9dd2b43c3392704905f5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga906eefcef66e9dd2b43c3392704905f5">&#9670;&#160;</a></span>altcp_tls_free_session()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_tls_free_session </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_tls_session *</td>          <td class="paramname"><span class="paramname"><em>dest</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Free allocated data inside a TLS session buffer. Real type depends on port (e.g. mbedtls use mbedtls_ssl_session) </p>
+
+</div>
+</div>
+<a id="ga827c76a0bddc4923b9a17c813e13891e" name="ga827c76a0bddc4923b9a17c813e13891e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga827c76a0bddc4923b9a17c813e13891e">&#9670;&#160;</a></span>altcp_tls_get_session()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> altcp_tls_get_session </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *</td>          <td class="paramname"><span class="paramname"><em>conn</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct altcp_tls_session *</td>          <td class="paramname"><span class="paramname"><em>dest</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Save current connected session to reuse it later. Should be called after <a class="el" href="group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492">altcp_connect()</a> succeeded. Return error if saving session fail. Real type depends on port (e.g. mbedtls use mbedtls_ssl_session) </p>
+
+</div>
+</div>
+<a id="gae6c3cf72fcd29e6ea4c74181370420c3" name="gae6c3cf72fcd29e6ea4c74181370420c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae6c3cf72fcd29e6ea4c74181370420c3">&#9670;&#160;</a></span>altcp_tls_init_session()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void altcp_tls_init_session </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_tls_session *</td>          <td class="paramname"><span class="paramname"><em>dest</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialise a TLS session buffer. Real type depends on port (e.g. mbedtls use mbedtls_ssl_session) </p>
+
+</div>
+</div>
 <a id="gab6a717446af931949bc3e0daceb090c8" name="gab6a717446af931949bc3e0daceb090c8"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gab6a717446af931949bc3e0daceb090c8">&#9670;&#160;</a></span>altcp_tls_new()</h2>
 
@@ -413,6 +507,28 @@
 
 </div>
 </div>
+<a id="ga4aed4aa55d0e1b15f4118863cea06d18" name="ga4aed4aa55d0e1b15f4118863cea06d18"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4aed4aa55d0e1b15f4118863cea06d18">&#9670;&#160;</a></span>altcp_tls_set_session()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> altcp_tls_set_session </td>
+          <td>(</td>
+          <td class="paramtype">struct altcp_pcb *</td>          <td class="paramname"><span class="paramname"><em>conn</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct altcp_tls_session *</td>          <td class="paramname"><span class="paramname"><em>from</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Restore a previously saved session. Must be called before <a class="el" href="group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492">altcp_connect()</a>. Return error if cannot restore session. Real type depends on port (e.g. mbedtls use mbedtls_ssl_session) </p>
+
+</div>
+</div>
 <a id="gaa527b756ad6673a19cc78287026c765c" name="gaa527b756ad6673a19cc78287026c765c"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gaa527b756ad6673a19cc78287026c765c">&#9670;&#160;</a></span>altcp_tls_wrap()</h2>
 
diff --git a/doc/doxygen/output/html/group__altcp__tls.js b/doc/doxygen/output/html/group__altcp__tls.js
index d4259d4..52dc540 100644
--- a/doc/doxygen/output/html/group__altcp__tls.js
+++ b/doc/doxygen/output/html/group__altcp__tls.js
@@ -2,13 +2,18 @@
 [
     [ "altcp_tls_alloc", "group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc", null ],
     [ "altcp_tls_config_server_add_privkey_cert", "group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e", null ],
+    [ "altcp_tls_configure_alpn_protocols", "group__altcp__tls.html#ga1f60b12a6a4440214b7bcf2e3ba43126", null ],
     [ "altcp_tls_context", "group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7", null ],
     [ "altcp_tls_create_config_client", "group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170", null ],
     [ "altcp_tls_create_config_client_2wayauth", "group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597", null ],
-    [ "altcp_tls_create_config_server", "group__altcp__tls.html#gaf6ed13271394371cc89d70ef5128c411", null ],
+    [ "altcp_tls_create_config_server", "group__altcp__tls.html#gaa37649bf24ebea235a8e3e8f50b9831f", null ],
     [ "altcp_tls_create_config_server_privkey_cert", "group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e", null ],
     [ "altcp_tls_free_config", "group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145", null ],
     [ "altcp_tls_free_entropy", "group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2", null ],
+    [ "altcp_tls_free_session", "group__altcp__tls.html#ga906eefcef66e9dd2b43c3392704905f5", null ],
+    [ "altcp_tls_get_session", "group__altcp__tls.html#ga827c76a0bddc4923b9a17c813e13891e", null ],
+    [ "altcp_tls_init_session", "group__altcp__tls.html#gae6c3cf72fcd29e6ea4c74181370420c3", null ],
     [ "altcp_tls_new", "group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8", null ],
+    [ "altcp_tls_set_session", "group__altcp__tls.html#ga4aed4aa55d0e1b15f4118863cea06d18", null ],
     [ "altcp_tls_wrap", "group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__api.html b/doc/doxygen/output/html/group__api.html
index a9c969e..e769a96 100644
--- a/doc/doxygen/output/html/group__api.html
+++ b/doc/doxygen/output/html/group__api.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__apps.html b/doc/doxygen/output/html/group__apps.html
index de0d698..6d6fd97 100644
--- a/doc/doxygen/output/html/group__apps.html
+++ b/doc/doxygen/output/html/group__apps.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -123,7 +123,7 @@
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html">SNTP</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html">TFTP server</a></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html">TFTP client/server</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
diff --git a/doc/doxygen/output/html/group__apps.js b/doc/doxygen/output/html/group__apps.js
index 4614ed2..a8f3f3a 100644
--- a/doc/doxygen/output/html/group__apps.js
+++ b/doc/doxygen/output/html/group__apps.js
@@ -9,5 +9,5 @@
     [ "SMTP client", "group__smtp.html", "group__smtp" ],
     [ "SNMPv2c/v3 agent", "group__snmp.html", "group__snmp" ],
     [ "SNTP", "group__sntp.html", "group__sntp" ],
-    [ "TFTP server", "group__tftp.html", "group__tftp" ]
+    [ "TFTP client/server", "group__tftp.html", "group__tftp" ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__autoip.html b/doc/doxygen/output/html/group__autoip.html
index 6531d5f..4d4fdbb 100644
--- a/doc/doxygen/output/html/group__autoip.html
+++ b/doc/doxygen/output/html/group__autoip.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -107,6 +107,8 @@
 Functions</h2></td></tr>
 <tr class="memitem:ga2122c0b2518b371559fef5ec1d2aed90" id="r_ga2122c0b2518b371559fef5ec1d2aed90"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga2122c0b2518b371559fef5ec1d2aed90">autoip_set_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structautoip.html">autoip</a> *<a class="el" href="structautoip.html">autoip</a>)</td></tr>
 <tr class="separator:ga2122c0b2518b371559fef5ec1d2aed90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac0c98035795500ede464aa4af2515f30" id="r_gac0c98035795500ede464aa4af2515f30"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gac0c98035795500ede464aa4af2515f30">autoip_remove_struct</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gac0c98035795500ede464aa4af2515f30"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga1461f5826ebefc050e0d63013818d1e8" id="r_ga1461f5826ebefc050e0d63013818d1e8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga1461f5826ebefc050e0d63013818d1e8">autoip_start</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga1461f5826ebefc050e0d63013818d1e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga58a4dce658dd1263e84eb982f62587d4" id="r_ga58a4dce658dd1263e84eb982f62587d4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
@@ -114,7 +116,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>AUTOIP related functions USAGE:</p>
-<p>define <a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">LWIP_AUTOIP</a> 1 in your lwipopts.h Options: AUTOIP_TMR_INTERVAL msecs, I recommend a value of 100. The value must divide 1000 with a remainder almost 0. Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 ....</p>
+<p>define <a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">LWIP_AUTOIP</a> 1 in your lwipopts.h</p>
 <p>Without DHCP:</p><ul>
 <li>Call <a class="el" href="#ga1461f5826ebefc050e0d63013818d1e8">autoip_start()</a> after <a class="el" href="group__netif.html#ga22055759a25f5d6cea7e7deab0a07434">netif_add()</a>.</li>
 </ul>
@@ -124,6 +126,30 @@
 </ul>
 <dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netifapi__autoip.html">AUTOIP</a> </dd></dl>
 <h2 class="groupheader">Function Documentation</h2>
+<a id="gac0c98035795500ede464aa4af2515f30" name="gac0c98035795500ede464aa4af2515f30"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac0c98035795500ede464aa4af2515f30">&#9670;&#160;</a></span>autoip_remove_struct()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void autoip_remove_struct </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove a struct autoip previously set to the netif using <a class="el" href="#ga2122c0b2518b371559fef5ec1d2aed90">autoip_set_struct()</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif for which to set the struct autoip </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 <a id="ga2122c0b2518b371559fef5ec1d2aed90" name="ga2122c0b2518b371559fef5ec1d2aed90"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga2122c0b2518b371559fef5ec1d2aed90">&#9670;&#160;</a></span>autoip_set_struct()</h2>
 
diff --git a/doc/doxygen/output/html/group__autoip.js b/doc/doxygen/output/html/group__autoip.js
index 809179f..2577280 100644
--- a/doc/doxygen/output/html/group__autoip.js
+++ b/doc/doxygen/output/html/group__autoip.js
@@ -1,5 +1,6 @@
 var group__autoip =
 [
+    [ "autoip_remove_struct", "group__autoip.html#gac0c98035795500ede464aa4af2515f30", null ],
     [ "autoip_set_struct", "group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90", null ],
     [ "autoip_start", "group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8", null ],
     [ "autoip_stop", "group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4", null ]
diff --git a/doc/doxygen/output/html/group__bridgeif.html b/doc/doxygen/output/html/group__bridgeif.html
index cbae1d2..cd5c2b0 100644
--- a/doc/doxygen/output/html/group__bridgeif.html
+++ b/doc/doxygen/output/html/group__bridgeif.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__bridgeif__fdb.html b/doc/doxygen/output/html/group__bridgeif__fdb.html
index 115716c..66284d3 100644
--- a/doc/doxygen/output/html/group__bridgeif__fdb.html
+++ b/doc/doxygen/output/html/group__bridgeif__fdb.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__bridgeif__opts.html b/doc/doxygen/output/html/group__bridgeif__opts.html
index b8a13e5..da3c224 100644
--- a/doc/doxygen/output/html/group__bridgeif__opts.html
+++ b/doc/doxygen/output/html/group__bridgeif__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__callbackstyle__api.html b/doc/doxygen/output/html/group__callbackstyle__api.html
index dcae76a..6b7f609 100644
--- a/doc/doxygen/output/html/group__callbackstyle__api.html
+++ b/doc/doxygen/output/html/group__callbackstyle__api.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__compiler__abstraction.html b/doc/doxygen/output/html/group__compiler__abstraction.html
index bb8a432..1caf214 100644
--- a/doc/doxygen/output/html/group__compiler__abstraction.html
+++ b/doc/doxygen/output/html/group__compiler__abstraction.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -244,10 +244,10 @@
 <b>Value:</b><div class="fragment"><div class="line">u8_t variable_name[<a class="code hl_define" href="#ga25591dcb72fccc7b5dc46fbc1959694e">LWIP_MEM_ALIGN_BUFFER</a>(size)]</div>
 <div class="ttc" id="agroup__compiler__abstraction_html_ga25591dcb72fccc7b5dc46fbc1959694e"><div class="ttname"><a href="#ga25591dcb72fccc7b5dc46fbc1959694e">LWIP_MEM_ALIGN_BUFFER</a></div><div class="ttdeci">#define LWIP_MEM_ALIGN_BUFFER(size)</div><div class="ttdef"><b>Definition</b> arch.h:287</div></div>
 </div><!-- fragment --><p>Allocates a memory buffer of specified size that is of sufficient size to align its start address using LWIP_MEM_ALIGN. You can declare your own version here e.g. to enforce alignment without adding trailing padding bytes (see LWIP_MEM_ALIGN_BUFFER) or your own section placement requirements.<br  />
-e.g. if you use gcc and need 32 bit alignment:<br  />
-#define <a class="el" href="#ga651bb349041669fe717b19f127ef16c0">LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size)</a> u8_t variable_name[size] __attribute__((aligned(4)))<br  />
-or more portable:<br  />
-#define <a class="el" href="#ga651bb349041669fe717b19f127ef16c0">LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size)</a> u32_t variable_name[(size + sizeof(u32_t) - 1) / sizeof(u32_t)] </p>
+ e.g. if you use gcc and need 32 bit alignment:<br  />
+ #define <a class="el" href="#ga651bb349041669fe717b19f127ef16c0">LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size)</a> u8_t variable_name[size] __attribute__((aligned(4)))<br  />
+ or more portable:<br  />
+ #define <a class="el" href="#ga651bb349041669fe717b19f127ef16c0">LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size)</a> u32_t variable_name[(size + sizeof(u32_t) - 1) / sizeof(u32_t)] </p>
 
 </div>
 </div>
@@ -266,7 +266,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">((<span class="keywordtype">void</span> *)(((mem_ptr_t)(addr) + <a class="code hl_define" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a> - 1) &amp; ~(mem_ptr_t)(<a class="code hl_define" href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a>-1)))</div>
-<div class="ttc" id="agroup__lwip__opts__mem_html_ga97343214666ee6dcb18c0bd77b441ea7"><div class="ttname"><a href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a></div><div class="ttdeci">#define MEM_ALIGNMENT</div><div class="ttdef"><b>Definition</b> opt.h:289</div></div>
+<div class="ttc" id="agroup__lwip__opts__mem_html_ga97343214666ee6dcb18c0bd77b441ea7"><div class="ttname"><a href="group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7">MEM_ALIGNMENT</a></div><div class="ttdeci">#define MEM_ALIGNMENT</div><div class="ttdef"><b>Definition</b> opt.h:282</div></div>
 </div><!-- fragment --><p>Align a memory pointer to the alignment defined by MEM_ALIGNMENT so that ADDR % MEM_ALIGNMENT == 0 </p>
 
 </div>
@@ -424,7 +424,7 @@
 <b>Value:</b><div class="fragment"><div class="line">                                     <span class="keywordflow">do</span> {printf(<span class="stringliteral">&quot;Assertion \&quot;%s\&quot; failed at line %d in %s\n&quot;</span>, \</div>
 <div class="line">                                     x, __LINE__, __FILE__); fflush(NULL); abort();} <span class="keywordflow">while</span>(0)</div>
 </div><!-- fragment --><p>Platform specific assertion handling.<br  />
-Note the default implementation pulls in printf, fflush and abort, which may in turn pull in a lot of standard libary code. In resource-constrained systems, this should be defined to something less resource-consuming. </p>
+ Note the default implementation pulls in printf, fflush and abort, which may in turn pull in a lot of standard library code. In resource-constrained systems, this should be defined to something less resource-consuming. </p>
 
 </div>
 </div>
@@ -444,7 +444,7 @@
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">do</span> {printf x;} <span class="keywordflow">while</span>(0)</div>
 </div><!-- fragment --><p>Platform specific diagnostic output.<br  />
-Note the default implementation pulls in printf, which may in turn pull in a lot of standard libary code. In resource-constrained systems, this should be defined to something less resource-consuming. </p>
+ Note the default implementation pulls in printf, which may in turn pull in a lot of standard library code. In resource-constrained systems, this should be defined to something less resource-consuming. </p>
 
 </div>
 </div>
@@ -536,8 +536,8 @@
       </table>
 </div><div class="memdoc">
 <p>Packed structs support. Placed BEFORE declaration of a packed struct.<br  />
-For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
-A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
+ For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
+ A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
 
 </div>
 </div>
@@ -553,8 +553,8 @@
       </table>
 </div><div class="memdoc">
 <p>Packed structs support. Placed AFTER declaration of a packed struct.<br  />
-For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
-A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
+ For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
+ A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
 
 </div>
 </div>
@@ -574,8 +574,8 @@
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">x</div>
 </div><!-- fragment --><p>Packed structs support. Wraps u32_t and u16_t members.<br  />
-For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
-A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
+ For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
+ A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
 
 </div>
 </div>
@@ -596,8 +596,8 @@
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)</div>
 <div class="ttc" id="agroup__compiler__abstraction_html_gaab0b988124e37a978d9a88e7c1c778e0"><div class="ttname"><a href="#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a></div><div class="ttdeci">#define PACK_STRUCT_FIELD(x)</div><div class="ttdef"><b>Definition</b> arch.h:338</div></div>
 </div><!-- fragment --><p>Packed structs support. Wraps u8_t members, where some compilers warn that packing is not necessary.<br  />
-For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
-A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
+ For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
+ A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
 
 </div>
 </div>
@@ -617,8 +617,8 @@
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#gaab0b988124e37a978d9a88e7c1c778e0">PACK_STRUCT_FIELD</a>(x)</div>
 </div><!-- fragment --><p>Packed structs support. Wraps members that are packed structs themselves, where some compilers warn that packing is not necessary.<br  />
-For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
-A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
+ For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
+ A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
 
 </div>
 </div>
@@ -634,8 +634,8 @@
       </table>
 </div><div class="memdoc">
 <p>Packed structs support. Placed between end of declaration of a packed struct and trailing semicolon.<br  />
-For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
-A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
+ For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
+ A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
 
 </div>
 </div>
@@ -651,10 +651,10 @@
       </table>
 </div><div class="memdoc">
 <p>PACK_STRUCT_USE_INCLUDES==1: Packed structs support using #include files before and after struct to be packed.<br  />
-The file included BEFORE the struct is "arch/bpstruct.h".<br  />
-The file included AFTER the struct is "arch/epstruct.h".<br  />
-This can be used to implement struct packing on MS Visual C compilers, see the Win32 port in the lwIP contrib repository for reference. For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
-A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
+ The file included BEFORE the struct is "arch/bpstruct.h".<br  />
+ The file included AFTER the struct is "arch/epstruct.h".<br  />
+ This can be used to implement struct packing on MS Visual C compilers, see the Win32 port in the lwIP/contrib subdir for reference. For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br  />
+ A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. </p>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__debugging__levels.html b/doc/doxygen/output/html/group__debugging__levels.html
index c9f3ac7..058d2a2 100644
--- a/doc/doxygen/output/html/group__debugging__levels.html
+++ b/doc/doxygen/output/html/group__debugging__levels.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__dhcp4.html b/doc/doxygen/output/html/group__dhcp4.html
index 366d602..b8dc423 100644
--- a/doc/doxygen/output/html/group__dhcp4.html
+++ b/doc/doxygen/output/html/group__dhcp4.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__dhcp6.html b/doc/doxygen/output/html/group__dhcp6.html
index 16065a1..cb33430 100644
--- a/doc/doxygen/output/html/group__dhcp6.html
+++ b/doc/doxygen/output/html/group__dhcp6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -127,8 +127,8 @@
 <li>only start information requests if required (not for every RA)</li>
 </ul>
 <p><a class="el" href="#gaa9e972fcd1d648ca5f02334b1591b619">dhcp6_enable_stateful()</a> enables stateful DHCPv6 for a netif (stateless disabled)<br  />
-<a class="el" href="#gaf3349463541e673fec33843eb019b18c">dhcp6_enable_stateless()</a> enables stateless DHCPv6 for a netif (stateful disabled)<br  />
-<a class="el" href="#gadd0c783a85a410f75b37a3d922ad60d2">dhcp6_disable()</a> disable DHCPv6 for a netif</p>
+ <a class="el" href="#gaf3349463541e673fec33843eb019b18c">dhcp6_enable_stateless()</a> enables stateless DHCPv6 for a netif (stateful disabled)<br  />
+ <a class="el" href="#gadd0c783a85a410f75b37a3d922ad60d2">dhcp6_disable()</a> disable DHCPv6 for a netif</p>
 <p>When enabled, requests are only issued after receipt of RA with the corresponding bits set. </p>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="gacb7042000509fb21e8d2758e235d6dde" name="gacb7042000509fb21e8d2758e235d6dde"></a>
diff --git a/doc/doxygen/output/html/group__dns.html b/doc/doxygen/output/html/group__dns.html
index 2902420..86f3f7c 100644
--- a/doc/doxygen/output/html/group__dns.html
+++ b/doc/doxygen/output/html/group__dns.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__ethernet.html b/doc/doxygen/output/html/group__ethernet.html
index 0a2853f..449c37e 100644
--- a/doc/doxygen/output/html/group__ethernet.html
+++ b/doc/doxygen/output/html/group__ethernet.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__httpc.html b/doc/doxygen/output/html/group__httpc.html
index 18767ea..950cbad 100644
--- a/doc/doxygen/output/html/group__httpc.html
+++ b/doc/doxygen/output/html/group__httpc.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__httpd.html b/doc/doxygen/output/html/group__httpd.html
index 99c7c88..b95b135 100644
--- a/doc/doxygen/output/html/group__httpd.html
+++ b/doc/doxygen/output/html/group__httpd.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__httpd__opts.html b/doc/doxygen/output/html/group__httpd__opts.html
index 8e13437..f365dd8 100644
--- a/doc/doxygen/output/html/group__httpd__opts.html
+++ b/doc/doxygen/output/html/group__httpd__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -115,6 +115,8 @@
 <tr class="separator:ga520858778b84d4d2fa125294c0f119e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaba2d4cfe4c1f5bdbe37b339084a7d466" id="r_gaba2d4cfe4c1f5bdbe37b339084a7d466"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaba2d4cfe4c1f5bdbe37b339084a7d466">LWIP_HTTPD_SSI_BY_FILE_EXTENSION</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:gaba2d4cfe4c1f5bdbe37b339084a7d466"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga006baa7219cff5ee02f5a14ef7d7c89d" id="r_ga006baa7219cff5ee02f5a14ef7d7c89d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga006baa7219cff5ee02f5a14ef7d7c89d">LWIP_HTTPD_SSI_EXTENSIONS</a>&#160;&#160;&#160;&quot;.shtml&quot;, &quot;.shtm&quot;, &quot;.ssi&quot;, &quot;.xml&quot;, &quot;.json&quot;</td></tr>
+<tr class="separator:ga006baa7219cff5ee02f5a14ef7d7c89d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gacbea06ce33933e3ef2f2f1834a21cc2c" id="r_gacbea06ce33933e3ef2f2f1834a21cc2c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gacbea06ce33933e3ef2f2f1834a21cc2c">LWIP_HTTPD_SUPPORT_POST</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gacbea06ce33933e3ef2f2f1834a21cc2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga3167d52d20cf90857e2c809b92458bf0" id="r_ga3167d52d20cf90857e2c809b92458bf0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga3167d52d20cf90857e2c809b92458bf0">LWIP_HTTPD_SSI_MULTIPART</a>&#160;&#160;&#160;0</td></tr>
@@ -175,6 +177,8 @@
 <tr class="separator:ga1ee8d7c975c7e3d1c9d9dd9b43660c79"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaedd0fa3d356170d8ca3557acb410fd7c" id="r_gaedd0fa3d356170d8ca3557acb410fd7c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaedd0fa3d356170d8ca3557acb410fd7c">LWIP_HTTPD_FILE_STATE</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gaedd0fa3d356170d8ca3557acb410fd7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3648a9fdefe3ab1c890b715a4786429" id="r_gaa3648a9fdefe3ab1c890b715a4786429"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa3648a9fdefe3ab1c890b715a4786429">LWIP_HTTPD_FILE_EXTENSION</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa3648a9fdefe3ab1c890b715a4786429"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga6e5de8515c89af12277e4cb011165103" id="r_ga6e5de8515c89af12277e4cb011165103"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga6e5de8515c89af12277e4cb011165103">HTTPD_PRECALCULATED_CHECKSUM</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga6e5de8515c89af12277e4cb011165103"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga51cb673cb5cc362acc409f23c1e0a331" id="r_ga51cb673cb5cc362acc409f23c1e0a331"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga51cb673cb5cc362acc409f23c1e0a331">LWIP_HTTPD_FS_ASYNC_READ</a>&#160;&#160;&#160;0</td></tr>
@@ -468,6 +472,21 @@
 
 </div>
 </div>
+<a id="gaa3648a9fdefe3ab1c890b715a4786429" name="gaa3648a9fdefe3ab1c890b715a4786429"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa3648a9fdefe3ab1c890b715a4786429">&#9670;&#160;</a></span>LWIP_HTTPD_FILE_EXTENSION</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_FILE_EXTENSION&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Set this to 1 to add the pextension field to the fs_file structure. This is included here to retain compatibility with legacy code that relies on the presence of the pextension field. New code should use LWIP_HTTPD_FILE_STATE instead. This option may be removed in a future version of lwip. </p>
+
+</div>
+</div>
 <a id="gaedd0fa3d356170d8ca3557acb410fd7c" name="gaedd0fa3d356170d8ca3557acb410fd7c"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gaedd0fa3d356170d8ca3557acb410fd7c">&#9670;&#160;</a></span>LWIP_HTTPD_FILE_STATE</h2>
 
@@ -619,7 +638,7 @@
 <p>A downside of the current SSI implementation is that persistent connections don't work, as the file length is not known in advance (and httpd currently relies on the Content-Length header for persistent connections).</p>
 <p>To save memory, the maximum tag length is limited (</p><dl class="section see"><dt>See also</dt><dd>LWIP_HTTPD_MAX_TAG_NAME_LEN). To save memory, the maximum insertion string length is limited (</dd>
 <dd>
-LWIP_HTTPD_MAX_TAG_INSERT_LEN). If this is not enought, <a class="el" href="#ga3167d52d20cf90857e2c809b92458bf0">LWIP_HTTPD_SSI_MULTIPART</a> can be used. </dd></dl>
+LWIP_HTTPD_MAX_TAG_INSERT_LEN). If this is not enough, <a class="el" href="#ga3167d52d20cf90857e2c809b92458bf0">LWIP_HTTPD_SSI_MULTIPART</a> can be used. </dd></dl>
 
 </div>
 </div>
@@ -634,11 +653,26 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Set this to 0 to prevent parsing the file extension at runtime to decide if a file should be scanned for SSI tags or not. Default is 1 (file extensions are checked using the g_pcSSIExtensions array) Set to 2 to override this runtime test function.</p>
+<p>Set this to 0 to prevent parsing the file extension at runtime to decide if a file should be scanned for SSI tags or not. Default is 1 (file extensions are checked using the g_pcSSIExtensions array) Set to 2 to override this runtime test function. In this case, you have to provide an external function that does the check: u8_t http_uri_is_ssi(struct fs_file *file, const char *uri)</p>
 <p>This is enabled by default, but if you only use a newer version of makefsdata supporting the "-ssi" option, this info is already present in </p>
 
 </div>
 </div>
+<a id="ga006baa7219cff5ee02f5a14ef7d7c89d" name="ga006baa7219cff5ee02f5a14ef7d7c89d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga006baa7219cff5ee02f5a14ef7d7c89d">&#9670;&#160;</a></span>LWIP_HTTPD_SSI_EXTENSIONS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_HTTPD_SSI_EXTENSIONS&#160;&#160;&#160;&quot;.shtml&quot;, &quot;.shtm&quot;, &quot;.ssi&quot;, &quot;.xml&quot;, &quot;.json&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>This is a list of file extensions handled as SSI files. This define is used to initialize a 'const char *const[]'. It is only used if LWIP_HTTPD_SSI_BY_FILE_EXTENSION != 0. </p>
+
+</div>
+</div>
 <a id="ga975961a6d22d1a077118fb85dfec809a" name="ga975961a6d22d1a077118fb85dfec809a"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga975961a6d22d1a077118fb85dfec809a">&#9670;&#160;</a></span>LWIP_HTTPD_SSI_INCLUDE_TAG</h2>
 
diff --git a/doc/doxygen/output/html/group__httpd__opts.js b/doc/doxygen/output/html/group__httpd__opts.js
index 1ec77f0..f9cea04 100644
--- a/doc/doxygen/output/html/group__httpd__opts.js
+++ b/doc/doxygen/output/html/group__httpd__opts.js
@@ -18,6 +18,7 @@
     [ "LWIP_HTTPD_CUSTOM_FILES", "group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd", null ],
     [ "LWIP_HTTPD_DYNAMIC_FILE_READ", "group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79", null ],
     [ "LWIP_HTTPD_DYNAMIC_HEADERS", "group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7", null ],
+    [ "LWIP_HTTPD_FILE_EXTENSION", "group__httpd__opts.html#gaa3648a9fdefe3ab1c890b715a4786429", null ],
     [ "LWIP_HTTPD_FILE_STATE", "group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c", null ],
     [ "LWIP_HTTPD_FS_ASYNC_READ", "group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331", null ],
     [ "LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED", "group__httpd__opts.html#ga0d5074965efd40786182287895feb691", null ],
@@ -29,6 +30,7 @@
     [ "LWIP_HTTPD_REQ_QUEUELEN", "group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0", null ],
     [ "LWIP_HTTPD_SSI", "group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949", null ],
     [ "LWIP_HTTPD_SSI_BY_FILE_EXTENSION", "group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466", null ],
+    [ "LWIP_HTTPD_SSI_EXTENSIONS", "group__httpd__opts.html#ga006baa7219cff5ee02f5a14ef7d7c89d", null ],
     [ "LWIP_HTTPD_SSI_INCLUDE_TAG", "group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a", null ],
     [ "LWIP_HTTPD_SSI_MULTIPART", "group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0", null ],
     [ "LWIP_HTTPD_SSI_RAW", "group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5", null ],
diff --git a/doc/doxygen/output/html/group__iana.html b/doc/doxygen/output/html/group__iana.html
index edb0a44..6e74329 100644
--- a/doc/doxygen/output/html/group__iana.html
+++ b/doc/doxygen/output/html/group__iana.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__ieee.html b/doc/doxygen/output/html/group__ieee.html
index 70d9344..826c481 100644
--- a/doc/doxygen/output/html/group__ieee.html
+++ b/doc/doxygen/output/html/group__ieee.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__if__api.html b/doc/doxygen/output/html/group__if__api.html
index ffaa5a6..7660936 100644
--- a/doc/doxygen/output/html/group__if__api.html
+++ b/doc/doxygen/output/html/group__if__api.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -155,7 +155,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Returs the interface index corresponding to name ifname. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Returns the interface index corresponding to name ifname. </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">ifname</td><td>Interface name </td></tr>
   </table>
diff --git a/doc/doxygen/output/html/group__igmp.html b/doc/doxygen/output/html/group__igmp.html
index 65b571b..c4f155e 100644
--- a/doc/doxygen/output/html/group__igmp.html
+++ b/doc/doxygen/output/html/group__igmp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -138,10 +138,10 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">((<span class="keyword">struct </span><a class="code hl_struct" href="structigmp__group.html">igmp_group</a> *)<a class="code hl_define" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="code hl_struct" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP))</div>
-<div class="ttc" id="agroup__netif__cd_html_ga4bce01ddbf0fd70cb88431f773c91bc5"><div class="ttname"><a href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a></div><div class="ttdeci">#define netif_get_client_data(netif, id)</div><div class="ttdef"><b>Definition</b> netif.h:237</div></div>
+<div class="ttc" id="agroup__netif__cd_html_ga4bce01ddbf0fd70cb88431f773c91bc5"><div class="ttname"><a href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a></div><div class="ttdeci">#define netif_get_client_data(netif, id)</div><div class="ttdef"><b>Definition</b> netif.h:240</div></div>
 <div class="ttc" id="astructigmp__group_html"><div class="ttname"><a href="structigmp__group.html">igmp_group</a></div><div class="ttdef"><b>Definition</b> igmp.h:74</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
-</div><!-- fragment --><p>Get list head of IGMP groups for netif. Note: The allsystems group IP is contained in the list as first entry. </p><dl class="section see"><dt>See also</dt><dd>netif_set_igmp_mac_filter() </dd></dl>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
+</div><!-- fragment --><p>Get list head of IGMP groups for netif. Note: The allsystems group IP is contained in the list as first entry. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#ga3428b3f8195249c6cd8704a4db46b401">netif_set_igmp_mac_filter()</a> </dd></dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__infrastructure.html b/doc/doxygen/output/html/group__infrastructure.html
index 6f07c00..e0cf36d 100644
--- a/doc/doxygen/output/html/group__infrastructure.html
+++ b/doc/doxygen/output/html/group__infrastructure.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__infrastructure__errors.html b/doc/doxygen/output/html/group__infrastructure__errors.html
index 74653a4..689d6d9 100644
--- a/doc/doxygen/output/html/group__infrastructure__errors.html
+++ b/doc/doxygen/output/html/group__infrastructure__errors.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__ip.html b/doc/doxygen/output/html/group__ip.html
index 9211418..dab118c 100644
--- a/doc/doxygen/output/html/group__ip.html
+++ b/doc/doxygen/output/html/group__ip.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -148,7 +148,7 @@
 <div class="line">        ip6_netif_get_local_ip(<a class="code hl_struct" href="structnetif.html">netif</a>, <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest)) : \</div>
 <div class="line">        ip4_netif_get_local_ip(<a class="code hl_struct" href="structnetif.html">netif</a>))</div>
 <div class="ttc" id="agroup__ip6addr_html_ga06e75bcd198012b5ba39480c233608bd"><div class="ttname"><a href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a></div><div class="ttdeci">#define ip_2_ip6(ipaddr)</div><div class="ttdef"><b>Definition</b> ip_addr.h:116</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>Get netif for IP. </p>
 
 </div>
@@ -195,7 +195,7 @@
 <div class="line">        ip6_output(p, <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest), ttl, tos, proto) : \</div>
 <div class="line">        <a class="code hl_function" href="ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8">ip4_output</a>(p, <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest), ttl, tos, proto))</div>
 <div class="ttc" id="agroup__ip4addr_html_gad7268a496b7e3f872efecd859eba6f03"><div class="ttname"><a href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a></div><div class="ttdeci">#define ip_2_ip4(ipaddr)</div><div class="ttdef"><b>Definition</b> ip_addr.h:120</div></div>
-<div class="ttc" id="aip4_8c_html_ac87d296205eb5ac04058e609672d4ba8"><div class="ttname"><a href="ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8">ip4_output</a></div><div class="ttdeci">err_t ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto)</div><div class="ttdef"><b>Definition</b> ip4.c:1028</div></div>
+<div class="ttc" id="aip4_8c_html_ac87d296205eb5ac04058e609672d4ba8"><div class="ttname"><a href="ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8">ip4_output</a></div><div class="ttdeci">err_t ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto)</div><div class="ttdef"><b>Definition</b> ip4.c:1062</div></div>
 </div><!-- fragment --><p>Output IP packet, netif is selected by source address </p>
 
 </div>
@@ -246,7 +246,7 @@
 <b>Value:</b><div class="fragment"><div class="line">        (IP_IS_V6(dest) ? \</div>
 <div class="line">        ip6_output_if(p, <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest), ttl, tos, proto, <a class="code hl_struct" href="structnetif.html">netif</a>) : \</div>
 <div class="line">        <a class="code hl_function" href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a>(p, <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest), ttl, tos, proto, <a class="code hl_struct" href="structnetif.html">netif</a>))</div>
-<div class="ttc" id="aip4_8c_html_ab220bc4ce4f48bdbba447358b3594917"><div class="ttname"><a href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a></div><div class="ttdeci">err_t ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif)</div><div class="ttdef"><b>Definition</b> ip4.c:787</div></div>
+<div class="ttc" id="aip4_8c_html_ab220bc4ce4f48bdbba447358b3594917"><div class="ttname"><a href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a></div><div class="ttdeci">err_t ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif)</div><div class="ttdef"><b>Definition</b> ip4.c:821</div></div>
 </div><!-- fragment --><p>Output IP packet to specified interface </p>
 
 </div>
@@ -297,7 +297,7 @@
 <b>Value:</b><div class="fragment"><div class="line">        (IP_IS_V6(dest) ? \</div>
 <div class="line">        ip6_output_if_src(p, <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(dest), ttl, tos, proto, <a class="code hl_struct" href="structnetif.html">netif</a>) : \</div>
 <div class="line">        <a class="code hl_function" href="ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7">ip4_output_if_src</a>(p, <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(dest), ttl, tos, proto, <a class="code hl_struct" href="structnetif.html">netif</a>))</div>
-<div class="ttc" id="aip4_8c_html_a2943d118873e9eb1d8296e04a6740db7"><div class="ttname"><a href="ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7">ip4_output_if_src</a></div><div class="ttdeci">err_t ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif)</div><div class="ttdef"><b>Definition</b> ip4.c:827</div></div>
+<div class="ttc" id="aip4_8c_html_a2943d118873e9eb1d8296e04a6740db7"><div class="ttname"><a href="ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7">ip4_output_if_src</a></div><div class="ttdeci">err_t ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif)</div><div class="ttdef"><b>Definition</b> ip4.c:861</div></div>
 </div><!-- fragment --><p>Output IP packet to interface specifying source address </p>
 
 </div>
diff --git a/doc/doxygen/output/html/group__ip4.html b/doc/doxygen/output/html/group__ip4.html
index 3a550ba..6b771f4 100644
--- a/doc/doxygen/output/html/group__ip4.html
+++ b/doc/doxygen/output/html/group__ip4.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -106,6 +106,8 @@
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="groups" name="groups"></a>
 Topics</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__acd.html">ACD</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__autoip.html">AUTOIP</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__dhcp4.html">DHCPv4</a></td></tr>
diff --git a/doc/doxygen/output/html/group__ip4.js b/doc/doxygen/output/html/group__ip4.js
index 326b97b..fc44be2 100644
--- a/doc/doxygen/output/html/group__ip4.js
+++ b/doc/doxygen/output/html/group__ip4.js
@@ -1,5 +1,6 @@
 var group__ip4 =
 [
+    [ "ACD", "group__acd.html", "group__acd" ],
     [ "AUTOIP", "group__autoip.html", "group__autoip" ],
     [ "DHCPv4", "group__dhcp4.html", "group__dhcp4" ],
     [ "IGMP", "group__igmp.html", "group__igmp" ],
diff --git a/doc/doxygen/output/html/group__ip4addr.html b/doc/doxygen/output/html/group__ip4addr.html
index a8e0145..fb6dd4d 100644
--- a/doc/doxygen/output/html/group__ip4addr.html
+++ b/doc/doxygen/output/html/group__ip4addr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__ip6.html b/doc/doxygen/output/html/group__ip6.html
index 08fa341..7898f84 100644
--- a/doc/doxygen/output/html/group__ip6.html
+++ b/doc/doxygen/output/html/group__ip6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__ip6__zones.html b/doc/doxygen/output/html/group__ip6__zones.html
index cbb2b39..72bcd16 100644
--- a/doc/doxygen/output/html/group__ip6__zones.html
+++ b/doc/doxygen/output/html/group__ip6__zones.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -122,8 +122,10 @@
 <tr class="separator:ga7347729485d837bcff85ae4731bbf5c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaeead8379cc3fd4c257be0bb654994a8f" id="r_gaeead8379cc3fd4c257be0bb654994a8f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaeead8379cc3fd4c257be0bb654994a8f">ip6_addr_equals_zone</a>(ip6addr,  zone_idx)</td></tr>
 <tr class="separator:gaeead8379cc3fd4c257be0bb654994a8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gacbb8e1a7505d9772181defa0e75b8da9" id="r_gacbb8e1a7505d9772181defa0e75b8da9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gacbb8e1a7505d9772181defa0e75b8da9">ip6_addr_cmp_zone</a>(ip6addr1,  ip6addr2)</td></tr>
-<tr class="separator:gacbb8e1a7505d9772181defa0e75b8da9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac01d0bad0a682dcc239ba3d5695e0648" id="r_gac01d0bad0a682dcc239ba3d5695e0648"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gac01d0bad0a682dcc239ba3d5695e0648">ip6_addr_cmp_zone</a>(addr1,  addr2)</td></tr>
+<tr class="separator:gac01d0bad0a682dcc239ba3d5695e0648"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabc6d5f833b2abef31aa602dc11ace0a9" id="r_gabc6d5f833b2abef31aa602dc11ace0a9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gabc6d5f833b2abef31aa602dc11ace0a9">ip6_addr_zone_eq</a>(ip6addr1,  ip6addr2)</td></tr>
+<tr class="separator:gabc6d5f833b2abef31aa602dc11ace0a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gae677a65970f4b667156b256dd9a4924b" id="r_gae677a65970f4b667156b256dd9a4924b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gae677a65970f4b667156b256dd9a4924b">IPV6_CUSTOM_SCOPES</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gae677a65970f4b667156b256dd9a4924b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaa5332bb3b70c1a9acba1bea3ea0ecb90" id="r_gaa5332bb3b70c1a9acba1bea3ea0ecb90"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a>(ip6addr,  type)</td></tr>
@@ -173,8 +175,8 @@
 <b>Value:</b><div class="fragment"><div class="line">    (<a class="code hl_define" href="#ga213310b303dd050da7856d67da72abd6">ip6_addr_set_zone</a>((ip6addr), \</div>
 <div class="line">      <a class="code hl_define" href="#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a>((ip6addr), (type)) ? netif_get_index(<a class="code hl_struct" href="structnetif.html">netif</a>) : 0))</div>
 <div class="ttc" id="agroup__ip6__zones_html_ga213310b303dd050da7856d67da72abd6"><div class="ttname"><a href="#ga213310b303dd050da7856d67da72abd6">ip6_addr_set_zone</a></div><div class="ttdeci">#define ip6_addr_set_zone(ip6addr, zone_idx)</div><div class="ttdef"><b>Definition</b> ip6_zone.h:115</div></div>
-<div class="ttc" id="agroup__ip6__zones_html_gaa5332bb3b70c1a9acba1bea3ea0ecb90"><div class="ttname"><a href="#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a></div><div class="ttdeci">#define ip6_addr_has_scope(ip6addr, type)</div><div class="ttdef"><b>Definition</b> ip6_zone.h:177</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="agroup__ip6__zones_html_gaa5332bb3b70c1a9acba1bea3ea0ecb90"><div class="ttname"><a href="#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a></div><div class="ttdeci">#define ip6_addr_has_scope(ip6addr, type)</div><div class="ttdef"><b>Definition</b> ip6_zone.h:179</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>Assign a zone index to an IPv6 address, based on a network interface. If the given address has a scope, the assigned zone index is that scope's zone of the given netif; otherwise, the assigned zone index is "no zone".</p>
 <p>This default implementation follows the default model of RFC 4007, where only interface-local and link-local scopes are defined, and the zone index of both of those scopes always equals the index of the network interface. As such, this default implementation need not distinguish between different constrained scopes when assigning the zone.</p>
 <dl class="params"><dt>Parameters</dt><dd>
@@ -208,8 +210,8 @@
 
 </div>
 </div>
-<a id="gacbb8e1a7505d9772181defa0e75b8da9" name="gacbb8e1a7505d9772181defa0e75b8da9"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#gacbb8e1a7505d9772181defa0e75b8da9">&#9670;&#160;</a></span>ip6_addr_cmp_zone</h2>
+<a id="gac01d0bad0a682dcc239ba3d5695e0648" name="gac01d0bad0a682dcc239ba3d5695e0648"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac01d0bad0a682dcc239ba3d5695e0648">&#9670;&#160;</a></span>ip6_addr_cmp_zone</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -217,17 +219,18 @@
         <tr>
           <td class="memname">#define ip6_addr_cmp_zone</td>
           <td>(</td>
-          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ip6addr1</em></span>, </td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ip6addr2</em></span>&#160;)</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line">((ip6addr1)-&gt;zone == (ip6addr2)-&gt;zone)</div>
-</div><!-- fragment --><p>Are the zone fields of the given IPv6 addresses equal? (0/1) This macro must only be used on IPv6 addresses of the same scope. </p>
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#gabc6d5f833b2abef31aa602dc11ace0a9">ip6_addr_zone_eq</a>(ip6addr1, ip6addr2)</div>
+<div class="ttc" id="agroup__ip6__zones_html_gabc6d5f833b2abef31aa602dc11ace0a9"><div class="ttname"><a href="#gabc6d5f833b2abef31aa602dc11ace0a9">ip6_addr_zone_eq</a></div><div class="ttdeci">#define ip6_addr_zone_eq(ip6addr1, ip6addr2)</div><div class="ttdef"><b>Definition</b> ip6_zone.h:130</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000010">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#gabc6d5f833b2abef31aa602dc11ace0a9">ip6_addr_zone_eq</a> </dd></dl>
 
 </div>
 </div>
@@ -298,7 +301,7 @@
 <b>Value:</b><div class="fragment"><div class="line">  (ip6_addr_islinklocal(ip6addr) || (((type) != <a class="code hl_enumvalue" href="#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0">IP6_UNICAST</a>) &amp;&amp; \</div>
 <div class="line">   (ip6_addr_ismulticast_iflocal(ip6addr) || \</div>
 <div class="line">    ip6_addr_ismulticast_linklocal(ip6addr))))</div>
-<div class="ttc" id="agroup__ip6__zones_html_gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0"><div class="ttname"><a href="#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0">IP6_UNICAST</a></div><div class="ttdeci">@ IP6_UNICAST</div><div class="ttdef"><b>Definition</b> ip6_zone.h:141</div></div>
+<div class="ttc" id="agroup__ip6__zones_html_gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0"><div class="ttname"><a href="#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0">IP6_UNICAST</a></div><div class="ttdeci">@ IP6_UNICAST</div><div class="ttdef"><b>Definition</b> ip6_zone.h:143</div></div>
 </div><!-- fragment --><p>Determine whether an IPv6 address has a constrained scope, and as such is meaningful only if accompanied by a zone index to identify the scope's zone. The given address type may be used to eliminate at compile time certain checks that will evaluate to false at run time anyway.</p>
 <p>This default implementation follows the default model of RFC 4007, where only interface-local and link-local scopes are defined.</p>
 <p>Even though the unicast loopback address does have an implied link-local scope, in this implementation it does not have an explicitly assigned zone index. As such it should not be tested for in this macro.</p>
@@ -380,7 +383,7 @@
 <div class="line">  if (selected_netif != NULL) { \</div>
 <div class="line">    ip6_addr_assign_zone((dest), <a class="code hl_enumvalue" href="#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8">IP6_UNKNOWN</a>, selected_netif); \</div>
 <div class="line">  } } <span class="keywordflow">while</span> (0)</div>
-<div class="ttc" id="agroup__ip6__zones_html_gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8"><div class="ttname"><a href="#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8">IP6_UNKNOWN</a></div><div class="ttdeci">@ IP6_UNKNOWN</div><div class="ttdef"><b>Definition</b> ip6_zone.h:139</div></div>
+<div class="ttc" id="agroup__ip6__zones_html_gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8"><div class="ttname"><a href="#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8">IP6_UNKNOWN</a></div><div class="ttdeci">@ IP6_UNKNOWN</div><div class="ttdef"><b>Definition</b> ip6_zone.h:141</div></div>
 <div class="ttc" id="aip6_8c_html_a519686a2c3beb689bf1d3380c4e5efb1"><div class="ttname"><a href="ip6_8c.html#a519686a2c3beb689bf1d3380c4e5efb1">ip6_route</a></div><div class="ttdeci">struct netif * ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest)</div><div class="ttdef"><b>Definition</b> ip6.c:86</div></div>
 </div><!-- fragment --><p>Try to select a zone for a scoped address that does not yet have a zone. Called from PCB bind and connect routines, for two reasons: 1) to save on this (relatively expensive) selection for every individual packet route operation and 2) to allow the application to obtain the selected zone from the PCB as is customary for e.g. getsockname/getpeername BSD socket calls.</p>
 <p>Ideally, callers would always supply a properly zoned address, in which case this function would not be needed. It exists both for compatibility with the BSD socket API (which accepts zoneless destination addresses) and for backward compatibility with pre-scoping lwIP code.</p>
@@ -470,6 +473,29 @@
 
 </div>
 </div>
+<a id="gabc6d5f833b2abef31aa602dc11ace0a9" name="gabc6d5f833b2abef31aa602dc11ace0a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabc6d5f833b2abef31aa602dc11ace0a9">&#9670;&#160;</a></span>ip6_addr_zone_eq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_zone_eq</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ip6addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ip6addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((ip6addr1)-&gt;zone == (ip6addr2)-&gt;zone)</div>
+</div><!-- fragment --><p>Are the zone fields of the given IPv6 addresses equal? (0/1) This macro must only be used on IPv6 addresses of the same scope. </p>
+
+</div>
+</div>
 <a id="ga2049167d1715b9a9cf2730e122c0d4fb" name="ga2049167d1715b9a9cf2730e122c0d4fb"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga2049167d1715b9a9cf2730e122c0d4fb">&#9670;&#160;</a></span>IP6_NO_ZONE</h2>
 
diff --git a/doc/doxygen/output/html/group__ip6__zones.js b/doc/doxygen/output/html/group__ip6__zones.js
index 025056a..82b2692 100644
--- a/doc/doxygen/output/html/group__ip6__zones.js
+++ b/doc/doxygen/output/html/group__ip6__zones.js
@@ -2,7 +2,7 @@
 [
     [ "ip6_addr_assign_zone", "group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5", null ],
     [ "ip6_addr_clear_zone", "group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad", null ],
-    [ "ip6_addr_cmp_zone", "group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9", null ],
+    [ "ip6_addr_cmp_zone", "group__ip6__zones.html#gac01d0bad0a682dcc239ba3d5695e0648", null ],
     [ "ip6_addr_copy_zone", "group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4", null ],
     [ "ip6_addr_equals_zone", "group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f", null ],
     [ "ip6_addr_has_scope", "group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90", null ],
@@ -12,6 +12,7 @@
     [ "ip6_addr_set_zone", "group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6", null ],
     [ "ip6_addr_test_zone", "group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e", null ],
     [ "ip6_addr_zone", "group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634", null ],
+    [ "ip6_addr_zone_eq", "group__ip6__zones.html#gabc6d5f833b2abef31aa602dc11ace0a9", null ],
     [ "IP6_NO_ZONE", "group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb", null ],
     [ "IPADDR6_ZONE_INIT", "group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9", null ],
     [ "IPV6_CUSTOM_SCOPES", "group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b", null ],
diff --git a/doc/doxygen/output/html/group__ip6addr.html b/doc/doxygen/output/html/group__ip6addr.html
index ab628e7..e94a766 100644
--- a/doc/doxygen/output/html/group__ip6addr.html
+++ b/doc/doxygen/output/html/group__ip6addr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__ipaddr.html b/doc/doxygen/output/html/group__ipaddr.html
index 34b51ca..6b73ad1 100644
--- a/doc/doxygen/output/html/group__ipaddr.html
+++ b/doc/doxygen/output/html/group__ipaddr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,6 +100,7 @@
   <div class="summary">
 <a href="#groups">Topics</a> &#124;
 <a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
 <a href="#typedef-members">Typedefs</a> &#124;
 <a href="#enum-members">Enumerations</a> &#124;
 <a href="#func-members">Functions</a>  </div>
@@ -119,6 +120,35 @@
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structip__addr.html">ip_addr</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga3a2123f0bbf6fe843c8542e349c680eb" id="r_ga3a2123f0bbf6fe843c8542e349c680eb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga3a2123f0bbf6fe843c8542e349c680eb">ip_addr_netcmp</a>(addr1,  addr2,  mask)</td></tr>
+<tr class="separator:ga3a2123f0bbf6fe843c8542e349c680eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad1bbbe4c93ea2368663e90814953b929" id="r_gad1bbbe4c93ea2368663e90814953b929"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gad1bbbe4c93ea2368663e90814953b929">ip_addr_net_eq</a>(addr1,  addr2,  mask)</td></tr>
+<tr class="separator:gad1bbbe4c93ea2368663e90814953b929"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga008c9c92d770cc030ea054e6b259835a" id="r_ga008c9c92d770cc030ea054e6b259835a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga008c9c92d770cc030ea054e6b259835a">ip_addr_cmp</a>(addr1,  addr2)</td></tr>
+<tr class="separator:ga008c9c92d770cc030ea054e6b259835a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b40158bdffa4b0c81c4ee77066e6b28" id="r_ga5b40158bdffa4b0c81c4ee77066e6b28"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga5b40158bdffa4b0c81c4ee77066e6b28">ip_addr_eq</a>(addr1,  addr2)</td></tr>
+<tr class="separator:ga5b40158bdffa4b0c81c4ee77066e6b28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadb66f6d5fa926ed4b0e69db58dffcbe4" id="r_gadb66f6d5fa926ed4b0e69db58dffcbe4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gadb66f6d5fa926ed4b0e69db58dffcbe4">ip_addr_cmp_zoneless</a>(addr1,  addr2)</td></tr>
+<tr class="separator:gadb66f6d5fa926ed4b0e69db58dffcbe4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8ac2686417ec2974bb0b3fc6ee0ee1a7" id="r_ga8ac2686417ec2974bb0b3fc6ee0ee1a7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga8ac2686417ec2974bb0b3fc6ee0ee1a7">ip_addr_zoneless_eq</a>(addr1,  addr2)</td></tr>
+<tr class="separator:ga8ac2686417ec2974bb0b3fc6ee0ee1a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga279118890e6a90aa740051fb8b0cc5f4" id="r_ga279118890e6a90aa740051fb8b0cc5f4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga279118890e6a90aa740051fb8b0cc5f4">ip_addr_isany</a>(ipaddr)</td></tr>
+<tr class="separator:ga279118890e6a90aa740051fb8b0cc5f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacd8f5aa151cff966fd28368b85f38c05" id="r_gacd8f5aa151cff966fd28368b85f38c05"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gacd8f5aa151cff966fd28368b85f38c05">ip_addr_isany_val</a>(ipaddr)</td></tr>
+<tr class="separator:gacd8f5aa151cff966fd28368b85f38c05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3345706e3aa8b32dd630c195b053e75" id="r_gaa3345706e3aa8b32dd630c195b053e75"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa3345706e3aa8b32dd630c195b053e75">ip_addr_isbroadcast</a>(ipaddr,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaa3345706e3aa8b32dd630c195b053e75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2170d3ee13dd22722222228e7b1c5752" id="r_ga2170d3ee13dd22722222228e7b1c5752"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga2170d3ee13dd22722222228e7b1c5752">ip_addr_ismulticast</a>(ipaddr)</td></tr>
+<tr class="separator:ga2170d3ee13dd22722222228e7b1c5752"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0fc8bf6662809274750868683b3a422e" id="r_ga0fc8bf6662809274750868683b3a422e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga0fc8bf6662809274750868683b3a422e">ip_addr_isloopback</a>(ipaddr)</td></tr>
+<tr class="separator:ga0fc8bf6662809274750868683b3a422e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga33bc079baaf513a9a7381b9531a1f653" id="r_ga33bc079baaf513a9a7381b9531a1f653"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga33bc079baaf513a9a7381b9531a1f653">ip_addr_islinklocal</a>(ipaddr)</td></tr>
+<tr class="separator:ga33bc079baaf513a9a7381b9531a1f653"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabe43b154533b73585c4e58f568370ede" id="r_gabe43b154533b73585c4e58f568370ede"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gabe43b154533b73585c4e58f568370ede">IP_ANY_TYPE</a>&#160;&#160;&#160;(&amp;ip_addr_any_type)</td></tr>
+<tr class="separator:gabe43b154533b73585c4e58f568370ede"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
 Typedefs</h2></td></tr>
 <tr class="memitem:ga335a8c9df66319e88a1a529047ce0a1e" id="r_ga335a8c9df66319e88a1a529047ce0a1e"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structip__addr.html">ip_addr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a></td></tr>
@@ -142,6 +172,313 @@
 <tr class="separator:ga4de70fdd7fd36c5b6eaed8b855d5f151"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga008c9c92d770cc030ea054e6b259835a" name="ga008c9c92d770cc030ea054e6b259835a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga008c9c92d770cc030ea054e6b259835a">&#9670;&#160;</a></span>ip_addr_cmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_cmp</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#ga5b40158bdffa4b0c81c4ee77066e6b28">ip_addr_eq</a>((addr1), (addr2))</div>
+<div class="ttc" id="agroup__ipaddr_html_ga5b40158bdffa4b0c81c4ee77066e6b28"><div class="ttname"><a href="#ga5b40158bdffa4b0c81c4ee77066e6b28">ip_addr_eq</a></div><div class="ttdeci">#define ip_addr_eq(addr1, addr2)</div><div class="ttdef"><b>Definition</b> ip_addr.h:214</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000012">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#ga5b40158bdffa4b0c81c4ee77066e6b28">ip_addr_eq</a> </dd></dl>
+
+</div>
+</div>
+<a id="gadb66f6d5fa926ed4b0e69db58dffcbe4" name="gadb66f6d5fa926ed4b0e69db58dffcbe4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadb66f6d5fa926ed4b0e69db58dffcbe4">&#9670;&#160;</a></span>ip_addr_cmp_zoneless</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_cmp_zoneless</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#ga8ac2686417ec2974bb0b3fc6ee0ee1a7">ip_addr_zoneless_eq</a>((addr1), (addr2))</div>
+<div class="ttc" id="agroup__ipaddr_html_ga8ac2686417ec2974bb0b3fc6ee0ee1a7"><div class="ttname"><a href="#ga8ac2686417ec2974bb0b3fc6ee0ee1a7">ip_addr_zoneless_eq</a></div><div class="ttdeci">#define ip_addr_zoneless_eq(addr1, addr2)</div><div class="ttdef"><b>Definition</b> ip_addr.h:224</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000013">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#ga8ac2686417ec2974bb0b3fc6ee0ee1a7">ip_addr_zoneless_eq</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga5b40158bdffa4b0c81c4ee77066e6b28" name="ga5b40158bdffa4b0c81c4ee77066e6b28"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga5b40158bdffa4b0c81c4ee77066e6b28">&#9670;&#160;</a></span>ip_addr_eq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_eq</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \</div>
+<div class="line">  ip6_addr_eq(<a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(addr1), <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(addr2)) : \</div>
+<div class="line">  ip4_addr_eq(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr1), <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr2))))</div>
+<div class="ttc" id="agroup__ip4addr_html_gad7268a496b7e3f872efecd859eba6f03"><div class="ttname"><a href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a></div><div class="ttdeci">#define ip_2_ip4(ipaddr)</div><div class="ttdef"><b>Definition</b> ip_addr.h:120</div></div>
+<div class="ttc" id="agroup__ip6addr_html_ga06e75bcd198012b5ba39480c233608bd"><div class="ttname"><a href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a></div><div class="ttdeci">#define ip_2_ip6(ipaddr)</div><div class="ttdef"><b>Definition</b> ip_addr.h:116</div></div>
+</div><!-- fragment --><p>Check if two ip addresses are equal. </p>
+
+</div>
+</div>
+<a id="ga279118890e6a90aa740051fb8b0cc5f4" name="ga279118890e6a90aa740051fb8b0cc5f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga279118890e6a90aa740051fb8b0cc5f4">&#9670;&#160;</a></span>ip_addr_isany</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_isany</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  (((ipaddr) == NULL) ? 1 : ((IP_IS_V6(ipaddr)) ? \</div>
+<div class="line">  ip6_addr_isany(<a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)) : \</div>
+<div class="line">  ip4_addr_isany(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr))))</div>
+</div><!-- fragment --><p>Check if an ip address is the 'any' address. </p>
+
+</div>
+</div>
+<a id="gacd8f5aa151cff966fd28368b85f38c05" name="gacd8f5aa151cff966fd28368b85f38c05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gacd8f5aa151cff966fd28368b85f38c05">&#9670;&#160;</a></span>ip_addr_isany_val</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_isany_val</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  ((IP_IS_V6_VAL(ipaddr)) ? \</div>
+<div class="line">  ip6_addr_isany_val(*<a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;(ipaddr))) : \</div>
+<div class="line">  ip4_addr_isany_val(*<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;(ipaddr))))</div>
+</div><!-- fragment --><p>Check if an ip address is the 'any' address, by value. </p>
+
+</div>
+</div>
+<a id="gaa3345706e3aa8b32dd630c195b053e75" name="gaa3345706e3aa8b32dd630c195b053e75"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa3345706e3aa8b32dd630c195b053e75">&#9670;&#160;</a></span>ip_addr_isbroadcast</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_isbroadcast</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em><a class="el" href="structnetif.html">netif</a></em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  ((IP_IS_V6(ipaddr)) ? \</div>
+<div class="line">  0 : \</div>
+<div class="line">  ip4_addr_isbroadcast(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr), <a class="code hl_struct" href="structnetif.html">netif</a>))</div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
+</div><!-- fragment --><p>Check if an ip address is a broadcast address. </p>
+
+</div>
+</div>
+<a id="ga33bc079baaf513a9a7381b9531a1f653" name="ga33bc079baaf513a9a7381b9531a1f653"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga33bc079baaf513a9a7381b9531a1f653">&#9670;&#160;</a></span>ip_addr_islinklocal</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_islinklocal</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  ((IP_IS_V6(ipaddr)) ? \</div>
+<div class="line">  ip6_addr_islinklocal(<a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)) : \</div>
+<div class="line">  ip4_addr_islinklocal(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)))</div>
+</div><!-- fragment --><p>Check inf an ip address is a link-local address. </p>
+
+</div>
+</div>
+<a id="ga0fc8bf6662809274750868683b3a422e" name="ga0fc8bf6662809274750868683b3a422e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0fc8bf6662809274750868683b3a422e">&#9670;&#160;</a></span>ip_addr_isloopback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_isloopback</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  ((IP_IS_V6(ipaddr)) ? \</div>
+<div class="line">  ip6_addr_isloopback(<a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)) : \</div>
+<div class="line">  <a class="code hl_define" href="ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051">ip4_addr_isloopback</a>(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)))</div>
+<div class="ttc" id="aip4__addr_8h_html_a46dabb4df212d156004fa5afe03e2051"><div class="ttname"><a href="ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051">ip4_addr_isloopback</a></div><div class="ttdeci">#define ip4_addr_isloopback(ipaddr)</div><div class="ttdef"><b>Definition</b> ip4_addr.h:119</div></div>
+</div><!-- fragment --><p>Check inf an ip address is a loopback address. </p>
+
+</div>
+</div>
+<a id="ga2170d3ee13dd22722222228e7b1c5752" name="ga2170d3ee13dd22722222228e7b1c5752"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2170d3ee13dd22722222228e7b1c5752">&#9670;&#160;</a></span>ip_addr_ismulticast</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_ismulticast</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  ((IP_IS_V6(ipaddr)) ? \</div>
+<div class="line">  ip6_addr_ismulticast(<a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(ipaddr)) : \</div>
+<div class="line">  ip4_addr_ismulticast(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)))</div>
+</div><!-- fragment --><p>Check inf an ip address is a multicast address. </p>
+
+</div>
+</div>
+<a id="gad1bbbe4c93ea2368663e90814953b929" name="gad1bbbe4c93ea2368663e90814953b929"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad1bbbe4c93ea2368663e90814953b929">&#9670;&#160;</a></span>ip_addr_net_eq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_net_eq</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>mask</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  ((IP_IS_V6(addr1) &amp;&amp; IP_IS_V6(addr2)) ? \</div>
+<div class="line">  0 : \</div>
+<div class="line">  ip4_addr_net_eq(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr1), <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr2), mask))</div>
+</div><!-- fragment --><p>Check if two ip addresses are share the same network, for a specific netmask. </p>
+
+</div>
+</div>
+<a id="ga3a2123f0bbf6fe843c8542e349c680eb" name="ga3a2123f0bbf6fe843c8542e349c680eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3a2123f0bbf6fe843c8542e349c680eb">&#9670;&#160;</a></span>ip_addr_netcmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_netcmp</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>mask</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#gad1bbbe4c93ea2368663e90814953b929">ip_addr_net_eq</a>((addr1), (addr2), (mask))</div>
+<div class="ttc" id="agroup__ipaddr_html_gad1bbbe4c93ea2368663e90814953b929"><div class="ttname"><a href="#gad1bbbe4c93ea2368663e90814953b929">ip_addr_net_eq</a></div><div class="ttdeci">#define ip_addr_net_eq(addr1, addr2, mask)</div><div class="ttdef"><b>Definition</b> ip_addr.h:204</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000011">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#gad1bbbe4c93ea2368663e90814953b929">ip_addr_net_eq</a> </dd></dl>
+
+</div>
+</div>
+<a id="ga8ac2686417ec2974bb0b3fc6ee0ee1a7" name="ga8ac2686417ec2974bb0b3fc6ee0ee1a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga8ac2686417ec2974bb0b3fc6ee0ee1a7">&#9670;&#160;</a></span>ip_addr_zoneless_eq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip_addr_zoneless_eq</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">  ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \</div>
+<div class="line">  ip6_addr_zoneless_eq(<a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(addr1), <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(addr2)) : \</div>
+<div class="line">  ip4_addr_eq(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr1), <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(addr2))))</div>
+</div><!-- fragment --><p>Check if two ip addresses are equal, ignoring the zone. </p>
+
+</div>
+</div>
+<a id="gabe43b154533b73585c4e58f568370ede" name="gabe43b154533b73585c4e58f568370ede"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabe43b154533b73585c4e58f568370ede">&#9670;&#160;</a></span>IP_ANY_TYPE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define IP_ANY_TYPE&#160;&#160;&#160;(&amp;ip_addr_any_type)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Macro representing the 'any' address. </p>
+
+</div>
+</div>
 <h2 class="groupheader">Typedef Documentation</h2>
 <a id="ga335a8c9df66319e88a1a529047ce0a1e" name="ga335a8c9df66319e88a1a529047ce0a1e"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga335a8c9df66319e88a1a529047ce0a1e">&#9670;&#160;</a></span>ip_addr_t</h2>
diff --git a/doc/doxygen/output/html/group__ipaddr.js b/doc/doxygen/output/html/group__ipaddr.js
index a43e8aa..3d42947 100644
--- a/doc/doxygen/output/html/group__ipaddr.js
+++ b/doc/doxygen/output/html/group__ipaddr.js
@@ -5,6 +5,19 @@
     [ "ip_addr", "structip__addr.html", [
       [ "type", "structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a", null ]
     ] ],
+    [ "ip_addr_cmp", "group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a", null ],
+    [ "ip_addr_cmp_zoneless", "group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4", null ],
+    [ "ip_addr_eq", "group__ipaddr.html#ga5b40158bdffa4b0c81c4ee77066e6b28", null ],
+    [ "ip_addr_isany", "group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4", null ],
+    [ "ip_addr_isany_val", "group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05", null ],
+    [ "ip_addr_isbroadcast", "group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75", null ],
+    [ "ip_addr_islinklocal", "group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653", null ],
+    [ "ip_addr_isloopback", "group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e", null ],
+    [ "ip_addr_ismulticast", "group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752", null ],
+    [ "ip_addr_net_eq", "group__ipaddr.html#gad1bbbe4c93ea2368663e90814953b929", null ],
+    [ "ip_addr_netcmp", "group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb", null ],
+    [ "ip_addr_zoneless_eq", "group__ipaddr.html#ga8ac2686417ec2974bb0b3fc6ee0ee1a7", null ],
+    [ "IP_ANY_TYPE", "group__ipaddr.html#gabe43b154533b73585c4e58f568370ede", null ],
     [ "ip_addr_t", "group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e", null ],
     [ "lwip_ip_addr_type", "group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c", [
       [ "IPADDR_TYPE_V4", "group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049", null ],
diff --git a/doc/doxygen/output/html/group__iperf.html b/doc/doxygen/output/html/group__iperf.html
index 5a5e1c0..5114f1a 100644
--- a/doc/doxygen/output/html/group__iperf.html
+++ b/doc/doxygen/output/html/group__iperf.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -117,7 +117,7 @@
 <tr class="separator:gac51c9c44a38bfa1140bd44b793a0a004"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<p>This is a simple performance measuring client/server to check your bandwith using iPerf2 on a PC as server/client. It is currently a minimal implementation providing a TCP client/server only.</p>
+<p>This is a simple performance measuring client/server to check your bandwidth using iPerf2 on a PC as server/client. It is currently a minimal implementation providing a TCP client/server only.</p>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="gac51c9c44a38bfa1140bd44b793a0a004" name="gac51c9c44a38bfa1140bd44b793a0a004"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gac51c9c44a38bfa1140bd44b793a0a004">&#9670;&#160;</a></span>lwiperf_abort()</h2>
diff --git a/doc/doxygen/output/html/group__lwip.html b/doc/doxygen/output/html/group__lwip.html
index e6ee318..dd21fc2 100644
--- a/doc/doxygen/output/html/group__lwip.html
+++ b/doc/doxygen/output/html/group__lwip.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__assertions.html b/doc/doxygen/output/html/group__lwip__assertions.html
index 605a7f3..1396b35 100644
--- a/doc/doxygen/output/html/group__lwip__assertions.html
+++ b/doc/doxygen/output/html/group__lwip__assertions.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__nosys.html b/doc/doxygen/output/html/group__lwip__nosys.html
index df5e6a9..7368c83 100644
--- a/doc/doxygen/output/html/group__lwip__nosys.html
+++ b/doc/doxygen/output/html/group__lwip__nosys.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -118,11 +118,10 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>Use this mode if you do not run an OS on your system. #define NO_SYS to 1. Feed incoming packets to netif-&gt;input(pbuf, netif) function from mainloop, <em>not</em> <em>from</em> <em>interrupt</em> <em>context</em>. You can allocate a <a class="el" href="group__pbuf.html">Packet buffers (PBUF)</a> in interrupt context and put them into a queue which is processed from mainloop.<br  />
-Call <a class="el" href="#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts()</a> periodically in the mainloop.<br  />
-Porting: implement all functions in <a class="el" href="group__sys__time.html">Time</a>, <a class="el" href="group__sys__prot.html">Critical sections</a> and compiler_abstraction.<br  />
+ Call <a class="el" href="#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts()</a> periodically in the mainloop.<br  />
+ Porting: implement all functions in <a class="el" href="group__sys__time.html">Time</a>, <a class="el" href="group__sys__prot.html">Critical sections</a> and <a class="el" href="group__compiler__abstraction.html">Compiler/platform abstraction</a>.<br  />
  You can only use <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a> in this mode.<br  />
-Sample code:<br  />
-</p><div class="fragment"><div class="line"><span class="keywordtype">void</span></div>
+ Sample code: </p><div class="fragment"><div class="line"><span class="keywordtype">void</span></div>
 <div class="line">eth_mac_irq()</div>
 <div class="line">{</div>
 <div class="line">  <span class="comment">/* Service MAC IRQ here */</span></div>
@@ -197,7 +196,6 @@
 <div class="line">  <a class="code hl_struct" href="structnetif.html">netif</a>.<a class="code hl_variable" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">name</a>[0] = <span class="charliteral">&#39;e&#39;</span>;</div>
 <div class="line">  <a class="code hl_struct" href="structnetif.html">netif</a>.<a class="code hl_variable" href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">name</a>[1] = <span class="charliteral">&#39;0&#39;</span>;</div>
 <div class="line">  <a class="code hl_function" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a>(&amp;<a class="code hl_struct" href="structnetif.html">netif</a>, 1);</div>
-<div class="line">  <a class="code hl_struct" href="structnetif.html">netif</a>.<a class="code hl_variable" href="structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f">ip6_autoconfig_enabled</a> = 1;</div>
 <div class="line">  <a class="code hl_function" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif_set_status_callback</a>(&amp;<a class="code hl_struct" href="structnetif.html">netif</a>, netif_status_callback);</div>
 <div class="line">  <a class="code hl_function" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a>(&amp;<a class="code hl_struct" href="structnetif.html">netif</a>);</div>
 <div class="line">  <a class="code hl_function" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a>(&amp;<a class="code hl_struct" href="structnetif.html">netif</a>);</div>
@@ -244,15 +242,15 @@
 <div class="line">    <span class="comment">/* your application goes here */</span></div>
 <div class="line">  }</div>
 <div class="line">}</div>
-<div class="ttc" id="aetharp_8c_html_a19258c75a3778b6ed0c82f63a419502d"><div class="ttname"><a href="etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d">etharp_output</a></div><div class="ttdeci">err_t etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr)</div><div class="ttdef"><b>Definition</b> etharp.c:791</div></div>
+<div class="ttc" id="aetharp_8c_html_a19258c75a3778b6ed0c82f63a419502d"><div class="ttname"><a href="etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d">etharp_output</a></div><div class="ttdeci">err_t etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr)</div><div class="ttdef"><b>Definition</b> etharp.c:792</div></div>
 <div class="ttc" id="aethip6_8c_html_ab5326546d33174f91f1fb0cc6d398bfd"><div class="ttname"><a href="ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd">ethip6_output</a></div><div class="ttdeci">err_t ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr)</div><div class="ttdef"><b>Definition</b> ethip6.c:79</div></div>
-<div class="ttc" id="agroup__dhcp4_html_ga0c50968d9811aa2aa67fadc0885d744f"><div class="ttname"><a href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a></div><div class="ttdeci">err_t dhcp_start(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:742</div></div>
-<div class="ttc" id="agroup__httpd_html_gac364305cee969a0be43c071722b136e6"><div class="ttname"><a href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd_init</a></div><div class="ttdeci">void httpd_init(void)</div><div class="ttdef"><b>Definition</b> httpd.c:2675</div></div>
+<div class="ttc" id="agroup__dhcp4_html_ga0c50968d9811aa2aa67fadc0885d744f"><div class="ttname"><a href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a></div><div class="ttdeci">err_t dhcp_start(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:810</div></div>
+<div class="ttc" id="agroup__httpd_html_gac364305cee969a0be43c071722b136e6"><div class="ttname"><a href="group__httpd.html#gac364305cee969a0be43c071722b136e6">httpd_init</a></div><div class="ttdeci">void httpd_init(void)</div><div class="ttdef"><b>Definition</b> httpd.c:2683</div></div>
 <div class="ttc" id="agroup__infrastructure__errors_html_gaf02d9da80fd66b4f986d2c53d7231ddb"><div class="ttname"><a href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a></div><div class="ttdeci">s8_t err_t</div><div class="ttdef"><b>Definition</b> err.h:96</div></div>
 <div class="ttc" id="agroup__infrastructure__errors_html_ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb"><div class="ttname"><a href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">ERR_OK</a></div><div class="ttdeci">@ ERR_OK</div><div class="ttdef"><b>Definition</b> err.h:55</div></div>
-<div class="ttc" id="agroup__ip4addr_html_gae920b6e81610a38cf9ada52118807eff"><div class="ttname"><a href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a></div><div class="ttdeci">#define IP4_ADDR_ANY</div><div class="ttdef"><b>Definition</b> ip_addr.h:388</div></div>
-<div class="ttc" id="agroup__lwip__nosys_html_ga0c1a18439524d2f4a5e51d25c0ca2ce9"><div class="ttname"><a href="#ga0c1a18439524d2f4a5e51d25c0ca2ce9">lwip_init</a></div><div class="ttdeci">void lwip_init(void)</div><div class="ttdef"><b>Definition</b> init.c:333</div></div>
-<div class="ttc" id="agroup__lwip__nosys_html_ga5532f93d68c874fb99c681bff2165385"><div class="ttname"><a href="#ga5532f93d68c874fb99c681bff2165385">netif_input</a></div><div class="ttdeci">err_t netif_input(struct pbuf *p, struct netif *inp)</div><div class="ttdef"><b>Definition</b> netif.c:217</div></div>
+<div class="ttc" id="agroup__ip4addr_html_gae920b6e81610a38cf9ada52118807eff"><div class="ttname"><a href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a></div><div class="ttdeci">#define IP4_ADDR_ANY</div><div class="ttdef"><b>Definition</b> ip_addr.h:417</div></div>
+<div class="ttc" id="agroup__lwip__nosys_html_ga0c1a18439524d2f4a5e51d25c0ca2ce9"><div class="ttname"><a href="#ga0c1a18439524d2f4a5e51d25c0ca2ce9">lwip_init</a></div><div class="ttdeci">void lwip_init(void)</div><div class="ttdef"><b>Definition</b> init.c:339</div></div>
+<div class="ttc" id="agroup__lwip__nosys_html_ga5532f93d68c874fb99c681bff2165385"><div class="ttname"><a href="#ga5532f93d68c874fb99c681bff2165385">netif_input</a></div><div class="ttdeci">err_t netif_input(struct pbuf *p, struct netif *inp)</div><div class="ttdef"><b>Definition</b> netif.c:228</div></div>
 <div class="ttc" id="agroup__lwip__nosys_html_ga83cffdf69ab60fd0eba9d17d363f9883"><div class="ttname"><a href="#ga83cffdf69ab60fd0eba9d17d363f9883">sys_check_timeouts</a></div><div class="ttdeci">void sys_check_timeouts(void)</div><div class="ttdef"><b>Definition</b> timeouts.c:352</div></div>
 <div class="ttc" id="agroup__lwip__opts__memcpy_html_ga8c6e3c1e4f74acb16376188dbf8909ec"><div class="ttname"><a href="group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec">SMEMCPY</a></div><div class="ttdeci">#define SMEMCPY(dst, src, len)</div><div class="ttdef"><b>Definition</b> opt.h:145</div></div>
 <div class="ttc" id="agroup__netif__flags_html_ga76ad9d0cf9f029df0ab2a998c64040dc"><div class="ttname"><a href="group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc">NETIF_FLAG_ETHERNET</a></div><div class="ttdeci">#define NETIF_FLAG_ETHERNET</div><div class="ttdef"><b>Definition</b> netif.h:101</div></div>
@@ -260,34 +258,33 @@
 <div class="ttc" id="agroup__netif__flags_html_gab14fbe1447d2fdbdf5abc87f51eb6508"><div class="ttname"><a href="group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508">NETIF_FLAG_MLD6</a></div><div class="ttdeci">#define NETIF_FLAG_MLD6</div><div class="ttdef"><b>Definition</b> netif.h:107</div></div>
 <div class="ttc" id="agroup__netif__flags_html_gac9493b923d733c73f6006d9714826558"><div class="ttname"><a href="group__netif__flags.html#gac9493b923d733c73f6006d9714826558">NETIF_FLAG_IGMP</a></div><div class="ttdeci">#define NETIF_FLAG_IGMP</div><div class="ttdef"><b>Definition</b> netif.h:104</div></div>
 <div class="ttc" id="agroup__netif__flags_html_gaef64fe15c82bc7b235366923e517104e"><div class="ttname"><a href="group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e">NETIF_FLAG_BROADCAST</a></div><div class="ttdeci">#define NETIF_FLAG_BROADCAST</div><div class="ttdef"><b>Definition</b> netif.h:87</div></div>
-<div class="ttc" id="agroup__netif__ip6_html_gae864211a5eb052deb5da7bc7e3427fb9"><div class="ttname"><a href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a></div><div class="ttdeci">void netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit)</div><div class="ttdef"><b>Definition</b> netif.c:1515</div></div>
+<div class="ttc" id="agroup__netif__ip6_html_gae864211a5eb052deb5da7bc7e3427fb9"><div class="ttname"><a href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a></div><div class="ttdeci">void netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit)</div><div class="ttdef"><b>Definition</b> netif.c:1551</div></div>
 <div class="ttc" id="agroup__netif__mib2_html_ga05641438775014b7e13b9e55eba48bed"><div class="ttname"><a href="group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed">MIB2_STATS_NETIF_ADD</a></div><div class="ttdeci">#define MIB2_STATS_NETIF_ADD(n, x, val)</div><div class="ttdef"><b>Definition</b> snmp.h:110</div></div>
 <div class="ttc" id="agroup__netif__mib2_html_ga3c52caf566d37705c6547f2d025afd9f"><div class="ttname"><a href="group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f">MIB2_STATS_NETIF_INC</a></div><div class="ttdeci">#define MIB2_STATS_NETIF_INC(n, x)</div><div class="ttdef"><b>Definition</b> snmp.h:105</div></div>
 <div class="ttc" id="agroup__netif__mib2_html_ga5be1b8cba1d67bf6e7f8851ec91b10f0"><div class="ttname"><a href="group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0">MIB2_INIT_NETIF</a></div><div class="ttdeci">#define MIB2_INIT_NETIF(netif, type, speed)</div><div class="ttdef"><b>Definition</b> snmp.h:119</div></div>
-<div class="ttc" id="agroup__netif_html_ga22055759a25f5d6cea7e7deab0a07434"><div class="ttname"><a href="group__netif.html#ga22055759a25f5d6cea7e7deab0a07434">netif_add</a></div><div class="ttdeci">struct netif * netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)</div><div class="ttdef"><b>Definition</b> netif.c:276</div></div>
-<div class="ttc" id="agroup__netif_html_ga34e37a1e8e358760dc1c43887922c7db"><div class="ttname"><a href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down</a></div><div class="ttdeci">void netif_set_link_down(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:1029</div></div>
-<div class="ttc" id="agroup__netif_html_gac90f290edd005238d62aa94c4ac9dea3"><div class="ttname"><a href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a></div><div class="ttdeci">void netif_set_default(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:825</div></div>
-<div class="ttc" id="agroup__netif_html_gadc8787b23ac0ee023979cbadf87813d4"><div class="ttname"><a href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif_set_status_callback</a></div><div class="ttdeci">void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback)</div><div class="ttdef"><b>Definition</b> netif.c:960</div></div>
-<div class="ttc" id="agroup__netif_html_gae0d2975f189277990e9d5276fdd9e9ea"><div class="ttname"><a href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a></div><div class="ttdeci">void netif_set_link_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:991</div></div>
-<div class="ttc" id="agroup__netif_html_gaf19693be401a265a52d2a56c65753121"><div class="ttname"><a href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a></div><div class="ttdeci">void netif_set_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:847</div></div>
+<div class="ttc" id="agroup__netif_html_ga22055759a25f5d6cea7e7deab0a07434"><div class="ttname"><a href="group__netif.html#ga22055759a25f5d6cea7e7deab0a07434">netif_add</a></div><div class="ttdeci">struct netif * netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)</div><div class="ttdef"><b>Definition</b> netif.c:287</div></div>
+<div class="ttc" id="agroup__netif_html_ga34e37a1e8e358760dc1c43887922c7db"><div class="ttname"><a href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down</a></div><div class="ttdeci">void netif_set_link_down(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:1056</div></div>
+<div class="ttc" id="agroup__netif_html_gac90f290edd005238d62aa94c4ac9dea3"><div class="ttname"><a href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a></div><div class="ttdeci">void netif_set_default(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:849</div></div>
+<div class="ttc" id="agroup__netif_html_gadc8787b23ac0ee023979cbadf87813d4"><div class="ttname"><a href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif_set_status_callback</a></div><div class="ttdeci">void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback)</div><div class="ttdef"><b>Definition</b> netif.c:987</div></div>
+<div class="ttc" id="agroup__netif_html_gae0d2975f189277990e9d5276fdd9e9ea"><div class="ttname"><a href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a></div><div class="ttdeci">void netif_set_link_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:1018</div></div>
+<div class="ttc" id="agroup__netif_html_gaf19693be401a265a52d2a56c65753121"><div class="ttname"><a href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a></div><div class="ttdeci">void netif_set_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:871</div></div>
 <div class="ttc" id="agroup__pbuf_html_ga8bb9c5d54a06995b1c67ce695ead9969"><div class="ttname"><a href="group__pbuf.html#ga8bb9c5d54a06995b1c67ce695ead9969">pbuf_alloc</a></div><div class="ttdeci">struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)</div><div class="ttdef"><b>Definition</b> pbuf.c:224</div></div>
-<div class="ttc" id="agroup__pbuf_html_gab0dd696fb4b6bc65e548944584f1738b"><div class="ttname"><a href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a></div><div class="ttdeci">u8_t pbuf_free(struct pbuf *p)</div><div class="ttdef"><b>Definition</b> pbuf.c:725</div></div>
-<div class="ttc" id="agroup__pbuf_html_gac2f1f58fd36042e82af46f5015720899"><div class="ttname"><a href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf_copy_partial</a></div><div class="ttdeci">u16_t pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)</div><div class="ttdef"><b>Definition</b> pbuf.c:1061</div></div>
-<div class="ttc" id="agroup__pbuf_html_gad1e31e370271335b197272af2724ca85"><div class="ttname"><a href="group__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf_take</a></div><div class="ttdeci">err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)</div><div class="ttdef"><b>Definition</b> pbuf.c:1230</div></div>
+<div class="ttc" id="agroup__pbuf_html_gab0dd696fb4b6bc65e548944584f1738b"><div class="ttname"><a href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a></div><div class="ttdeci">u8_t pbuf_free(struct pbuf *p)</div><div class="ttdef"><b>Definition</b> pbuf.c:727</div></div>
+<div class="ttc" id="agroup__pbuf_html_gac2f1f58fd36042e82af46f5015720899"><div class="ttname"><a href="group__pbuf.html#gac2f1f58fd36042e82af46f5015720899">pbuf_copy_partial</a></div><div class="ttdeci">u16_t pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)</div><div class="ttdef"><b>Definition</b> pbuf.c:1058</div></div>
+<div class="ttc" id="agroup__pbuf_html_gad1e31e370271335b197272af2724ca85"><div class="ttname"><a href="group__pbuf.html#gad1e31e370271335b197272af2724ca85">pbuf_take</a></div><div class="ttdeci">err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)</div><div class="ttdef"><b>Definition</b> pbuf.c:1227</div></div>
 <div class="ttc" id="agroup__pbuf_html_ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21"><div class="ttname"><a href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21">PBUF_POOL</a></div><div class="ttdeci">@ PBUF_POOL</div><div class="ttdef"><b>Definition</b> pbuf.h:167</div></div>
 <div class="ttc" id="agroup__pbuf_html_ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba"><div class="ttname"><a href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba">PBUF_RAW</a></div><div class="ttdeci">@ PBUF_RAW</div><div class="ttdef"><b>Definition</b> pbuf.h:111</div></div>
 <div class="ttc" id="aip4__addr_8c_html_af01e406c5f44a325d779c4b4282a1744"><div class="ttname"><a href="ip4__addr_8c.html#af01e406c5f44a325d779c4b4282a1744">ip4addr_ntoa</a></div><div class="ttdeci">char * ip4addr_ntoa(const ip4_addr_t *addr)</div><div class="ttdef"><b>Definition</b> ip4_addr.c:269</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
-<div class="ttc" id="astructnetif_html_a1c171db6097bbb6f09f63549a66e00ea"><div class="ttname"><a href="structnetif.html#a1c171db6097bbb6f09f63549a66e00ea">netif::flags</a></div><div class="ttdeci">u8_t flags</div><div class="ttdef"><b>Definition</b> netif.h:345</div></div>
-<div class="ttc" id="astructnetif_html_a32fca6ffd28bb9af3f891a378827a67e"><div class="ttname"><a href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">netif::name</a></div><div class="ttdeci">char name[2]</div><div class="ttdef"><b>Definition</b> netif.h:347</div></div>
-<div class="ttc" id="astructnetif_html_a8e1dcfe65db487feecd244355f39215e"><div class="ttname"><a href="structnetif.html#a8e1dcfe65db487feecd244355f39215e">netif::output</a></div><div class="ttdeci">netif_output_fn output</div><div class="ttdef"><b>Definition</b> netif.h:294</div></div>
-<div class="ttc" id="astructnetif_html_a8fe4f1b7b0d710216287da9615164a5c"><div class="ttname"><a href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">netif::input</a></div><div class="ttdeci">netif_input_fn input</div><div class="ttdef"><b>Definition</b> netif.h:288</div></div>
-<div class="ttc" id="astructnetif_html_ac38383379cff22c402156fec71c19617"><div class="ttname"><a href="structnetif.html#ac38383379cff22c402156fec71c19617">netif::output_ip6</a></div><div class="ttdeci">netif_output_ip6_fn output_ip6</div><div class="ttdef"><b>Definition</b> netif.h:305</div></div>
-<div class="ttc" id="astructnetif_html_aca7d56b4e0f822b0ced2885f222b8d48"><div class="ttname"><a href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">netif::mtu</a></div><div class="ttdeci">u16_t mtu</div><div class="ttdef"><b>Definition</b> netif.h:335</div></div>
-<div class="ttc" id="astructnetif_html_acaaac9b415a7be73eb8a287c8ed18a8d"><div class="ttname"><a href="structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d">netif::linkoutput</a></div><div class="ttdeci">netif_linkoutput_fn linkoutput</div><div class="ttdef"><b>Definition</b> netif.h:299</div></div>
-<div class="ttc" id="astructnetif_html_ad98bafb7733b40ef898e53d91fbfa20f"><div class="ttname"><a href="structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f">netif::ip6_autoconfig_enabled</a></div><div class="ttdeci">u8_t ip6_autoconfig_enabled</div><div class="ttdef"><b>Definition</b> netif.h:353</div></div>
-<div class="ttc" id="astructnetif_html_aee967965d999fc1a4c40a66709304e69"><div class="ttname"><a href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif::hwaddr</a></div><div class="ttdeci">u8_t hwaddr[6U]</div><div class="ttdef"><b>Definition</b> netif.h:341</div></div>
-<div class="ttc" id="astructnetif_html_afe1181561cb16241f3cb5ed01e567d42"><div class="ttname"><a href="structnetif.html#afe1181561cb16241f3cb5ed01e567d42">netif::hwaddr_len</a></div><div class="ttdeci">u8_t hwaddr_len</div><div class="ttdef"><b>Definition</b> netif.h:343</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
+<div class="ttc" id="astructnetif_html_a1c171db6097bbb6f09f63549a66e00ea"><div class="ttname"><a href="structnetif.html#a1c171db6097bbb6f09f63549a66e00ea">netif::flags</a></div><div class="ttdeci">u8_t flags</div><div class="ttdef"><b>Definition</b> netif.h:354</div></div>
+<div class="ttc" id="astructnetif_html_a32fca6ffd28bb9af3f891a378827a67e"><div class="ttname"><a href="structnetif.html#a32fca6ffd28bb9af3f891a378827a67e">netif::name</a></div><div class="ttdeci">char name[2]</div><div class="ttdef"><b>Definition</b> netif.h:356</div></div>
+<div class="ttc" id="astructnetif_html_a8e1dcfe65db487feecd244355f39215e"><div class="ttname"><a href="structnetif.html#a8e1dcfe65db487feecd244355f39215e">netif::output</a></div><div class="ttdeci">netif_output_fn output</div><div class="ttdef"><b>Definition</b> netif.h:303</div></div>
+<div class="ttc" id="astructnetif_html_a8fe4f1b7b0d710216287da9615164a5c"><div class="ttname"><a href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">netif::input</a></div><div class="ttdeci">netif_input_fn input</div><div class="ttdef"><b>Definition</b> netif.h:297</div></div>
+<div class="ttc" id="astructnetif_html_ac38383379cff22c402156fec71c19617"><div class="ttname"><a href="structnetif.html#ac38383379cff22c402156fec71c19617">netif::output_ip6</a></div><div class="ttdeci">netif_output_ip6_fn output_ip6</div><div class="ttdef"><b>Definition</b> netif.h:314</div></div>
+<div class="ttc" id="astructnetif_html_aca7d56b4e0f822b0ced2885f222b8d48"><div class="ttname"><a href="structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48">netif::mtu</a></div><div class="ttdeci">u16_t mtu</div><div class="ttdef"><b>Definition</b> netif.h:344</div></div>
+<div class="ttc" id="astructnetif_html_acaaac9b415a7be73eb8a287c8ed18a8d"><div class="ttname"><a href="structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d">netif::linkoutput</a></div><div class="ttdeci">netif_linkoutput_fn linkoutput</div><div class="ttdef"><b>Definition</b> netif.h:308</div></div>
+<div class="ttc" id="astructnetif_html_aee967965d999fc1a4c40a66709304e69"><div class="ttname"><a href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif::hwaddr</a></div><div class="ttdeci">u8_t hwaddr[6U]</div><div class="ttdef"><b>Definition</b> netif.h:350</div></div>
+<div class="ttc" id="astructnetif_html_afe1181561cb16241f3cb5ed01e567d42"><div class="ttname"><a href="structnetif.html#afe1181561cb16241f3cb5ed01e567d42">netif::hwaddr_len</a></div><div class="ttdeci">u8_t hwaddr_len</div><div class="ttdef"><b>Definition</b> netif.h:352</div></div>
 <div class="ttc" id="astructpbuf_html"><div class="ttname"><a href="structpbuf.html">pbuf</a></div><div class="ttdef"><b>Definition</b> pbuf.h:186</div></div>
 <div class="ttc" id="astructpbuf_html_a5259e7ec29bab9c0999b64f2e86b411f"><div class="ttname"><a href="structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f">pbuf::tot_len</a></div><div class="ttdeci">u16_t tot_len</div><div class="ttdef"><b>Definition</b> pbuf.h:200</div></div>
 <div class="ttc" id="astructpbuf_html_a8d32dc3e964369d4eec638fc37fbc460"><div class="ttname"><a href="structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460">pbuf::payload</a></div><div class="ttdeci">void * payload</div><div class="ttdef"><b>Definition</b> pbuf.h:191</div></div>
@@ -311,7 +308,7 @@
       </table>
 </div><div class="memdoc">
 <p>Process received ethernet frames. Using this function instead of directly calling ip_input and passing ARP frames through etharp in ethernetif_input, the ARP cache is protected from concurrent access.<br  />
-Don't call directly, pass to <a class="el" href="group__netif.html#ga22055759a25f5d6cea7e7deab0a07434">netif_add()</a> and call netif-&gt;input().</p>
+ Don't call directly, pass to <a class="el" href="group__netif.html#ga22055759a25f5d6cea7e7deab0a07434">netif_add()</a> and call netif-&gt;input().</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">p</td><td>the received packet, p-&gt;payload pointing to the ethernet header </td></tr>
diff --git a/doc/doxygen/output/html/group__lwip__opts.html b/doc/doxygen/output/html/group__lwip__opts.html
index 698fab7..b305c28 100644
--- a/doc/doxygen/output/html/group__lwip__opts.html
+++ b/doc/doxygen/output/html/group__lwip__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__acd.html b/doc/doxygen/output/html/group__lwip__opts__acd.html
new file mode 100644
index 0000000..01efc4e
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__acd.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ACD</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('group__lwip__opts__acd.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a>  </div>
+  <div class="headertitle"><div class="title">ACD<div class="ingroups"><a class="el" href="group__lwip.html">lwIP</a> &raquo; <a class="el" href="group__lwip__opts.html">Options (lwipopts.h)</a> &raquo; <a class="el" href="group__lwip__opts__ipv4.html">IPv4</a></div></div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ga6f1667866335cad3a7b1221bd0b274e7" id="r_ga6f1667866335cad3a7b1221bd0b274e7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga6f1667866335cad3a7b1221bd0b274e7">LWIP_ACD</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">LWIP_AUTOIP</a> || <a class="el" href="group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55">LWIP_DHCP_DOES_ACD_CHECK</a>)</td></tr>
+<tr class="separator:ga6f1667866335cad3a7b1221bd0b274e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga6f1667866335cad3a7b1221bd0b274e7" name="ga6f1667866335cad3a7b1221bd0b274e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6f1667866335cad3a7b1221bd0b274e7">&#9670;&#160;</a></span>LWIP_ACD</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_ACD&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">LWIP_AUTOIP</a> || <a class="el" href="group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55">LWIP_DHCP_DOES_ACD_CHECK</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_ACD==1: Enable ACD module. ACD module is needed when using AUTOIP. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__lwip__opts__acd.js b/doc/doxygen/output/html/group__lwip__opts__acd.js
new file mode 100644
index 0000000..a978d02
--- /dev/null
+++ b/doc/doxygen/output/html/group__lwip__opts__acd.js
@@ -0,0 +1,4 @@
+var group__lwip__opts__acd =
+[
+    [ "LWIP_ACD", "group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__lwip__opts__arp.html b/doc/doxygen/output/html/group__lwip__opts__arp.html
index d74b53f..33fd804 100644
--- a/doc/doxygen/output/html/group__lwip__opts__arp.html
+++ b/doc/doxygen/output/html/group__lwip__opts__arp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -274,7 +274,11 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>LWIP_ETHERNET==1: enable ethernet support even though ARP might be disabled </p>
+<p>LWIP_VLAN_PCP==1: Enable outgoing VLAN taggning of frames on a per-PCB basis for QoS purposes. With this feature enabled, each PCB has a new variable: "netif_hints.tci" (Tag Control Identifier). The TCI contains three fields: VID, CFI and PCP.</p><ul>
+<li>VID is the VLAN ID, which should be set to zero.</li>
+<li>The "CFI" bit is used to enable or disable VLAN tags for the PCB.</li>
+<li>PCP (Priority Code Point) is a 3 bit field used for Ethernet level QoS. See pcb_tci_*() functions to get/set/clear this. LWIP_ETHERNET==1: enable ethernet support even though ARP might be disabled </li>
+</ul>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__lwip__opts__autoip.html b/doc/doxygen/output/html/group__lwip__opts__autoip.html
index 74471e9..54059ac 100644
--- a/doc/doxygen/output/html/group__lwip__opts__autoip.html
+++ b/doc/doxygen/output/html/group__lwip__opts__autoip.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__callback.html b/doc/doxygen/output/html/group__lwip__opts__callback.html
index 63e35bf..a1f5aad 100644
--- a/doc/doxygen/output/html/group__lwip__opts__callback.html
+++ b/doc/doxygen/output/html/group__lwip__opts__callback.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__checksum.html b/doc/doxygen/output/html/group__lwip__opts__checksum.html
index 0a808f0..659e0b2 100644
--- a/doc/doxygen/output/html/group__lwip__opts__checksum.html
+++ b/doc/doxygen/output/html/group__lwip__opts__checksum.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__debug.html b/doc/doxygen/output/html/group__lwip__opts__debug.html
index e1c616f..93133c5 100644
--- a/doc/doxygen/output/html/group__lwip__opts__debug.html
+++ b/doc/doxygen/output/html/group__lwip__opts__debug.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__debugmsg.html b/doc/doxygen/output/html/group__lwip__opts__debugmsg.html
index b45ca87..361ef3c 100644
--- a/doc/doxygen/output/html/group__lwip__opts__debugmsg.html
+++ b/doc/doxygen/output/html/group__lwip__opts__debugmsg.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -175,6 +175,8 @@
 <tr class="separator:ga97927ceecabcdb5f41735bf372a05cee"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gafaee522e7f32d81022215e1805e303a5" id="r_gafaee522e7f32d81022215e1805e303a5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gafaee522e7f32d81022215e1805e303a5">AUTOIP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
 <tr class="separator:gafaee522e7f32d81022215e1805e303a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga87ff0c6077b9a36b05c3fc5b8fae8ad3" id="r_ga87ff0c6077b9a36b05c3fc5b8fae8ad3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga87ff0c6077b9a36b05c3fc5b8fae8ad3">ACD_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga87ff0c6077b9a36b05c3fc5b8fae8ad3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaba55da2352c99d813767913e5e36be1f" id="r_gaba55da2352c99d813767913e5e36be1f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaba55da2352c99d813767913e5e36be1f">DNS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
 <tr class="separator:gaba55da2352c99d813767913e5e36be1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gac2f9726756b78d4d7c425b0422a776ce" id="r_gac2f9726756b78d4d7c425b0422a776ce"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gac2f9726756b78d4d7c425b0422a776ce">IP6_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
@@ -184,6 +186,21 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ga87ff0c6077b9a36b05c3fc5b8fae8ad3" name="ga87ff0c6077b9a36b05c3fc5b8fae8ad3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga87ff0c6077b9a36b05c3fc5b8fae8ad3">&#9670;&#160;</a></span>ACD_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ACD_DEBUG&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ACD_DEBUG: Enable debugging in <a class="el" href="acd_8c.html">acd.c</a>. </p>
+
+</div>
+</div>
 <a id="ga671009550216f7dc03e67ba5751e3160" name="ga671009550216f7dc03e67ba5751e3160"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga671009550216f7dc03e67ba5751e3160">&#9670;&#160;</a></span>API_LIB_DEBUG</h2>
 
diff --git a/doc/doxygen/output/html/group__lwip__opts__debugmsg.js b/doc/doxygen/output/html/group__lwip__opts__debugmsg.js
index 705253f..61b5b59 100644
--- a/doc/doxygen/output/html/group__lwip__opts__debugmsg.js
+++ b/doc/doxygen/output/html/group__lwip__opts__debugmsg.js
@@ -1,6 +1,7 @@
 var group__lwip__opts__debugmsg =
 [
     [ "LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values", "group__debugging__levels.html", "group__debugging__levels" ],
+    [ "ACD_DEBUG", "group__lwip__opts__debugmsg.html#ga87ff0c6077b9a36b05c3fc5b8fae8ad3", null ],
     [ "API_LIB_DEBUG", "group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160", null ],
     [ "API_MSG_DEBUG", "group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697", null ],
     [ "AUTOIP_DEBUG", "group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5", null ],
diff --git a/doc/doxygen/output/html/group__lwip__opts__dhcp.html b/doc/doxygen/output/html/group__lwip__opts__dhcp.html
index f7acda5..66c03eb 100644
--- a/doc/doxygen/output/html/group__lwip__opts__dhcp.html
+++ b/doc/doxygen/output/html/group__lwip__opts__dhcp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -107,8 +107,8 @@
 Macros</h2></td></tr>
 <tr class="memitem:ga8a6ec62dc121064ac591b1fd8567bee9" id="r_ga8a6ec62dc121064ac591b1fd8567bee9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga8a6ec62dc121064ac591b1fd8567bee9"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gab2d91de7b2fce879b0a213682e1b0b69" id="r_gab2d91de7b2fce879b0a213682e1b0b69"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gab2d91de7b2fce879b0a213682e1b0b69">DHCP_DOES_ARP_CHECK</a>&#160;&#160;&#160;(<a class="el" href="#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a> &amp;&amp; <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a>)</td></tr>
-<tr class="separator:gab2d91de7b2fce879b0a213682e1b0b69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd0c82329fccb78342e3eef98233aa55" id="r_gadd0c82329fccb78342e3eef98233aa55"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gadd0c82329fccb78342e3eef98233aa55">LWIP_DHCP_DOES_ACD_CHECK</a>&#160;&#160;&#160;<a class="el" href="#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a></td></tr>
+<tr class="separator:gadd0c82329fccb78342e3eef98233aa55"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga3c2983cbd228011dd3e18cb417e7e423" id="r_ga3c2983cbd228011dd3e18cb417e7e423"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga3c2983cbd228011dd3e18cb417e7e423">LWIP_DHCP_BOOTP_FILE</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga3c2983cbd228011dd3e18cb417e7e423"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga2cc18315edcd5ffc083d1256f7d22a83" id="r_ga2cc18315edcd5ffc083d1256f7d22a83"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga2cc18315edcd5ffc083d1256f7d22a83">LWIP_DHCP_GET_NTP_SRV</a>&#160;&#160;&#160;0</td></tr>
@@ -117,24 +117,11 @@
 <tr class="separator:ga9d014e3f7dc9e1e7c7decd8652ba65e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga60ccc20fbb08be24b5d5f599dd47a6a6" id="r_ga60ccc20fbb08be24b5d5f599dd47a6a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga60ccc20fbb08be24b5d5f599dd47a6a6">LWIP_DHCP_MAX_DNS_SERVERS</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292">DNS_MAX_SERVERS</a></td></tr>
 <tr class="separator:ga60ccc20fbb08be24b5d5f599dd47a6a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad6b030f8e828666953661578f936e605" id="r_gad6b030f8e828666953661578f936e605"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gad6b030f8e828666953661578f936e605">LWIP_DHCP_DISCOVER_ADD_HOSTNAME</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gad6b030f8e828666953661578f936e605"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <h2 class="groupheader">Macro Definition Documentation</h2>
-<a id="gab2d91de7b2fce879b0a213682e1b0b69" name="gab2d91de7b2fce879b0a213682e1b0b69"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#gab2d91de7b2fce879b0a213682e1b0b69">&#9670;&#160;</a></span>DHCP_DOES_ARP_CHECK</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">#define DHCP_DOES_ARP_CHECK&#160;&#160;&#160;(<a class="el" href="#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a> &amp;&amp; <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a>)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. </p>
-
-</div>
-</div>
 <a id="ga8a6ec62dc121064ac591b1fd8567bee9" name="ga8a6ec62dc121064ac591b1fd8567bee9"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga8a6ec62dc121064ac591b1fd8567bee9">&#9670;&#160;</a></span>LWIP_DHCP</h2>
 
@@ -165,6 +152,36 @@
 
 </div>
 </div>
+<a id="gad6b030f8e828666953661578f936e605" name="gad6b030f8e828666953661578f936e605"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gad6b030f8e828666953661578f936e605">&#9670;&#160;</a></span>LWIP_DHCP_DISCOVER_ADD_HOSTNAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP_DISCOVER_ADD_HOSTNAME&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP_DISCOVER_ADD_HOSTNAME: Set to 1 to include hostname opt in discover packets. If the hostname is not set in the DISCOVER packet, then some servers might issue an OFFER with hostname configured and consequently reject the REQUEST with any other hostname. </p>
+
+</div>
+</div>
+<a id="gadd0c82329fccb78342e3eef98233aa55" name="gadd0c82329fccb78342e3eef98233aa55"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gadd0c82329fccb78342e3eef98233aa55">&#9670;&#160;</a></span>LWIP_DHCP_DOES_ACD_CHECK</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_DHCP_DOES_ACD_CHECK&#160;&#160;&#160;<a class="el" href="#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_DHCP_DOES_ACD_CHECK==1: Perform address conflict detection on the dhcp address. </p>
+
+</div>
+</div>
 <a id="ga2cc18315edcd5ffc083d1256f7d22a83" name="ga2cc18315edcd5ffc083d1256f7d22a83"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga2cc18315edcd5ffc083d1256f7d22a83">&#9670;&#160;</a></span>LWIP_DHCP_GET_NTP_SRV</h2>
 
diff --git a/doc/doxygen/output/html/group__lwip__opts__dhcp.js b/doc/doxygen/output/html/group__lwip__opts__dhcp.js
index 267451d..648e9c0 100644
--- a/doc/doxygen/output/html/group__lwip__opts__dhcp.js
+++ b/doc/doxygen/output/html/group__lwip__opts__dhcp.js
@@ -1,8 +1,9 @@
 var group__lwip__opts__dhcp =
 [
-    [ "DHCP_DOES_ARP_CHECK", "group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69", null ],
     [ "LWIP_DHCP", "group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9", null ],
     [ "LWIP_DHCP_BOOTP_FILE", "group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423", null ],
+    [ "LWIP_DHCP_DISCOVER_ADD_HOSTNAME", "group__lwip__opts__dhcp.html#gad6b030f8e828666953661578f936e605", null ],
+    [ "LWIP_DHCP_DOES_ACD_CHECK", "group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55", null ],
     [ "LWIP_DHCP_GET_NTP_SRV", "group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83", null ],
     [ "LWIP_DHCP_MAX_DNS_SERVERS", "group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6", null ],
     [ "LWIP_DHCP_MAX_NTP_SERVERS", "group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2", null ]
diff --git a/doc/doxygen/output/html/group__lwip__opts__dhcpv6.html b/doc/doxygen/output/html/group__lwip__opts__dhcpv6.html
index 0a1eab6..6d89a4b 100644
--- a/doc/doxygen/output/html/group__lwip__opts__dhcpv6.html
+++ b/doc/doxygen/output/html/group__lwip__opts__dhcpv6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__dns.html b/doc/doxygen/output/html/group__lwip__opts__dns.html
index 3b6d6e0..44737e2 100644
--- a/doc/doxygen/output/html/group__lwip__opts__dns.html
+++ b/doc/doxygen/output/html/group__lwip__opts__dns.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -155,7 +155,7 @@
       </table>
 </div><div class="memdoc">
 <p>DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, you have to define an initializer: #define DNS_LOCAL_HOSTLIST_INIT {DNS_LOCAL_HOSTLIST_ELEM("host_ip4", IPADDR4_INIT_BYTES(1,2,3,4)), \ DNS_LOCAL_HOSTLIST_ELEM("host_ip6", IPADDR6_INIT_HOST(123, 234, 345, 456)}</p>
-<p>Instead, you can also use an external function: #define DNS_LOOKUP_LOCAL_EXTERN(x) extern err_t my_lookup_function(const char *name, ip_addr_t *addr, u8_t dns_addrtype) that looks up the IP address and returns ERR_OK if found (LWIP_DNS_ADDRTYPE_xxx is passed in dns_addrtype). </p>
+<p>Instead, you can also use an external function: #define DNS_LOOKUP_LOCAL_EXTERN(name, namelen, addr, dns_addrtype) my_lookup_function(name, namelen, addr, dns_addrtype) with function signature: extern err_t my_lookup_function(const char *name, size_t namelen, ip_addr_t *addr, u8_t dns_addrtype) that looks up the IP address and returns ERR_OK if found (LWIP_DNS_ADDRTYPE_xxx is passed in dns_addrtype). </p>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__lwip__opts__hooks.html b/doc/doxygen/output/html/group__lwip__opts__hooks.html
index 4bab2d9..f848a1b 100644
--- a/doc/doxygen/output/html/group__lwip__opts__hooks.html
+++ b/doc/doxygen/output/html/group__lwip__opts__hooks.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -201,7 +201,7 @@
 <p><a class="el" href="#ga4068b3313e32f711ba016215fc2c886a">LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len)</a>: Called from various dhcp6 functions when sending a DHCP6 message. This hook is called just before the DHCP6 message is sent, so the options are at the end of a DHCP6 message. Signature:</p><div class="fragment"><div class="line"><span class="keywordtype">void</span> my_hook(<span class="keyword">struct</span> <a class="code hl_struct" href="structnetif.html">netif</a> *<a class="code hl_struct" href="structnetif.html">netif</a>, <span class="keyword">struct</span> dhcp6 *dhcp, u8_t state, <span class="keyword">struct</span> <a class="code hl_struct" href="structdhcp6__msg.html">dhcp6_msg</a> *msg,</div>
 <div class="line">             u8_t msg_type, u16_t *options_len_ptr);</div>
 <div class="ttc" id="astructdhcp6__msg_html"><div class="ttname"><a href="structdhcp6__msg.html">dhcp6_msg</a></div><div class="ttdef"><b>Definition</b> dhcp6.h:59</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p> Arguments:</p><ul>
 <li>netif: struct netif that the packet will be sent through</li>
 <li>dhcp6: struct dhcp6 on that netif</li>
@@ -804,7 +804,7 @@
 <li>optlen: tcp option length</li>
 <li>opt1len: tcp option length 1st part</li>
 <li>opt2: if this is != NULL, tcp options are split among 2 pbufs. In that case, options start at right after the tcp header ('(u8_t*)(hdr + 1)') for the first 'opt1len' bytes and the rest starts at 'opt2'. opt2len can be simply calculated: 'opt2len = optlen - opt1len;'</li>
-<li>p: input packet, p-&gt;payload points to application data (that's why tcp hdr and options are passed in seperately) Return value:</li>
+<li>p: input packet, p-&gt;payload points to application data (that's why tcp hdr and options are passed in separately) Return value:</li>
 <li>ERR_OK: continue input of this packet as normal</li>
 <li>!= ERR_OK: drop this packet for input (don't continue input processing)</li>
 </ul>
@@ -841,15 +841,15 @@
       </table>
 </div><div class="memdoc">
 <p>LWIP_HOOK_TCP_ISN: Hook for generation of the Initial Sequence Number (ISN) for a new TCP connection. The default lwIP ISN generation algorithm is very basic and may allow for TCP spoofing attacks. This hook provides the means to implement the standardized ISN generation algorithm from RFC 6528 (see contrib/adons/tcp_isn), or any other desired algorithm as a replacement. Called from <a class="el" href="group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect()</a> and tcp_listen_input() when an ISN is needed for a new TCP connection, if TCP support (<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a>) is enabled.<br  />
-Signature:</p><div class="fragment"><div class="line">u32_t my_hook_tcp_isn(<span class="keyword">const</span> <a class="code hl_struct" href="structip__addr.html">ip_addr_t</a>* local_ip, u16_t local_port, <span class="keyword">const</span> <a class="code hl_struct" href="structip__addr.html">ip_addr_t</a>* remote_ip, u16_t remote_port);</div>
+ Signature:</p><div class="fragment"><div class="line">u32_t my_hook_tcp_isn(<span class="keyword">const</span> <a class="code hl_struct" href="structip__addr.html">ip_addr_t</a>* local_ip, u16_t local_port, <span class="keyword">const</span> <a class="code hl_struct" href="structip__addr.html">ip_addr_t</a>* remote_ip, u16_t remote_port);</div>
 </div><!-- fragment --><ul>
 <li>it may be necessary to use "struct ip_addr" (<a class="el" href="structip4__addr.html">ip4_addr</a>, <a class="el" href="structip6__addr.html">ip6_addr</a>) instead of "ip_addr_t" in function declarations<br  />
-Arguments:</li>
+ Arguments:</li>
 <li>local_ip: pointer to the local IP address of the connection</li>
 <li>local_port: local port number of the connection (host-byte order)</li>
 <li>remote_ip: pointer to the remote IP address of the connection</li>
 <li>remote_port: remote port number of the connection (host-byte order)<br  />
-Return value:</li>
+ Return value:</li>
 <li>the 32-bit Initial Sequence Number to use for the new TCP connection. </li>
 </ul>
 
@@ -1022,7 +1022,7 @@
       </table>
 </div><div class="memdoc">
 <p>LWIP_HOOK_VLAN_SET: Hook can be used to set prio_vid field of vlan_hdr. If you need to store data on per-netif basis to implement this callback, see <a class="el" href="group__netif__cd.html">Client data handling</a>. Called from <a class="el" href="group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778">ethernet_output()</a> if VLAN support (<a class="el" href="group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90">ETHARP_SUPPORT_VLAN</a>) is enabled.<br  />
-Signature:</p><div class="fragment"><div class="line">s32_t my_hook_vlan_set(<span class="keyword">struct</span> <a class="code hl_struct" href="structnetif.html">netif</a>* <a class="code hl_struct" href="structnetif.html">netif</a>, <span class="keyword">struct</span> <a class="code hl_struct" href="structpbuf.html">pbuf</a>* <a class="code hl_struct" href="structpbuf.html">pbuf</a>, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code hl_struct" href="structeth__addr.html">eth_addr</a>* src, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code hl_struct" href="structeth__addr.html">eth_addr</a>* dst, u16_t eth_type);\n</div>
+ Signature:</p><div class="fragment"><div class="line">s32_t my_hook_vlan_set(<span class="keyword">struct</span> <a class="code hl_struct" href="structnetif.html">netif</a>* <a class="code hl_struct" href="structnetif.html">netif</a>, <span class="keyword">struct</span> <a class="code hl_struct" href="structpbuf.html">pbuf</a>* <a class="code hl_struct" href="structpbuf.html">pbuf</a>, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code hl_struct" href="structeth__addr.html">eth_addr</a>* src, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code hl_struct" href="structeth__addr.html">eth_addr</a>* dst, u16_t eth_type);</div>
 <div class="ttc" id="astructeth__addr_html"><div class="ttname"><a href="structeth__addr.html">eth_addr</a></div><div class="ttdef"><b>Definition</b> ethernet.h:60</div></div>
 </div><!-- fragment --><p> Arguments:</p><ul>
 <li>netif: struct netif that the packet will be sent through</li>
diff --git a/doc/doxygen/output/html/group__lwip__opts__icmp.html b/doc/doxygen/output/html/group__lwip__opts__icmp.html
index 239bcc7..cb098ed 100644
--- a/doc/doxygen/output/html/group__lwip__opts__icmp.html
+++ b/doc/doxygen/output/html/group__lwip__opts__icmp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__icmp6.html b/doc/doxygen/output/html/group__lwip__opts__icmp6.html
index ac120e0..33325d4 100644
--- a/doc/doxygen/output/html/group__lwip__opts__icmp6.html
+++ b/doc/doxygen/output/html/group__lwip__opts__icmp6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__igmp.html b/doc/doxygen/output/html/group__lwip__opts__igmp.html
index f7c4fb6..3a5f962 100644
--- a/doc/doxygen/output/html/group__lwip__opts__igmp.html
+++ b/doc/doxygen/output/html/group__lwip__opts__igmp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__infrastructure.html b/doc/doxygen/output/html/group__lwip__opts__infrastructure.html
index aa5c51b..760334d 100644
--- a/doc/doxygen/output/html/group__lwip__opts__infrastructure.html
+++ b/doc/doxygen/output/html/group__lwip__opts__infrastructure.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__ipv4.html b/doc/doxygen/output/html/group__lwip__opts__ipv4.html
index 15bea3a..0945a55 100644
--- a/doc/doxygen/output/html/group__lwip__opts__ipv4.html
+++ b/doc/doxygen/output/html/group__lwip__opts__ipv4.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -114,6 +114,8 @@
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__autoip.html">AUTOIP</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__acd.html">ACD</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__igmp.html">IGMP</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
diff --git a/doc/doxygen/output/html/group__lwip__opts__ipv4.js b/doc/doxygen/output/html/group__lwip__opts__ipv4.js
index a269c2e..586d745 100644
--- a/doc/doxygen/output/html/group__lwip__opts__ipv4.js
+++ b/doc/doxygen/output/html/group__lwip__opts__ipv4.js
@@ -4,6 +4,7 @@
     [ "ICMP", "group__lwip__opts__icmp.html", "group__lwip__opts__icmp" ],
     [ "DHCP", "group__lwip__opts__dhcp.html", "group__lwip__opts__dhcp" ],
     [ "AUTOIP", "group__lwip__opts__autoip.html", "group__lwip__opts__autoip" ],
+    [ "ACD", "group__lwip__opts__acd.html", "group__lwip__opts__acd" ],
     [ "IGMP", "group__lwip__opts__igmp.html", "group__lwip__opts__igmp" ],
     [ "IP_DEFAULT_TTL", "group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411", null ],
     [ "IP_FORWARD", "group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59", null ],
diff --git a/doc/doxygen/output/html/group__lwip__opts__ipv6.html b/doc/doxygen/output/html/group__lwip__opts__ipv6.html
index d455021..7c89118 100644
--- a/doc/doxygen/output/html/group__lwip__opts__ipv6.html
+++ b/doc/doxygen/output/html/group__lwip__opts__ipv6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__lock.html b/doc/doxygen/output/html/group__lwip__opts__lock.html
index 9a307f5..49b2734 100644
--- a/doc/doxygen/output/html/group__lwip__opts__lock.html
+++ b/doc/doxygen/output/html/group__lwip__opts__lock.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__loop.html b/doc/doxygen/output/html/group__lwip__opts__loop.html
index 5fd305b..8609a3f 100644
--- a/doc/doxygen/output/html/group__lwip__opts__loop.html
+++ b/doc/doxygen/output/html/group__lwip__opts__loop.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__mem.html b/doc/doxygen/output/html/group__lwip__opts__mem.html
index ec54eb3..748b9bc 100644
--- a/doc/doxygen/output/html/group__lwip__opts__mem.html
+++ b/doc/doxygen/output/html/group__lwip__opts__mem.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__memcpy.html b/doc/doxygen/output/html/group__lwip__opts__memcpy.html
index f13c9f5..0460b46 100644
--- a/doc/doxygen/output/html/group__lwip__opts__memcpy.html
+++ b/doc/doxygen/output/html/group__lwip__opts__memcpy.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__memp.html b/doc/doxygen/output/html/group__lwip__opts__memp.html
index 74268d9..0920176 100644
--- a/doc/doxygen/output/html/group__lwip__opts__memp.html
+++ b/doc/doxygen/output/html/group__lwip__opts__memp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -127,7 +127,7 @@
 <tr class="separator:ga087b00ea20a7edebcad33a1a1353a5d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gab648ff95d8ffa4216b95f82a568a5d9a" id="r_gab648ff95d8ffa4216b95f82a568a5d9a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gab648ff95d8ffa4216b95f82a568a5d9a">MEMP_NUM_IGMP_GROUP</a>&#160;&#160;&#160;8</td></tr>
 <tr class="separator:gab648ff95d8ffa4216b95f82a568a5d9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga87a05debb46ff82093d0e6dc1aad8804" id="r_ga87a05debb46ff82093d0e6dc1aad8804"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga87a05debb46ff82093d0e6dc1aad8804">LWIP_NUM_SYS_TIMEOUT_INTERNAL</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a> + <a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a> + <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a> + (2*<a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a>) + <a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">LWIP_AUTOIP</a> + <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a> + <a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">LWIP_DNS</a> + PPP_NUM_TIMEOUTS + (<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> * (1 + <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a> + <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a>)))</td></tr>
+<tr class="memitem:ga87a05debb46ff82093d0e6dc1aad8804" id="r_ga87a05debb46ff82093d0e6dc1aad8804"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga87a05debb46ff82093d0e6dc1aad8804">LWIP_NUM_SYS_TIMEOUT_INTERNAL</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a> + <a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a> + <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a> + (2*<a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a>) + <a class="el" href="group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7">LWIP_ACD</a> + <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a> + <a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">LWIP_DNS</a> + PPP_NUM_TIMEOUTS + (<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> * (1 + <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a> + <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a> + <a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">LWIP_IPV6_DHCP6</a>)))</td></tr>
 <tr class="separator:ga87a05debb46ff82093d0e6dc1aad8804"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga4afbdca581a58d57bc7a81118a95327e" id="r_ga4afbdca581a58d57bc7a81118a95327e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga4afbdca581a58d57bc7a81118a95327e">MEMP_NUM_SYS_TIMEOUT</a>&#160;&#160;&#160;<a class="el" href="#ga87a05debb46ff82093d0e6dc1aad8804">LWIP_NUM_SYS_TIMEOUT_INTERNAL</a></td></tr>
 <tr class="separator:ga4afbdca581a58d57bc7a81118a95327e"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -165,7 +165,7 @@
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">#define LWIP_NUM_SYS_TIMEOUT_INTERNAL&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a> + <a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a> + <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a> + (2*<a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a>) + <a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">LWIP_AUTOIP</a> + <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a> + <a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">LWIP_DNS</a> + PPP_NUM_TIMEOUTS + (<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> * (1 + <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a> + <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a>)))</td>
+          <td class="memname">#define LWIP_NUM_SYS_TIMEOUT_INTERNAL&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a> + <a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a> + <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a> + (2*<a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a>) + <a class="el" href="group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7">LWIP_ACD</a> + <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a> + <a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">LWIP_DNS</a> + PPP_NUM_TIMEOUTS + (<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> * (1 + <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a> + <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a> + <a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">LWIP_IPV6_DHCP6</a>)))</td>
         </tr>
       </table>
 </div><div class="memdoc">
diff --git a/doc/doxygen/output/html/group__lwip__opts__mib2.html b/doc/doxygen/output/html/group__lwip__opts__mib2.html
index 24a8aca..a7b6bf8 100644
--- a/doc/doxygen/output/html/group__lwip__opts__mib2.html
+++ b/doc/doxygen/output/html/group__lwip__opts__mib2.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__mld6.html b/doc/doxygen/output/html/group__lwip__opts__mld6.html
index 1945608..11e1b18 100644
--- a/doc/doxygen/output/html/group__lwip__opts__mld6.html
+++ b/doc/doxygen/output/html/group__lwip__opts__mld6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__multicast.html b/doc/doxygen/output/html/group__lwip__opts__multicast.html
index 337e1e7..3a95eaf 100644
--- a/doc/doxygen/output/html/group__lwip__opts__multicast.html
+++ b/doc/doxygen/output/html/group__lwip__opts__multicast.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__nd6.html b/doc/doxygen/output/html/group__lwip__opts__nd6.html
index 1aa0045..d6bb03a 100644
--- a/doc/doxygen/output/html/group__lwip__opts__nd6.html
+++ b/doc/doxygen/output/html/group__lwip__opts__nd6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__netconn.html b/doc/doxygen/output/html/group__lwip__opts__netconn.html
index bdfcf1f..7648a74 100644
--- a/doc/doxygen/output/html/group__lwip__opts__netconn.html
+++ b/doc/doxygen/output/html/group__lwip__opts__netconn.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__netif.html b/doc/doxygen/output/html/group__lwip__opts__netif.html
index 5d07367..dae7925 100644
--- a/doc/doxygen/output/html/group__lwip__opts__netif.html
+++ b/doc/doxygen/output/html/group__lwip__opts__netif.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__nosys.html b/doc/doxygen/output/html/group__lwip__opts__nosys.html
index 1d89a1f..0adb8f3 100644
--- a/doc/doxygen/output/html/group__lwip__opts__nosys.html
+++ b/doc/doxygen/output/html/group__lwip__opts__nosys.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__pbuf.html b/doc/doxygen/output/html/group__lwip__opts__pbuf.html
index 3cd1aca..fcedfdc 100644
--- a/doc/doxygen/output/html/group__lwip__opts__pbuf.html
+++ b/doc/doxygen/output/html/group__lwip__opts__pbuf.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__perf.html b/doc/doxygen/output/html/group__lwip__opts__perf.html
index e898841..427eba3 100644
--- a/doc/doxygen/output/html/group__lwip__opts__perf.html
+++ b/doc/doxygen/output/html/group__lwip__opts__perf.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__raw.html b/doc/doxygen/output/html/group__lwip__opts__raw.html
index ea1d68e..6fb5a1b 100644
--- a/doc/doxygen/output/html/group__lwip__opts__raw.html
+++ b/doc/doxygen/output/html/group__lwip__opts__raw.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__socket.html b/doc/doxygen/output/html/group__lwip__opts__socket.html
index dcae622..70c0e92 100644
--- a/doc/doxygen/output/html/group__lwip__opts__socket.html
+++ b/doc/doxygen/output/html/group__lwip__opts__socket.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -113,6 +113,8 @@
 <tr class="separator:ga484c38ab08f60d5b3335d23d31f9a402"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gad0197c845fbb44c920b272f0fef3b57e" id="r_gad0197c845fbb44c920b272f0fef3b57e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gad0197c845fbb44c920b272f0fef3b57e">LWIP_SOCKET_OFFSET</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gad0197c845fbb44c920b272f0fef3b57e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga524c013ecdd8a45a2949f2a433469e82" id="r_ga524c013ecdd8a45a2949f2a433469e82"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga524c013ecdd8a45a2949f2a433469e82">LWIP_SOCKET_EXTERNAL_HEADERS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga524c013ecdd8a45a2949f2a433469e82"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga8b9369ab260f032686a81c77c5b4db77" id="r_ga8b9369ab260f032686a81c77c5b4db77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga8b9369ab260f032686a81c77c5b4db77">LWIP_TCP_KEEPALIVE</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga8b9369ab260f032686a81c77c5b4db77"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga1162cb685f202d9b21c11344b8209a58" id="r_ga1162cb685f202d9b21c11344b8209a58"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga1162cb685f202d9b21c11344b8209a58">LWIP_SO_SNDTIMEO</a>&#160;&#160;&#160;0</td></tr>
@@ -277,6 +279,21 @@
 
 </div>
 </div>
+<a id="ga524c013ecdd8a45a2949f2a433469e82" name="ga524c013ecdd8a45a2949f2a433469e82"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga524c013ecdd8a45a2949f2a433469e82">&#9670;&#160;</a></span>LWIP_SOCKET_EXTERNAL_HEADERS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_SOCKET_EXTERNAL_HEADERS&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_SOCKET_EXTERNAL_HEADERS==1: Use external headers instead of <a class="el" href="sockets_8h.html">sockets.h</a> and inet.h. In this case, user must provide its own headers by setting the values for LWIP_SOCKET_EXTERNAL_HEADER_SOCKETS_H and LWIP_SOCKET_EXTERNAL_HEADER_INET_H to appropriate include file names and the whole content of the default <a class="el" href="sockets_8h.html">sockets.h</a> and inet.h is skipped. </p>
+
+</div>
+</div>
 <a id="gad0197c845fbb44c920b272f0fef3b57e" name="gad0197c845fbb44c920b272f0fef3b57e"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gad0197c845fbb44c920b272f0fef3b57e">&#9670;&#160;</a></span>LWIP_SOCKET_OFFSET</h2>
 
diff --git a/doc/doxygen/output/html/group__lwip__opts__socket.js b/doc/doxygen/output/html/group__lwip__opts__socket.js
index 42d6dbb..caf2a5f 100644
--- a/doc/doxygen/output/html/group__lwip__opts__socket.js
+++ b/doc/doxygen/output/html/group__lwip__opts__socket.js
@@ -9,6 +9,7 @@
     [ "LWIP_SO_SNDRCVTIMEO_NONSTANDARD", "group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942", null ],
     [ "LWIP_SO_SNDTIMEO", "group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58", null ],
     [ "LWIP_SOCKET", "group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f", null ],
+    [ "LWIP_SOCKET_EXTERNAL_HEADERS", "group__lwip__opts__socket.html#ga524c013ecdd8a45a2949f2a433469e82", null ],
     [ "LWIP_SOCKET_OFFSET", "group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e", null ],
     [ "LWIP_SOCKET_POLL", "group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200", null ],
     [ "LWIP_SOCKET_SELECT", "group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb", null ],
diff --git a/doc/doxygen/output/html/group__lwip__opts__stats.html b/doc/doxygen/output/html/group__lwip__opts__stats.html
index 8539c26..f2b9157 100644
--- a/doc/doxygen/output/html/group__lwip__opts__stats.html
+++ b/doc/doxygen/output/html/group__lwip__opts__stats.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__tcp.html b/doc/doxygen/output/html/group__lwip__opts__tcp.html
index e4d3641..537a953 100644
--- a/doc/doxygen/output/html/group__lwip__opts__tcp.html
+++ b/doc/doxygen/output/html/group__lwip__opts__tcp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -125,6 +125,8 @@
 <tr class="separator:gaf1ab7bb27860aa3677c387a2f3ba317b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gac04b84d32251ac558f0c3a8af85ba3a5" id="r_gac04b84d32251ac558f0c3a8af85ba3a5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gac04b84d32251ac558f0c3a8af85ba3a5">TCP_CALCULATE_EFF_SEND_MSS</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:gac04b84d32251ac558f0c3a8af85ba3a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade23373901980c6e7a43cef813386ebe" id="r_gade23373901980c6e7a43cef813386ebe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gade23373901980c6e7a43cef813386ebe">LWIP_TCP_RTO_TIME</a>&#160;&#160;&#160;3000</td></tr>
+<tr class="separator:gade23373901980c6e7a43cef813386ebe"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga871d111968d8c6c7880ff36b93c5c4dd" id="r_ga871d111968d8c6c7880ff36b93c5c4dd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>&#160;&#160;&#160;(2 * <a class="el" href="#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>)</td></tr>
 <tr class="separator:ga871d111968d8c6c7880ff36b93c5c4dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga9beaa47832ead4180981bfbf71074904" id="r_ga9beaa47832ead4180981bfbf71074904"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga9beaa47832ead4180981bfbf71074904">TCP_SND_QUEUELEN</a>&#160;&#160;&#160;((4 * (<a class="el" href="#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>) + (<a class="el" href="#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a> - 1))/(<a class="el" href="#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>))</td></tr>
@@ -252,6 +254,21 @@
 
 </div>
 </div>
+<a id="gade23373901980c6e7a43cef813386ebe" name="gade23373901980c6e7a43cef813386ebe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gade23373901980c6e7a43cef813386ebe">&#9670;&#160;</a></span>LWIP_TCP_RTO_TIME</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_TCP_RTO_TIME&#160;&#160;&#160;3000</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_TCP_RTO_TIME: Initial TCP retransmission timeout (ms). This defaults to 3 seconds as traditionally defined in the TCP protocol. For improving timely recovery on faster networks, this value could be lowered down to 1 second (RFC 6298) </p>
+
+</div>
+</div>
 <a id="gaf1b6a015d29fea67b906c276e1e8314f" name="gaf1b6a015d29fea67b906c276e1e8314f"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gaf1b6a015d29fea67b906c276e1e8314f">&#9670;&#160;</a></span>LWIP_TCP_SACK_OUT</h2>
 
diff --git a/doc/doxygen/output/html/group__lwip__opts__tcp.js b/doc/doxygen/output/html/group__lwip__opts__tcp.js
index 873dab0..b4dd204 100644
--- a/doc/doxygen/output/html/group__lwip__opts__tcp.js
+++ b/doc/doxygen/output/html/group__lwip__opts__tcp.js
@@ -6,6 +6,7 @@
     [ "LWIP_TCP", "group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9", null ],
     [ "LWIP_TCP_MAX_SACK_NUM", "group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc", null ],
     [ "LWIP_TCP_PCB_NUM_EXT_ARGS", "group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223", null ],
+    [ "LWIP_TCP_RTO_TIME", "group__lwip__opts__tcp.html#gade23373901980c6e7a43cef813386ebe", null ],
     [ "LWIP_TCP_SACK_OUT", "group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f", null ],
     [ "LWIP_TCP_TIMESTAMPS", "group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd", null ],
     [ "LWIP_WND_SCALE", "group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530", null ],
diff --git a/doc/doxygen/output/html/group__lwip__opts__thread.html b/doc/doxygen/output/html/group__lwip__opts__thread.html
index 6f9e04c..00d27e3 100644
--- a/doc/doxygen/output/html/group__lwip__opts__thread.html
+++ b/doc/doxygen/output/html/group__lwip__opts__thread.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.html b/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.html
index 8e33d70..e01fc0a 100644
--- a/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.html
+++ b/doc/doxygen/output/html/group__lwip__opts__threadsafe__apis.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__timers.html b/doc/doxygen/output/html/group__lwip__opts__timers.html
index d92472a..e85abb2 100644
--- a/doc/doxygen/output/html/group__lwip__opts__timers.html
+++ b/doc/doxygen/output/html/group__lwip__opts__timers.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__opts__udp.html b/doc/doxygen/output/html/group__lwip__opts__udp.html
index 0a5259f..954de74 100644
--- a/doc/doxygen/output/html/group__lwip__opts__udp.html
+++ b/doc/doxygen/output/html/group__lwip__opts__udp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__lwip__os.html b/doc/doxygen/output/html/group__lwip__os.html
index 898c890..72334a1 100644
--- a/doc/doxygen/output/html/group__lwip__os.html
+++ b/doc/doxygen/output/html/group__lwip__os.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -129,8 +129,8 @@
 <tr class="separator:ga1f3a88b8df6ba3b9ed1c00e0a305e3db"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<p>Use this mode if you run an OS on your system. It is recommended to use an RTOS that correctly handles priority inversion and to use LWIP_TCPIP_CORE_LOCKING.<br  />
- Porting: implement all functions in sys_layer.<br  />
+<p>Use this mode if you run an OS on your system. It is recommended to use an RTOS that correctly handles priority inversion and to use <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a>.<br  />
+ Porting: implement all functions in <a class="el" href="group__sys__layer.html">Porting (system abstraction layer)</a>.<br  />
  You can use <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a> together with <a class="el" href="#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback</a>, and all <a class="el" href="group__sequential__api.html">Sequential-style APIs</a>. </p>
 <h2 class="groupheader">Macro Definition Documentation</h2>
 <a id="gacd0a865623921ada2dd08962eb82c9df" name="gacd0a865623921ada2dd08962eb82c9df"></a>
@@ -157,9 +157,9 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">((block != 0)? <a class="code hl_function" href="#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback</a>(function, ctx) : <a class="code hl_function" href="#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a>(function, ctx))</div>
-<div class="ttc" id="agroup__lwip__os_html_gaab838fe3417ab3a1f61f0728009a0c2a"><div class="ttname"><a href="#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback</a></div><div class="ttdeci">err_t tcpip_callback(tcpip_callback_fn function, void *ctx)</div><div class="ttdef"><b>Definition</b> tcpip.c:309</div></div>
-<div class="ttc" id="agroup__lwip__os_html_gaeb7b3c7414c76ad8dde14d2fba6cb020"><div class="ttname"><a href="#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a></div><div class="ttdeci">err_t tcpip_try_callback(tcpip_callback_fn function, void *ctx)</div><div class="ttdef"><b>Definition</b> tcpip.c:345</div></div>
-</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000005">Deprecated</a></b></dt><dd>use <a class="el" href="#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback()</a> or <a class="el" href="#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback()</a> instead </dd></dl>
+<div class="ttc" id="agroup__lwip__os_html_gaab838fe3417ab3a1f61f0728009a0c2a"><div class="ttname"><a href="#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback</a></div><div class="ttdeci">err_t tcpip_callback(tcpip_callback_fn function, void *ctx)</div><div class="ttdef"><b>Definition</b> tcpip.c:314</div></div>
+<div class="ttc" id="agroup__lwip__os_html_gaeb7b3c7414c76ad8dde14d2fba6cb020"><div class="ttname"><a href="#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback</a></div><div class="ttdeci">err_t tcpip_try_callback(tcpip_callback_fn function, void *ctx)</div><div class="ttdef"><b>Definition</b> tcpip.c:350</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000016">Deprecated</a></b></dt><dd>use <a class="el" href="#gaeb7b3c7414c76ad8dde14d2fba6cb020">tcpip_try_callback()</a> or <a class="el" href="#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback()</a> instead </dd></dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__lwip__version.html b/doc/doxygen/output/html/group__lwip__version.html
index ac0d8c6..001dbb5 100644
--- a/doc/doxygen/output/html/group__lwip__version.html
+++ b/doc/doxygen/output/html/group__lwip__version.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -107,9 +107,9 @@
 Macros</h2></td></tr>
 <tr class="memitem:ga4308c06ef36496e00c798d96d7d03246" id="r_ga4308c06ef36496e00c798d96d7d03246"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga4308c06ef36496e00c798d96d7d03246">LWIP_VERSION_MAJOR</a>&#160;&#160;&#160;2</td></tr>
 <tr class="separator:ga4308c06ef36496e00c798d96d7d03246"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga1e596388c15ba81e753c5633fad1c034" id="r_ga1e596388c15ba81e753c5633fad1c034"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga1e596388c15ba81e753c5633fad1c034">LWIP_VERSION_MINOR</a>&#160;&#160;&#160;1</td></tr>
+<tr class="memitem:ga1e596388c15ba81e753c5633fad1c034" id="r_ga1e596388c15ba81e753c5633fad1c034"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga1e596388c15ba81e753c5633fad1c034">LWIP_VERSION_MINOR</a>&#160;&#160;&#160;2</td></tr>
 <tr class="separator:ga1e596388c15ba81e753c5633fad1c034"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga0a57983df1b199cf39a2e6a2d90e3d50" id="r_ga0a57983df1b199cf39a2e6a2d90e3d50"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga0a57983df1b199cf39a2e6a2d90e3d50">LWIP_VERSION_REVISION</a>&#160;&#160;&#160;3</td></tr>
+<tr class="memitem:ga0a57983df1b199cf39a2e6a2d90e3d50" id="r_ga0a57983df1b199cf39a2e6a2d90e3d50"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga0a57983df1b199cf39a2e6a2d90e3d50">LWIP_VERSION_REVISION</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga0a57983df1b199cf39a2e6a2d90e3d50"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gac1dc92d8f453a98560de7e2e00a221a1" id="r_gac1dc92d8f453a98560de7e2e00a221a1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gac1dc92d8f453a98560de7e2e00a221a1">LWIP_VERSION_RC</a>&#160;&#160;&#160;<a class="el" href="#ga375ee868e76ed7c458cdf249387bd469">LWIP_RC_RELEASE</a></td></tr>
 <tr class="separator:gac1dc92d8f453a98560de7e2e00a221a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -197,7 +197,7 @@
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">#define LWIP_VERSION_MINOR&#160;&#160;&#160;1</td>
+          <td class="memname">#define LWIP_VERSION_MINOR&#160;&#160;&#160;2</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -227,7 +227,7 @@
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">#define LWIP_VERSION_REVISION&#160;&#160;&#160;3</td>
+          <td class="memname">#define LWIP_VERSION_REVISION&#160;&#160;&#160;0</td>
         </tr>
       </table>
 </div><div class="memdoc">
diff --git a/doc/doxygen/output/html/group__mdns.html b/doc/doxygen/output/html/group__mdns.html
index 5240ec2..0262c65 100644
--- a/doc/doxygen/output/html/group__mdns.html
+++ b/doc/doxygen/output/html/group__mdns.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -117,31 +117,42 @@
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:gaa619ac8f46a4b4021195720f0355cbeb" id="r_gaa619ac8f46a4b4021195720f0355cbeb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa619ac8f46a4b4021195720f0355cbeb">mdns_resp_add_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *hostname, u32_t dns_ttl)</td></tr>
-<tr class="separator:gaa619ac8f46a4b4021195720f0355cbeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga67f842c27f37c03b48d10e4ce6856b8e" id="r_ga67f842c27f37c03b48d10e4ce6856b8e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga67f842c27f37c03b48d10e4ce6856b8e">mdns_resp_add_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *hostname)</td></tr>
+<tr class="separator:ga67f842c27f37c03b48d10e4ce6856b8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaa8144e3c77a92c4043e6214ff6b6010c" id="r_gaa8144e3c77a92c4043e6214ff6b6010c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa8144e3c77a92c4043e6214ff6b6010c">mdns_resp_remove_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:gaa8144e3c77a92c4043e6214ff6b6010c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga7b1473e595eb0c185bab293f3ec2e50e" id="r_ga7b1473e595eb0c185bab293f3ec2e50e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga7b1473e595eb0c185bab293f3ec2e50e">mdns_resp_rename_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *hostname)</td></tr>
 <tr class="separator:ga7b1473e595eb0c185bab293f3ec2e50e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga824e992e94be216c8e059f48f49a59ce" id="r_ga824e992e94be216c8e059f48f49a59ce"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga824e992e94be216c8e059f48f49a59ce">mdns_resp_add_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, <a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a> txt_fn, void *txt_data)</td></tr>
-<tr class="separator:ga824e992e94be216c8e059f48f49a59ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga3df2ae751cdfdffb0a567390940eb8ad" id="r_ga3df2ae751cdfdffb0a567390940eb8ad"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga3df2ae751cdfdffb0a567390940eb8ad">mdns_resp_del_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t slot)</td></tr>
-<tr class="separator:ga3df2ae751cdfdffb0a567390940eb8ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaf273897059f1bbddc74cfcb820777dd9" id="r_gaf273897059f1bbddc74cfcb820777dd9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaf273897059f1bbddc74cfcb820777dd9">mdns_resp_rename_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t slot, const char *name)</td></tr>
-<tr class="separator:gaf273897059f1bbddc74cfcb820777dd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09b7a259f497648d8ef734b080f997c1" id="r_ga09b7a259f497648d8ef734b080f997c1"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga09b7a259f497648d8ef734b080f997c1">mdns_resp_netif_active</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga09b7a259f497648d8ef734b080f997c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2130111662d044b32970ce9c763bd409" id="r_ga2130111662d044b32970ce9c763bd409"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga2130111662d044b32970ce9c763bd409">mdns_resp_add_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, <a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a> txt_fn, void *txt_data)</td></tr>
+<tr class="separator:ga2130111662d044b32970ce9c763bd409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga55f3fd46cfe1375452210688fc05bf9a" id="r_ga55f3fd46cfe1375452210688fc05bf9a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga55f3fd46cfe1375452210688fc05bf9a">mdns_resp_del_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t slot)</td></tr>
+<tr class="separator:ga55f3fd46cfe1375452210688fc05bf9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab1e989a4c7305d754377c76052474beb" id="r_gab1e989a4c7305d754377c76052474beb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gab1e989a4c7305d754377c76052474beb">mdns_resp_rename_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t slot, const char *name)</td></tr>
+<tr class="separator:gab1e989a4c7305d754377c76052474beb"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga01c85202f4b85edc8b571f2f419db576" id="r_ga01c85202f4b85edc8b571f2f419db576"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga01c85202f4b85edc8b571f2f419db576">mdns_resp_add_service_txtitem</a> (struct <a class="el" href="structmdns__service.html">mdns_service</a> *service, const char *txt, u8_t txt_len)</td></tr>
 <tr class="separator:ga01c85202f4b85edc8b571f2f419db576"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0c5617b4d021353bbd0fb24ddcb8b3ac" id="r_ga0c5617b4d021353bbd0fb24ddcb8b3ac"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga0c5617b4d021353bbd0fb24ddcb8b3ac">mdns_search_stop</a> (u8_t request_id)</td></tr>
+<tr class="separator:ga0c5617b4d021353bbd0fb24ddcb8b3ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac388b2eab379a23dd1f46f2ac8d63725" id="r_gac388b2eab379a23dd1f46f2ac8d63725"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gac388b2eab379a23dd1f46f2ac8d63725">mdns_search_service</a> (const char *name, const char *service, enum mdns_sd_proto proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, search_result_fn_t result_fn, void *arg, u8_t *request_id)</td></tr>
+<tr class="separator:gac388b2eab379a23dd1f46f2ac8d63725"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga0f462fb91a9d0323bb4636bd725f0e85" id="r_ga0f462fb91a9d0323bb4636bd725f0e85"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga0f462fb91a9d0323bb4636bd725f0e85">mdns_resp_announce</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga0f462fb91a9d0323bb4636bd725f0e85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga367ac89ddae6cbec3e0a9c55e9c46737" id="r_ga367ac89ddae6cbec3e0a9c55e9c46737"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga367ac89ddae6cbec3e0a9c55e9c46737">mdns_resp_restart_delay</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, uint32_t delay)</td></tr>
+<tr class="separator:ga367ac89ddae6cbec3e0a9c55e9c46737"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga93eccdc0d9afff0f24160d31c70e2c9a" id="r_ga93eccdc0d9afff0f24160d31c70e2c9a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga93eccdc0d9afff0f24160d31c70e2c9a">mdns_resp_restart</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga93eccdc0d9afff0f24160d31c70e2c9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga5fa15978a398dae1a8d7620ae169bdd3" id="r_ga5fa15978a398dae1a8d7620ae169bdd3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga5fa15978a398dae1a8d7620ae169bdd3">mdns_resp_init</a> (void)</td></tr>
 <tr class="separator:ga5fa15978a398dae1a8d7620ae169bdd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaee5b489b77b74511517d41f7609ccd49" id="r_gaee5b489b77b74511517d41f7609ccd49"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaee5b489b77b74511517d41f7609ccd49">mdns_get_service_txt_userdata</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t slot)</td></tr>
+<tr class="separator:gaee5b489b77b74511517d41f7609ccd49"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>RFC 6762 - Multicast DNS<br  />
-RFC 6763 - DNS-Based Service Discovery<br  />
- </p><pre class="fragment">Multicast DNS for lwIP
+ RFC 6763 - DNS-Based Service Discovery</p>
+<p>You need to increase MEMP_NUM_SYS_TIMEOUT by one if you use MDNS!</p>
+<pre class="fragment">Multicast DNS for lwIP
 
 Author: Erik Ekman
 
@@ -188,7 +199,7 @@
 
 
 To start responding on a netif, run
-  mdns_resp_add_netif(struct netif *netif, char *hostname, u32_t dns_ttl)
+  mdns_resp_add_netif(struct netif *netif, const char *hostname)
 
 The hostname will be copied. If this returns successfully, the netif will join
 the multicast groups and any MDNS/legacy DNS requests sent unicast or multicast
@@ -196,7 +207,6 @@
 - &lt;hostname&gt;.local type A, AAAA or ANY returns relevant IP addresses
 - Reverse lookups (PTR in-addr.arpa, ip6.arpa) of netif addresses
   returns &lt;hostname&gt;.local
-Answers will use the supplied TTL (in seconds)
 MDNS allows UTF-8 names, but it is recommended to stay within ASCII,
 since the default case-insensitive comparison assumes this.
 
@@ -214,8 +224,8 @@
 ================
 
 The netif first needs to be registered. Then run
-  mdns_resp_add_service(struct netif *netif, char *name, char *service,
-      u16_t proto, u16_t port, u32_t dns_ttl,
+  mdns_resp_add_service(struct netif *netif, const char *name, const char *service,
+      enum mdns_sd_proto proto, u16_t port,
       service_get_txt_fn_t txt_fn, void *txt_userdata);
 
 The name and service pointers will be copied. Name refers to the name of the
@@ -243,7 +253,7 @@
 If your device runs a webserver on port 80, an example call might be:
 
   mdns_resp_add_service(netif, "myweb", "_http"
-      DNSSD_PROTO_TCP, 80, 3600, srv_txt, NULL);
+      DNSSD_PROTO_TCP, 80, srv_txt, NULL);
 
 which will publish myweb._http._tcp.local for any hosts looking for web servers,
 and point them to &lt;hostname&gt;.local:80
@@ -252,15 +262,12 @@
 requests required from a client.
 
 To remove a service from a netif, run
-  mdns_resp_del_service(struct netif *netif, s8_t slot)
+  mdns_resp_del_service(struct netif *netif, u8_t slot)
 </pre><h2>Things left to implement: </h2>
 <ul>
-<li>Tiebreaking for simultaneous probing</li>
 <li>Sending goodbye messages (zero ttl) - shutdown, DHCP lease about to expire, DHCP turned off...</li>
-<li>Checking that source address of unicast requests are on the same network</li>
-<li>Limiting multicast responses to 1 per second per resource record</li>
+<li>Sending negative responses NSEC</li>
 <li>Fragmenting replies if required</li>
-<li>Handling multi-packet known answers</li>
 <li>Individual known answer detection for all local IPv6 addresses</li>
 <li>Dynamic size of outgoing packet </li>
 </ul>
@@ -280,8 +287,8 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="#ga0f462fb91a9d0323bb4636bd725f0e85">mdns_resp_announce</a>(<a class="code hl_struct" href="structnetif.html">netif</a>)</div>
-<div class="ttc" id="agroup__mdns_html_ga0f462fb91a9d0323bb4636bd725f0e85"><div class="ttname"><a href="#ga0f462fb91a9d0323bb4636bd725f0e85">mdns_resp_announce</a></div><div class="ttdeci">void mdns_resp_announce(struct netif *netif)</div><div class="ttdef"><b>Definition</b> mdns.c:2317</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="agroup__mdns_html_ga0f462fb91a9d0323bb4636bd725f0e85"><div class="ttname"><a href="#ga0f462fb91a9d0323bb4636bd725f0e85">mdns_resp_announce</a></div><div class="ttdeci">void mdns_resp_announce(struct netif *netif)</div><div class="ttdef"><b>Definition</b> mdns.c:2721</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>Announce IP settings have changed on netif. Call this in your callback registered by <a class="el" href="group__netif.html#gadc8787b23ac0ee023979cbadf87813d4">netif_set_status_callback()</a>. No need to call this function when LWIP_NETIF_EXT_STATUS_CALLBACK==1, this handled automatically for you. </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">netif</td><td>The network interface where settings have changed. </td></tr>
@@ -292,8 +299,36 @@
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
-<a id="gaa619ac8f46a4b4021195720f0355cbeb" name="gaa619ac8f46a4b4021195720f0355cbeb"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#gaa619ac8f46a4b4021195720f0355cbeb">&#9670;&#160;</a></span>mdns_resp_add_netif()</h2>
+<a id="gaee5b489b77b74511517d41f7609ccd49" name="gaee5b489b77b74511517d41f7609ccd49"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaee5b489b77b74511517d41f7609ccd49">&#9670;&#160;</a></span>mdns_get_service_txt_userdata()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void * mdns_get_service_txt_userdata </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s8_t</td>          <td class="paramname"><span class="paramname"><em>slot</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return TXT userdata of a specific service on a network interface. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>Network interface. </td></tr>
+    <tr><td class="paramname">slot</td><td>Service index. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga67f842c27f37c03b48d10e4ce6856b8e" name="ga67f842c27f37c03b48d10e4ce6856b8e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga67f842c27f37c03b48d10e4ce6856b8e">&#9670;&#160;</a></span>mdns_resp_add_netif()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -306,12 +341,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>hostname</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">u32_t</td>          <td class="paramname"><span class="paramname"><em>dns_ttl</em></span>&#160;)</td>
+          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>hostname</em></span>&#160;)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -319,7 +349,6 @@
   <table class="params">
     <tr><td class="paramname">netif</td><td>The network interface to activate. </td></tr>
     <tr><td class="paramname">hostname</td><td>Name to use. Queries for &lt;hostname&gt;.local will be answered with the IP addresses of the netif. The hostname will be copied, the given pointer can be on the stack. </td></tr>
-    <tr><td class="paramname">dns_ttl</td><td>Validity time in seconds to send out for IP address data in DNS replies </td></tr>
   </table>
   </dd>
 </dl>
@@ -327,8 +356,8 @@
 
 </div>
 </div>
-<a id="ga824e992e94be216c8e059f48f49a59ce" name="ga824e992e94be216c8e059f48f49a59ce"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ga824e992e94be216c8e059f48f49a59ce">&#9670;&#160;</a></span>mdns_resp_add_service()</h2>
+<a id="ga2130111662d044b32970ce9c763bd409" name="ga2130111662d044b32970ce9c763bd409"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2130111662d044b32970ce9c763bd409">&#9670;&#160;</a></span>mdns_resp_add_service()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -361,11 +390,6 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">u32_t</td>          <td class="paramname"><span class="paramname"><em>dns_ttl</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
           <td class="paramtype"><a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a></td>          <td class="paramname"><span class="paramname"><em>txt_fn</em></span>, </td>
         </tr>
         <tr>
@@ -382,7 +406,6 @@
     <tr><td class="paramname">service</td><td>The service type, like "_http" </td></tr>
     <tr><td class="paramname">proto</td><td>The service protocol, DNSSD_PROTO_TCP for TCP ("_tcp") and DNSSD_PROTO_UDP for others ("_udp") </td></tr>
     <tr><td class="paramname">port</td><td>The port the service listens to </td></tr>
-    <tr><td class="paramname">dns_ttl</td><td>Validity time in seconds to send out for service data in DNS replies </td></tr>
     <tr><td class="paramname">txt_fn</td><td>Callback to get TXT data. Will be called each time a TXT reply is created to allow dynamic replies. </td></tr>
     <tr><td class="paramname">txt_data</td><td>Userdata pointer for txt_fn </td></tr>
   </table>
@@ -450,8 +473,8 @@
 
 </div>
 </div>
-<a id="ga3df2ae751cdfdffb0a567390940eb8ad" name="ga3df2ae751cdfdffb0a567390940eb8ad"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ga3df2ae751cdfdffb0a567390940eb8ad">&#9670;&#160;</a></span>mdns_resp_del_service()</h2>
+<a id="ga55f3fd46cfe1375452210688fc05bf9a" name="ga55f3fd46cfe1375452210688fc05bf9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga55f3fd46cfe1375452210688fc05bf9a">&#9670;&#160;</a></span>mdns_resp_del_service()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -464,7 +487,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">s8_t</td>          <td class="paramname"><span class="paramname"><em>slot</em></span>&#160;)</td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>slot</em></span>&#160;)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -497,6 +520,30 @@
 
 </div>
 </div>
+<a id="ga09b7a259f497648d8ef734b080f997c1" name="ga09b7a259f497648d8ef734b080f997c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga09b7a259f497648d8ef734b080f997c1">&#9670;&#160;</a></span>mdns_resp_netif_active()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int mdns_resp_netif_active </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Checks if an MDNS responder is active for a given network interface. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The network interface to test. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>nonzero if responder active, zero otherwise. </dd></dl>
+
+</div>
+</div>
 <a id="gaa8144e3c77a92c4043e6214ff6b6010c" name="gaa8144e3c77a92c4043e6214ff6b6010c"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gaa8144e3c77a92c4043e6214ff6b6010c">&#9670;&#160;</a></span>mdns_resp_remove_netif()</h2>
 
@@ -550,8 +597,8 @@
 
 </div>
 </div>
-<a id="gaf273897059f1bbddc74cfcb820777dd9" name="gaf273897059f1bbddc74cfcb820777dd9"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#gaf273897059f1bbddc74cfcb820777dd9">&#9670;&#160;</a></span>mdns_resp_rename_service()</h2>
+<a id="gab1e989a4c7305d754377c76052474beb" name="gab1e989a4c7305d754377c76052474beb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab1e989a4c7305d754377c76052474beb">&#9670;&#160;</a></span>mdns_resp_rename_service()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -564,7 +611,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">s8_t</td>          <td class="paramname"><span class="paramname"><em>slot</em></span>, </td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>slot</em></span>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -608,6 +655,116 @@
 
 </div>
 </div>
+<a id="ga367ac89ddae6cbec3e0a9c55e9c46737" name="ga367ac89ddae6cbec3e0a9c55e9c46737"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga367ac89ddae6cbec3e0a9c55e9c46737">&#9670;&#160;</a></span>mdns_resp_restart_delay()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_resp_restart_delay </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint32_t</td>          <td class="paramname"><span class="paramname"><em>delay</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Restart mdns responder after a specified delay. Call this when cable is connected after being disconnected or administrative interface is set up after being down </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The network interface to send on </td></tr>
+    <tr><td class="paramname">delay</td><td>The delay to use before sending probe </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="gac388b2eab379a23dd1f46f2ac8d63725" name="gac388b2eab379a23dd1f46f2ac8d63725"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac388b2eab379a23dd1f46f2ac8d63725">&#9670;&#160;</a></span>mdns_search_service()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_search_service </td>
+          <td>(</td>
+          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>name</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>service</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum mdns_sd_proto</td>          <td class="paramname"><span class="paramname"><em>proto</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">search_result_fn_t</td>          <td class="paramname"><span class="paramname"><em>result_fn</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *</td>          <td class="paramname"><span class="paramname"><em>request_id</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Search a specific service on the network. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>The name of the service </td></tr>
+    <tr><td class="paramname">service</td><td>The service type, like "_http" </td></tr>
+    <tr><td class="paramname">proto</td><td>The service protocol, DNSSD_PROTO_TCP for TCP ("_tcp") and DNSSD_PROTO_UDP for others ("_udp") </td></tr>
+    <tr><td class="paramname">netif</td><td>The network interface where to send search request </td></tr>
+    <tr><td class="paramname">result_fn</td><td>Callback to send answer received. Will be called for each answer of a response frame matching request sent. </td></tr>
+    <tr><td class="paramname">arg</td><td>Userdata pointer for result_fn </td></tr>
+    <tr><td class="paramname">request_id</td><td>Returned request identifier to allow stop it. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the search request was created and sent, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ga0c5617b4d021353bbd0fb24ddcb8b3ac" name="ga0c5617b4d021353bbd0fb24ddcb8b3ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0c5617b4d021353bbd0fb24ddcb8b3ac">&#9670;&#160;</a></span>mdns_search_stop()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_search_stop </td>
+          <td>(</td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>request_id</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Stop a search request. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">request_id</td><td>The search request to stop </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 </div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/doxygen/output/html/group__mdns.js b/doc/doxygen/output/html/group__mdns.js
index 37503a3..6d95ea0 100644
--- a/doc/doxygen/output/html/group__mdns.js
+++ b/doc/doxygen/output/html/group__mdns.js
@@ -2,14 +2,19 @@
 [
     [ "Options", "group__mdns__opts.html", "group__mdns__opts" ],
     [ "mdns_resp_netif_settings_changed", "group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec", null ],
-    [ "mdns_resp_add_netif", "group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb", null ],
-    [ "mdns_resp_add_service", "group__mdns.html#ga824e992e94be216c8e059f48f49a59ce", null ],
+    [ "mdns_get_service_txt_userdata", "group__mdns.html#gaee5b489b77b74511517d41f7609ccd49", null ],
+    [ "mdns_resp_add_netif", "group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e", null ],
+    [ "mdns_resp_add_service", "group__mdns.html#ga2130111662d044b32970ce9c763bd409", null ],
     [ "mdns_resp_add_service_txtitem", "group__mdns.html#ga01c85202f4b85edc8b571f2f419db576", null ],
     [ "mdns_resp_announce", "group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85", null ],
-    [ "mdns_resp_del_service", "group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad", null ],
+    [ "mdns_resp_del_service", "group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a", null ],
     [ "mdns_resp_init", "group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3", null ],
+    [ "mdns_resp_netif_active", "group__mdns.html#ga09b7a259f497648d8ef734b080f997c1", null ],
     [ "mdns_resp_remove_netif", "group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c", null ],
     [ "mdns_resp_rename_netif", "group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e", null ],
-    [ "mdns_resp_rename_service", "group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9", null ],
-    [ "mdns_resp_restart", "group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a", null ]
+    [ "mdns_resp_rename_service", "group__mdns.html#gab1e989a4c7305d754377c76052474beb", null ],
+    [ "mdns_resp_restart", "group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a", null ],
+    [ "mdns_resp_restart_delay", "group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737", null ],
+    [ "mdns_search_service", "group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725", null ],
+    [ "mdns_search_stop", "group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__mdns__opts.html b/doc/doxygen/output/html/group__mdns__opts.html
index fa75647..70ec980 100644
--- a/doc/doxygen/output/html/group__mdns__opts.html
+++ b/doc/doxygen/output/html/group__mdns__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -107,13 +107,38 @@
 Macros</h2></td></tr>
 <tr class="memitem:ga82749ee08be21967b6daf577b9710ac6" id="r_ga82749ee08be21967b6daf577b9710ac6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga82749ee08be21967b6daf577b9710ac6">MDNS_MAX_SERVICES</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:ga82749ee08be21967b6daf577b9710ac6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f6853d01ad32eb6ce99ae55307a37d9" id="r_ga7f6853d01ad32eb6ce99ae55307a37d9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga7f6853d01ad32eb6ce99ae55307a37d9">MDNS_PROBE_DELAY_MS</a>&#160;&#160;&#160;250</td></tr>
+<tr class="separator:ga7f6853d01ad32eb6ce99ae55307a37d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga827d1d2abd24a26638723cfd0a8b9efd" id="r_ga827d1d2abd24a26638723cfd0a8b9efd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga827d1d2abd24a26638723cfd0a8b9efd">MDNS_MAX_STORED_PKTS</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga827d1d2abd24a26638723cfd0a8b9efd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0f0adf7b1d742b4ea818c1b7f6b0c547" id="r_ga0f0adf7b1d742b4ea818c1b7f6b0c547"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga0f0adf7b1d742b4ea818c1b7f6b0c547">MDNS_OUTPUT_PACKET_SIZE</a>&#160;&#160;&#160;((<a class="el" href="#ga82749ee08be21967b6daf577b9710ac6">MDNS_MAX_SERVICES</a> == 1) ? 512 : 1450)</td></tr>
+<tr class="separator:ga0f0adf7b1d742b4ea818c1b7f6b0c547"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga172e579cd09a1db51cf224319c012396" id="r_ga172e579cd09a1db51cf224319c012396"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga172e579cd09a1db51cf224319c012396">MDNS_RESP_USENETIF_EXTCALLBACK</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e">LWIP_NETIF_EXT_STATUS_CALLBACK</a></td></tr>
 <tr class="separator:ga172e579cd09a1db51cf224319c012396"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaf489604dcdf94d2adcd723f6c7d7163" id="r_gaaf489604dcdf94d2adcd723f6c7d7163"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaaf489604dcdf94d2adcd723f6c7d7163">LWIP_MDNS_SEARCH</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaaf489604dcdf94d2adcd723f6c7d7163"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga17a9884af8169cf19d57d8005fc3d95e" id="r_ga17a9884af8169cf19d57d8005fc3d95e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga17a9884af8169cf19d57d8005fc3d95e">MDNS_MAX_REQUESTS</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:ga17a9884af8169cf19d57d8005fc3d95e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga53a97502efdcf1214cab4078f93a6dc9" id="r_ga53a97502efdcf1214cab4078f93a6dc9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga53a97502efdcf1214cab4078f93a6dc9">MDNS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
 <tr class="separator:ga53a97502efdcf1214cab4078f93a6dc9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="gaaf489604dcdf94d2adcd723f6c7d7163" name="gaaf489604dcdf94d2adcd723f6c7d7163"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaaf489604dcdf94d2adcd723f6c7d7163">&#9670;&#160;</a></span>LWIP_MDNS_SEARCH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_MDNS_SEARCH&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>LWIP_MDNS_SEARCH==1: Turn on search over multicast DNS module. </p>
+
+</div>
+</div>
 <a id="ga53a97502efdcf1214cab4078f93a6dc9" name="ga53a97502efdcf1214cab4078f93a6dc9"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga53a97502efdcf1214cab4078f93a6dc9">&#9670;&#160;</a></span>MDNS_DEBUG</h2>
 
@@ -129,6 +154,21 @@
 
 </div>
 </div>
+<a id="ga17a9884af8169cf19d57d8005fc3d95e" name="ga17a9884af8169cf19d57d8005fc3d95e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga17a9884af8169cf19d57d8005fc3d95e">&#9670;&#160;</a></span>MDNS_MAX_REQUESTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MDNS_MAX_REQUESTS&#160;&#160;&#160;2</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum number of running requests </p>
+
+</div>
+</div>
 <a id="ga82749ee08be21967b6daf577b9710ac6" name="ga82749ee08be21967b6daf577b9710ac6"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga82749ee08be21967b6daf577b9710ac6">&#9670;&#160;</a></span>MDNS_MAX_SERVICES</h2>
 
@@ -144,6 +184,51 @@
 
 </div>
 </div>
+<a id="ga827d1d2abd24a26638723cfd0a8b9efd" name="ga827d1d2abd24a26638723cfd0a8b9efd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga827d1d2abd24a26638723cfd0a8b9efd">&#9670;&#160;</a></span>MDNS_MAX_STORED_PKTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MDNS_MAX_STORED_PKTS&#160;&#160;&#160;4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The maximum number of received packets stored in chained list of known answers for pending truncated questions. This value define the size of the MDNS_PKTS mempool. Up to MDNS_MAX_STORED_PKTS pbuf can be stored in addition to TC questions that are pending. </p>
+
+</div>
+</div>
+<a id="ga0f0adf7b1d742b4ea818c1b7f6b0c547" name="ga0f0adf7b1d742b4ea818c1b7f6b0c547"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga0f0adf7b1d742b4ea818c1b7f6b0c547">&#9670;&#160;</a></span>MDNS_OUTPUT_PACKET_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MDNS_OUTPUT_PACKET_SIZE&#160;&#160;&#160;((<a class="el" href="#ga82749ee08be21967b6daf577b9710ac6">MDNS_MAX_SERVICES</a> == 1) ? 512 : 1450)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Payload size allocated for each outgoing UDP packet. Will be allocated with PBUF_RAM and freed after packet was sent. According to RFC 6762, there is no reason to retain the 512 bytes restriction for link-local multicast packet. 512 bytes isn't enough when 2 services need to be probed. </p>
+
+</div>
+</div>
+<a id="ga7f6853d01ad32eb6ce99ae55307a37d9" name="ga7f6853d01ad32eb6ce99ae55307a37d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7f6853d01ad32eb6ce99ae55307a37d9">&#9670;&#160;</a></span>MDNS_PROBE_DELAY_MS</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define MDNS_PROBE_DELAY_MS&#160;&#160;&#160;250</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>The minimum delay between probes in ms. RFC 6762 require 250ms. In noisy WiFi environment, adding 30-50ms to this value help a lot for a successful Apple BCT tests. </p>
+
+</div>
+</div>
 <a id="ga172e579cd09a1db51cf224319c012396" name="ga172e579cd09a1db51cf224319c012396"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga172e579cd09a1db51cf224319c012396">&#9670;&#160;</a></span>MDNS_RESP_USENETIF_EXTCALLBACK</h2>
 
diff --git a/doc/doxygen/output/html/group__mdns__opts.js b/doc/doxygen/output/html/group__mdns__opts.js
index 4d92a3d..53fdf68 100644
--- a/doc/doxygen/output/html/group__mdns__opts.js
+++ b/doc/doxygen/output/html/group__mdns__opts.js
@@ -1,6 +1,11 @@
 var group__mdns__opts =
 [
+    [ "LWIP_MDNS_SEARCH", "group__mdns__opts.html#gaaf489604dcdf94d2adcd723f6c7d7163", null ],
     [ "MDNS_DEBUG", "group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9", null ],
+    [ "MDNS_MAX_REQUESTS", "group__mdns__opts.html#ga17a9884af8169cf19d57d8005fc3d95e", null ],
     [ "MDNS_MAX_SERVICES", "group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6", null ],
+    [ "MDNS_MAX_STORED_PKTS", "group__mdns__opts.html#ga827d1d2abd24a26638723cfd0a8b9efd", null ],
+    [ "MDNS_OUTPUT_PACKET_SIZE", "group__mdns__opts.html#ga0f0adf7b1d742b4ea818c1b7f6b0c547", null ],
+    [ "MDNS_PROBE_DELAY_MS", "group__mdns__opts.html#ga7f6853d01ad32eb6ce99ae55307a37d9", null ],
     [ "MDNS_RESP_USENETIF_EXTCALLBACK", "group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__mempool.html b/doc/doxygen/output/html/group__mempool.html
index 84105fe..6df70aa 100644
--- a/doc/doxygen/output/html/group__mempool.html
+++ b/doc/doxygen/output/html/group__mempool.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__mld6.html b/doc/doxygen/output/html/group__mld6.html
index be72ade..0e172b8 100644
--- a/doc/doxygen/output/html/group__mld6.html
+++ b/doc/doxygen/output/html/group__mld6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -122,9 +122,9 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710. No support for MLDv2.<br  />
-Note: The allnodes (ff01::1, ff02::1) group is assumed be received by your netif since it must always be received for correct IPv6 operation (e.g. SLAAC). Ensure the netif filters are configured accordingly!<br  />
-The netif flags also need NETIF_FLAG_MLD6 flag set to enable MLD6 on a netif ("netif-&gt;flags |= NETIF_FLAG_MLD6;").<br  />
-To be called from TCPIP thread. </p>
+ Note: The allnodes (ff01::1, ff02::1) group is assumed be received by your netif since it must always be received for correct IPv6 operation (e.g. SLAAC). Ensure the netif filters are configured accordingly!<br  />
+ The netif flags also need NETIF_FLAG_MLD6 flag set to enable MLD6 on a netif ("netif-&gt;flags |= NETIF_FLAG_MLD6;").<br  />
+ To be called from TCPIP thread. </p>
 <h2 class="groupheader">Macro Definition Documentation</h2>
 <a id="ga02a2259082f22c5989a3c929be95e641" name="ga02a2259082f22c5989a3c929be95e641"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga02a2259082f22c5989a3c929be95e641">&#9670;&#160;</a></span>netif_mld6_data</h2>
@@ -141,10 +141,10 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">((<span class="keyword">struct </span><a class="code hl_struct" href="structmld__group.html">mld_group</a> *)<a class="code hl_define" href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="code hl_struct" href="structnetif.html">netif</a>, LWIP_NETIF_CLIENT_DATA_INDEX_MLD6))</div>
-<div class="ttc" id="agroup__netif__cd_html_ga4bce01ddbf0fd70cb88431f773c91bc5"><div class="ttname"><a href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a></div><div class="ttdeci">#define netif_get_client_data(netif, id)</div><div class="ttdef"><b>Definition</b> netif.h:237</div></div>
+<div class="ttc" id="agroup__netif__cd_html_ga4bce01ddbf0fd70cb88431f773c91bc5"><div class="ttname"><a href="group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a></div><div class="ttdeci">#define netif_get_client_data(netif, id)</div><div class="ttdef"><b>Definition</b> netif.h:240</div></div>
 <div class="ttc" id="astructmld__group_html"><div class="ttname"><a href="structmld__group.html">mld_group</a></div><div class="ttdef"><b>Definition</b> mld6.h:58</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
-</div><!-- fragment --><p>Get list head of MLD6 groups for netif. Note: The allnodes group IP is NOT in the list, since it must always be received for correct IPv6 operation. </p><dl class="section see"><dt>See also</dt><dd>netif_set_mld_mac_filter() </dd></dl>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
+</div><!-- fragment --><p>Get list head of MLD6 groups for netif. Note: The allnodes group IP is NOT in the list, since it must always be received for correct IPv6 operation. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c">netif_set_mld_mac_filter()</a> </dd></dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__mqtt.html b/doc/doxygen/output/html/group__mqtt.html
index 175321d..5550374 100644
--- a/doc/doxygen/output/html/group__mqtt.html
+++ b/doc/doxygen/output/html/group__mqtt.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -155,9 +155,9 @@
 <br />
  }</td></tr>
 <tr class="separator:ga8cf0f360ab20343af37e1d124395a77d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga99fb83031ce9923c84392b4e92f956b5" id="r_ga99fb83031ce9923c84392b4e92f956b5"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f">MQTT_DATA_FLAG_LAST</a> = 1
+<tr class="memitem:gabc6126af1d45847bc59afa0aa3216b04" id="r_gabc6126af1d45847bc59afa0aa3216b04"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="#ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f">MQTT_DATA_FLAG_LAST</a> = 1
  }</td></tr>
-<tr class="separator:ga99fb83031ce9923c84392b4e92f956b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="separator:gabc6126af1d45847bc59afa0aa3216b04"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
@@ -184,11 +184,13 @@
 Author: Erik Andersson
 
 Details of the MQTT protocol can be found at:
-http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html 
+http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html
 
 -----------------------------------------------------------------
 1. Initial steps, reserve memory and make connection to server:
 
+You need to increase MEMP_NUM_SYS_TIMEOUT by one if you use MQTT!
+
 1.1: Provide storage
 
 Static allocation:
@@ -200,34 +202,34 @@
   if(client != NULL) {
     example_do_connect(&amp;client);
   }
-  
+
 1.2: Establish Connection with server
 
 void example_do_connect(mqtt_client_t *client)
 {
   struct mqtt_connect_client_info_t ci;
   err_t err;
-  
+
   /* Setup an empty client info structure */
   memset(&amp;ci, 0, sizeof(ci));
-  
-  /* Minimal amount of information required is client identifier, so set it here */ 
+
+  /* Minimal amount of information required is client identifier, so set it here */
   ci.client_id = "lwip_test";
-  
+
   /* Initiate client and connect to server, if this fails immediately an error code is returned
-     otherwise mqtt_connection_cb will be called with connection result after attempting 
-     to establish a connection with the server. 
+     otherwise mqtt_connection_cb will be called with connection result after attempting
+     to establish a connection with the server.
      For now MQTT version 3.1.1 is always used */
-  
+
   err = mqtt_client_connect(client, ip_addr, MQTT_PORT, mqtt_connection_cb, 0, &amp;ci);
-  
+
   /* For now just print the result code if something goes wrong */
   if(err != ERR_OK) {
     printf("mqtt_connect return %d\n", err);
   }
 }
 
-Connection to server can also be probed by calling mqtt_client_is_connected(client) 
+Connection to server can also be probed by calling mqtt_client_is_connected(client)
 
 -----------------------------------------------------------------
 2. Implementing the connection status callback
@@ -238,11 +240,11 @@
   err_t err;
   if(status == MQTT_CONNECT_ACCEPTED) {
     printf("mqtt_connection_cb: Successfully connected\n");
-    
+
     /* Setup callback for incoming publish requests */
     mqtt_set_inpub_callback(client, mqtt_incoming_publish_cb, mqtt_incoming_data_cb, arg);
-    
-    /* Subscribe to a topic named "subtopic" with QoS level 1, call mqtt_sub_request_cb with result */ 
+
+    /* Subscribe to a topic named "subtopic" with QoS level 1, call mqtt_sub_request_cb with result */
     err = mqtt_subscribe(client, "subtopic", 1, mqtt_sub_request_cb, arg);
 
     if(err != ERR_OK) {
@@ -250,16 +252,16 @@
     }
   } else {
     printf("mqtt_connection_cb: Disconnected, reason: %d\n", status);
-    
+
     /* Its more nice to be connected, so try to reconnect */
     example_do_connect(client);
-  }  
+  }
 }
 
 static void mqtt_sub_request_cb(void *arg, err_t result)
 {
-  /* Just print the result code here for simplicity, 
-     normal behaviour would be to take some action if subscribe fails like 
+  /* Just print the result code here for simplicity,
+     normal behaviour would be to take some action if subscribe fails like
      notifying user, retry subscribe or disconnect from server */
   printf("Subscribe result: %d\n", result);
 }
@@ -329,7 +331,7 @@
   }
 }
 
-/* Called when publish is complete either with sucess or failure */
+/* Called when publish is complete either with success or failure */
 static void mqtt_pub_request_cb(void *arg, err_t result)
 {
   if(result != ERR_OK) {
@@ -391,7 +393,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a>(client, topic, qos, cb, arg, 1)</div>
-<div class="ttc" id="agroup__mqtt_html_gafdb39d4a9758f98c02451aaa9a9b3103"><div class="ttname"><a href="#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a></div><div class="ttdeci">err_t mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub)</div><div class="ttdef"><b>Definition</b> mqtt.c:1172</div></div>
+<div class="ttc" id="agroup__mqtt_html_gafdb39d4a9758f98c02451aaa9a9b3103"><div class="ttname"><a href="#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a></div><div class="ttdeci">err_t mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub)</div><div class="ttdef"><b>Definition</b> mqtt.c:1180</div></div>
 </div><!-- fragment --><p>Subscribe to topic </p>
 
 </div>
@@ -538,8 +540,8 @@
 </div>
 </div>
 <h2 class="groupheader">Enumeration Type Documentation</h2>
-<a id="ga99fb83031ce9923c84392b4e92f956b5" name="ga99fb83031ce9923c84392b4e92f956b5"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ga99fb83031ce9923c84392b4e92f956b5">&#9670;&#160;</a></span>anonymous enum</h2>
+<a id="gabc6126af1d45847bc59afa0aa3216b04" name="gabc6126af1d45847bc59afa0aa3216b04"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gabc6126af1d45847bc59afa0aa3216b04">&#9670;&#160;</a></span>anonymous enum</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -551,7 +553,7 @@
 </div><div class="memdoc">
 <p>Data callback flags </p>
 <table class="fieldtable">
-<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f" name="gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f"></a>MQTT_DATA_FLAG_LAST&#160;</td><td class="fielddoc"><p>Flag set when last fragment of data arrives in data callback </p>
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f" name="ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f"></a>MQTT_DATA_FLAG_LAST&#160;</td><td class="fielddoc"><p>Flag set when last fragment of data arrives in data callback </p>
 </td></tr>
 </table>
 
@@ -881,7 +883,7 @@
     <tr><td class="paramname">client</td><td>MQTT client </td></tr>
     <tr><td class="paramname">topic</td><td>topic to subscribe to </td></tr>
     <tr><td class="paramname">qos</td><td>Quality of service, 0 1 or 2 (only used for subscribe) </td></tr>
-    <tr><td class="paramname">cb</td><td>Callback to call when subscribe/unsubscribe reponse is received </td></tr>
+    <tr><td class="paramname">cb</td><td>Callback to call when subscribe/unsubscribe response is received </td></tr>
     <tr><td class="paramname">arg</td><td>User supplied argument to publish callback </td></tr>
     <tr><td class="paramname">sub</td><td>1 for subscribe, 0 for unsubscribe </td></tr>
   </table>
diff --git a/doc/doxygen/output/html/group__mqtt.js b/doc/doxygen/output/html/group__mqtt.js
index 4d7df97..d6b1216 100644
--- a/doc/doxygen/output/html/group__mqtt.js
+++ b/doc/doxygen/output/html/group__mqtt.js
@@ -20,7 +20,7 @@
     [ "mqtt_incoming_data_cb_t", "group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81", null ],
     [ "mqtt_incoming_publish_cb_t", "group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29", null ],
     [ "mqtt_request_cb_t", "group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd", [
-      [ "MQTT_DATA_FLAG_LAST", "group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f", null ]
+      [ "MQTT_DATA_FLAG_LAST", "group__mqtt.html#ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f", null ]
     ] ],
     [ "mqtt_connection_status_t", "group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d", [
       [ "MQTT_CONNECT_ACCEPTED", "group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1", null ],
diff --git a/doc/doxygen/output/html/group__mqtt__opts.html b/doc/doxygen/output/html/group__mqtt__opts.html
index 32d83bd..d6b6ca2 100644
--- a/doc/doxygen/output/html/group__mqtt__opts.html
+++ b/doc/doxygen/output/html/group__mqtt__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__netbiosns.html b/doc/doxygen/output/html/group__netbiosns.html
index 1c52245..23a4e55 100644
--- a/doc/doxygen/output/html/group__netbiosns.html
+++ b/doc/doxygen/output/html/group__netbiosns.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__netbiosns__opts.html b/doc/doxygen/output/html/group__netbiosns__opts.html
index 629a71d..36085c5 100644
--- a/doc/doxygen/output/html/group__netbiosns__opts.html
+++ b/doc/doxygen/output/html/group__netbiosns__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -138,7 +138,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>NetBIOS name of lwip device This must be uppercase until NETBIOS_STRCMP() is defined to a string comparision function that is case insensitive. If you want to use the netif's hostname, use this (with LWIP_NETIF_HOSTNAME): (<a class="el" href="ip_8h.html#aabecef3c7653a9767c79245c44fcab9f">ip_current_netif()</a> != NULL ? <a class="el" href="ip_8h.html#aabecef3c7653a9767c79245c44fcab9f">ip_current_netif()</a>-&gt;hostname != NULL ? <a class="el" href="ip_8h.html#aabecef3c7653a9767c79245c44fcab9f">ip_current_netif()</a>-&gt;hostname : "" : "")</p>
+<p>NetBIOS name of lwip device This must be uppercase until NETBIOS_STRCMP() is defined to a string comparison function that is case insensitive. If you want to use the netif's hostname, use this (with LWIP_NETIF_HOSTNAME): (<a class="el" href="ip_8h.html#aabecef3c7653a9767c79245c44fcab9f">ip_current_netif()</a> != NULL ? <a class="el" href="ip_8h.html#aabecef3c7653a9767c79245c44fcab9f">ip_current_netif()</a>-&gt;hostname != NULL ? <a class="el" href="ip_8h.html#aabecef3c7653a9767c79245c44fcab9f">ip_current_netif()</a>-&gt;hostname : "" : "")</p>
 <p>If this is not defined, netbiosns_set_name() can be called at runtime to change the name. </p>
 
 </div>
diff --git a/doc/doxygen/output/html/group__netbuf.html b/doc/doxygen/output/html/group__netbuf.html
index fe7ae11..04c853b 100644
--- a/doc/doxygen/output/html/group__netbuf.html
+++ b/doc/doxygen/output/html/group__netbuf.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -126,7 +126,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>Network buffer descriptor for <a class="el" href="group__netconn.html">Netconn API</a>. Based on <a class="el" href="group__pbuf.html">Packet buffers (PBUF)</a> internally to avoid copying data around.<br  />
-Buffers must not be shared accross multiple threads, all functions except <a class="el" href="#gade8afe4d5b849cec3784708d691be711">netbuf_new()</a> and <a class="el" href="#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf_delete()</a> are not thread-safe. </p>
+ Buffers must not be shared across multiple threads, all functions except <a class="el" href="#gade8afe4d5b849cec3784708d691be711">netbuf_new()</a> and <a class="el" href="#ga9dfd3ddfe0ec65009cb140c68404b09d">netbuf_delete()</a> are not thread-safe. </p>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="ga1525001cbea926fdae88b0ac40bd6525" name="ga1525001cbea926fdae88b0ac40bd6525"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga1525001cbea926fdae88b0ac40bd6525">&#9670;&#160;</a></span>netbuf_alloc()</h2>
diff --git a/doc/doxygen/output/html/group__netconn.html b/doc/doxygen/output/html/group__netconn.html
index ec93f97..4cc42d2 100644
--- a/doc/doxygen/output/html/group__netconn.html
+++ b/doc/doxygen/output/html/group__netconn.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__netconn__common.html b/doc/doxygen/output/html/group__netconn__common.html
index 30f6d47..4074740 100644
--- a/doc/doxygen/output/html/group__netconn__common.html
+++ b/doc/doxygen/output/html/group__netconn__common.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -430,11 +430,16 @@
   <table class="params">
     <tr><td class="paramname">name</td><td>a string representation of the DNS host name to query </td></tr>
     <tr><td class="paramname">addr</td><td>a preallocated ip_addr_t where to store the resolved IP address </td></tr>
-    <tr><td class="paramname">dns_addrtype</td><td>IP address type (IPv4 / IPv6) </td></tr>
   </table>
   </dd>
 </dl>
 <dl class="section return"><dt>Returns</dt><dd>ERR_OK: resolving succeeded ERR_MEM: memory error, try again later ERR_ARG: dns client not initialized or invalid hostname ERR_VAL: dns server response was invalid </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dns_addrtype</td><td>IP address type (IPv4 / IPv6) </td></tr>
+  </table>
+  </dd>
+</dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__netconn__tcp.html b/doc/doxygen/output/html/group__netconn__tcp.html
index 10aa9e5..077fd30 100644
--- a/doc/doxygen/output/html/group__netconn__tcp.html
+++ b/doc/doxygen/output/html/group__netconn__tcp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__netconn__udp.html b/doc/doxygen/output/html/group__netconn__udp.html
index 2620b46..06f956e 100644
--- a/doc/doxygen/output/html/group__netconn__udp.html
+++ b/doc/doxygen/output/html/group__netconn__udp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__netdbapi.html b/doc/doxygen/output/html/group__netdbapi.html
index d4edd45..098e792 100644
--- a/doc/doxygen/output/html/group__netdbapi.html
+++ b/doc/doxygen/output/html/group__netdbapi.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__netif.html b/doc/doxygen/output/html/group__netif.html
index fc5ab34..6b42dd1 100644
--- a/doc/doxygen/output/html/group__netif.html
+++ b/doc/doxygen/output/html/group__netif.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -129,6 +129,10 @@
 Macros</h2></td></tr>
 <tr class="memitem:ga94a4c24c988afc0a577387730f303b19" id="r_ga94a4c24c988afc0a577387730f303b19"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga94a4c24c988afc0a577387730f303b19">netif_is_up</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga94a4c24c988afc0a577387730f303b19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3428b3f8195249c6cd8704a4db46b401" id="r_ga3428b3f8195249c6cd8704a4db46b401"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga3428b3f8195249c6cd8704a4db46b401">netif_set_igmp_mac_filter</a>(<a class="el" href="structnetif.html">netif</a>,  function)</td></tr>
+<tr class="separator:ga3428b3f8195249c6cd8704a4db46b401"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97f30bb5542e4c07d3b32e3c754e104c" id="r_ga97f30bb5542e4c07d3b32e3c754e104c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga97f30bb5542e4c07d3b32e3c754e104c">netif_set_mld_mac_filter</a>(<a class="el" href="structnetif.html">netif</a>,  function)</td></tr>
+<tr class="separator:ga97f30bb5542e4c07d3b32e3c754e104c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
 Typedefs</h2></td></tr>
@@ -194,11 +198,57 @@
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">(((<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;flags &amp; <a class="code hl_define" href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">NETIF_FLAG_UP</a>) ? (u8_t)1 : (u8_t)0)</div>
 <div class="ttc" id="agroup__netif__flags_html_gab47d7d130693dc155f480a5bf447725e"><div class="ttname"><a href="group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e">NETIF_FLAG_UP</a></div><div class="ttdeci">#define NETIF_FLAG_UP</div><div class="ttdef"><b>Definition</b> netif.h:84</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>Ask if an interface is up </p>
 
 </div>
 </div>
+<a id="ga3428b3f8195249c6cd8704a4db46b401" name="ga3428b3f8195249c6cd8704a4db46b401"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3428b3f8195249c6cd8704a4db46b401">&#9670;&#160;</a></span>netif_set_igmp_mac_filter</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_set_igmp_mac_filter</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em><a class="el" href="structnetif.html">netif</a></em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>function</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">do</span> { <span class="keywordflow">if</span>((<a class="code hl_struct" href="structnetif.html">netif</a>) != NULL) { (<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;igmp_mac_filter = function; }}<span class="keywordflow">while</span>(0)</div>
+</div><!-- fragment --><p>Set igmp mac filter function for a netif. </p>
+
+</div>
+</div>
+<a id="ga97f30bb5542e4c07d3b32e3c754e104c" name="ga97f30bb5542e4c07d3b32e3c754e104c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga97f30bb5542e4c07d3b32e3c754e104c">&#9670;&#160;</a></span>netif_set_mld_mac_filter</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_set_mld_mac_filter</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em><a class="el" href="structnetif.html">netif</a></em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>function</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">do</span> { <span class="keywordflow">if</span>((<a class="code hl_struct" href="structnetif.html">netif</a>) != NULL) { (<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;mld_mac_filter = function; }}<span class="keywordflow">while</span>(0)</div>
+</div><!-- fragment --><p>Set mld mac filter function for a netif. </p>
+
+</div>
+</div>
 <h2 class="groupheader">Typedef Documentation</h2>
 <a id="ga5ee213cea065424c89c66f138c008da1" name="ga5ee213cea065424c89c66f138c008da1"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga5ee213cea065424c89c66f138c008da1">&#9670;&#160;</a></span>netif_ext_callback_fn</h2>
@@ -291,10 +341,10 @@
     <tr><td class="paramname">state</td><td>opaque data passed to the new netif </td></tr>
     <tr><td class="paramname">init</td><td>callback function that initializes the interface </td></tr>
     <tr><td class="paramname">input</td><td>callback function that is called to pass ingress packets up in the protocol layer stack.<br  />
-It is recommended to use a function that passes the input directly to the stack (<a class="el" href="group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif_input()</a>, NO_SYS=1 mode) or via sending a message to TCPIP thread (<a class="el" href="group__lwip__os.html#gae510f195171bed8499ae94e264a92717">tcpip_input()</a>, NO_SYS=0 mode).<br  />
-These functions use netif flags NETIF_FLAG_ETHARP and NETIF_FLAG_ETHERNET to decide whether to forward to <a class="el" href="group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet_input()</a> or <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a>. In other words, the functions only work when the netif driver is implemented correctly!<br  />
-Most members of struct netif should be be initialized by the netif init function = netif driver (init parameter of this function).<br  />
-IPv6: Don't forget to call <a class="el" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address()</a> after setting the MAC address in struct <a class="el" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif.hwaddr</a> (IPv6 requires a link-local address).</td></tr>
+ It is recommended to use a function that passes the input directly to the stack (<a class="el" href="group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385">netif_input()</a>, NO_SYS=1 mode) or via sending a message to TCPIP thread (<a class="el" href="group__lwip__os.html#gae510f195171bed8499ae94e264a92717">tcpip_input()</a>, NO_SYS=0 mode).<br  />
+ These functions use netif flags NETIF_FLAG_ETHARP and NETIF_FLAG_ETHERNET to decide whether to forward to <a class="el" href="group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet_input()</a> or <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a>. In other words, the functions only work when the netif driver is implemented correctly!<br  />
+ Most members of struct netif should be be initialized by the netif init function = netif driver (init parameter of this function).<br  />
+ IPv6: Don't forget to call <a class="el" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address()</a> after setting the MAC address in struct <a class="el" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif.hwaddr</a> (IPv6 requires a link-local address).</td></tr>
   </table>
   </dd>
 </dl>
diff --git a/doc/doxygen/output/html/group__netif.js b/doc/doxygen/output/html/group__netif.js
index 6188fc3..8cd83a9 100644
--- a/doc/doxygen/output/html/group__netif.js
+++ b/doc/doxygen/output/html/group__netif.js
@@ -26,6 +26,8 @@
       ] ]
     ] ],
     [ "netif_is_up", "group__netif.html#ga94a4c24c988afc0a577387730f303b19", null ],
+    [ "netif_set_igmp_mac_filter", "group__netif.html#ga3428b3f8195249c6cd8704a4db46b401", null ],
+    [ "netif_set_mld_mac_filter", "group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c", null ],
     [ "netif_ext_callback_fn", "group__netif.html#ga5ee213cea065424c89c66f138c008da1", null ],
     [ "netif_nsc_reason_t", "group__netif.html#gab2b9387389513a02027c62e246723808", null ],
     [ "netif_add", "group__netif.html#ga22055759a25f5d6cea7e7deab0a07434", null ],
diff --git a/doc/doxygen/output/html/group__netif__cd.html b/doc/doxygen/output/html/group__netif__cd.html
index e579025..b018d8d 100644
--- a/doc/doxygen/output/html/group__netif__cd.html
+++ b/doc/doxygen/output/html/group__netif__cd.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -138,7 +138,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">(<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;client_data[(<span class="keywordtype">id</span>)]</div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>Get client data. Obtain ID from <a class="el" href="#ga55d62d43b5a9a5527f0116ec38369978">netif_alloc_client_data_id()</a>. </p>
 
 </div>
@@ -167,7 +167,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a>(<a class="code hl_struct" href="structnetif.html">netif</a>, <span class="keywordtype">id</span>) = (data)</div>
-<div class="ttc" id="agroup__netif__cd_html_ga4bce01ddbf0fd70cb88431f773c91bc5"><div class="ttname"><a href="#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a></div><div class="ttdeci">#define netif_get_client_data(netif, id)</div><div class="ttdef"><b>Definition</b> netif.h:237</div></div>
+<div class="ttc" id="agroup__netif__cd_html_ga4bce01ddbf0fd70cb88431f773c91bc5"><div class="ttname"><a href="#ga4bce01ddbf0fd70cb88431f773c91bc5">netif_get_client_data</a></div><div class="ttdeci">#define netif_get_client_data(netif, id)</div><div class="ttdef"><b>Definition</b> netif.h:240</div></div>
 </div><!-- fragment --><p>Set client data. Obtain ID from <a class="el" href="#ga55d62d43b5a9a5527f0116ec38369978">netif_alloc_client_data_id()</a>. </p>
 
 </div>
diff --git a/doc/doxygen/output/html/group__netif__flags.html b/doc/doxygen/output/html/group__netif__flags.html
index bf613d1..2b68d83 100644
--- a/doc/doxygen/output/html/group__netif__flags.html
+++ b/doc/doxygen/output/html/group__netif__flags.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__netif__ip4.html b/doc/doxygen/output/html/group__netif__ip4.html
index 0237efd..c35c68c 100644
--- a/doc/doxygen/output/html/group__netif__ip4.html
+++ b/doc/doxygen/output/html/group__netif__ip4.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__netif__ip6.html b/doc/doxygen/output/html/group__netif__ip6.html
index 78d5769..d249c7e 100644
--- a/doc/doxygen/output/html/group__netif__ip6.html
+++ b/doc/doxygen/output/html/group__netif__ip6.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__netif__mib2.html b/doc/doxygen/output/html/group__netif__mib2.html
index b84b699..248519a 100644
--- a/doc/doxygen/output/html/group__netif__mib2.html
+++ b/doc/doxygen/output/html/group__netif__mib2.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -164,7 +164,7 @@
 <div class="line">  (<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;mib2_counters.ifoutnucastpkts = 0; \</div>
 <div class="line">  (<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;mib2_counters.ifoutdiscards = 0; \</div>
 <div class="line">  (<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;mib2_counters.ifouterrors = 0; } <span class="keywordflow">while</span>(0)</div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>Init MIB2 statistic counters in netif </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">netif</td><td>Netif to init </td></tr>
diff --git a/doc/doxygen/output/html/group__netifapi.html b/doc/doxygen/output/html/group__netifapi.html
index bd70073..a925213 100644
--- a/doc/doxygen/output/html/group__netifapi.html
+++ b/doc/doxygen/output/html/group__netifapi.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -107,6 +107,8 @@
 Topics</h2></td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html">NETIF related</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__arp.html">ARP</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__dhcp4.html">DHCPv4</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__autoip.html">AUTOIP</a></td></tr>
diff --git a/doc/doxygen/output/html/group__netifapi.js b/doc/doxygen/output/html/group__netifapi.js
index 9625227..a987ef6 100644
--- a/doc/doxygen/output/html/group__netifapi.js
+++ b/doc/doxygen/output/html/group__netifapi.js
@@ -1,6 +1,7 @@
 var group__netifapi =
 [
     [ "NETIF related", "group__netifapi__netif.html", "group__netifapi__netif" ],
+    [ "ARP", "group__netifapi__arp.html", "group__netifapi__arp" ],
     [ "DHCPv4", "group__netifapi__dhcp4.html", "group__netifapi__dhcp4" ],
     [ "AUTOIP", "group__netifapi__autoip.html", "group__netifapi__autoip" ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netifapi__arp.html b/doc/doxygen/output/html/group__netifapi__arp.html
new file mode 100644
index 0000000..0270a9f
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi__arp.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: ARP</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('group__netifapi__arp.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle"><div class="title">ARP<div class="ingroups"><a class="el" href="group__api.html">APIs</a> &raquo; <a class="el" href="group__sequential__api.html">Sequential-style APIs</a> &raquo; <a class="el" href="group__netifapi.html">NETIF API</a></div></div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga62b0bdbb3783eb27aa73485081306119" id="r_ga62b0bdbb3783eb27aa73485081306119"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga62b0bdbb3783eb27aa73485081306119">netifapi_arp_add</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *ethaddr, enum netifapi_arp_entry type)</td></tr>
+<tr class="separator:ga62b0bdbb3783eb27aa73485081306119"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga037c3d05c19b4d467b6ce06eb4639ee8" id="r_ga037c3d05c19b4d467b6ce06eb4639ee8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga037c3d05c19b4d467b6ce06eb4639ee8">netifapi_arp_remove</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, enum netifapi_arp_entry type)</td></tr>
+<tr class="separator:ga037c3d05c19b4d467b6ce06eb4639ee8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ga62b0bdbb3783eb27aa73485081306119" name="ga62b0bdbb3783eb27aa73485081306119"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga62b0bdbb3783eb27aa73485081306119">&#9670;&#160;</a></span>netifapi_arp_add()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> netifapi_arp_add </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> *</td>          <td class="paramname"><span class="paramname"><em>ethaddr</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum netifapi_arp_entry</td>          <td class="paramname"><span class="paramname"><em>type</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add or update an entry in the ARP cache. For an update, ipaddr is used to find the cache entry.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ipaddr</td><td>IPv4 address of cache entry </td></tr>
+    <tr><td class="paramname">ethaddr</td><td>hardware address mapped to ipaddr </td></tr>
+    <tr><td class="paramname">type</td><td>type of ARP cache entry </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK: entry added/updated, else error from err_t </dd></dl>
+
+</div>
+</div>
+<a id="ga037c3d05c19b4d467b6ce06eb4639ee8" name="ga037c3d05c19b4d467b6ce06eb4639ee8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga037c3d05c19b4d467b6ce06eb4639ee8">&#9670;&#160;</a></span>netifapi_arp_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> netifapi_arp_remove </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">enum netifapi_arp_entry</td>          <td class="paramname"><span class="paramname"><em>type</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Remove an entry in the ARP cache identified by ipaddr</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ipaddr</td><td>IPv4 address of cache entry </td></tr>
+    <tr><td class="paramname">type</td><td>type of ARP cache entry </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK: entry removed, else error from err_t </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/group__netifapi__arp.js b/doc/doxygen/output/html/group__netifapi__arp.js
new file mode 100644
index 0000000..4bb29d1
--- /dev/null
+++ b/doc/doxygen/output/html/group__netifapi__arp.js
@@ -0,0 +1,5 @@
+var group__netifapi__arp =
+[
+    [ "netifapi_arp_add", "group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119", null ],
+    [ "netifapi_arp_remove", "group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__netifapi__autoip.html b/doc/doxygen/output/html/group__netifapi__autoip.html
index 7486af4..ed4ce50 100644
--- a/doc/doxygen/output/html/group__netifapi__autoip.html
+++ b/doc/doxygen/output/html/group__netifapi__autoip.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -128,7 +128,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="code hl_function" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start</a>)</div>
-<div class="ttc" id="agroup__autoip_html_ga1461f5826ebefc050e0d63013818d1e8"><div class="ttname"><a href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start</a></div><div class="ttdeci">err_t autoip_start(struct netif *netif)</div><div class="ttdef"><b>Definition</b> autoip.c:255</div></div>
+<div class="ttc" id="agroup__autoip_html_ga1461f5826ebefc050e0d63013818d1e8"><div class="ttname"><a href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start</a></div><div class="ttdeci">err_t autoip_start(struct netif *netif)</div><div class="ttdef"><b>Definition</b> autoip.c:243</div></div>
 <div class="ttc" id="anetifapi_8h_html_a26fd83042b53b2ff82e15262ed72f0a7"><div class="ttname"><a href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a></div><div class="ttdeci">err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc)</div><div class="ttdef"><b>Definition</b> netifapi.c:303</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8">autoip_start()</a> </dd></dl>
 
@@ -149,7 +149,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="code hl_function" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop</a>)</div>
-<div class="ttc" id="agroup__autoip_html_ga58a4dce658dd1263e84eb982f62587d4"><div class="ttname"><a href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop</a></div><div class="ttdeci">err_t autoip_stop(struct netif *netif)</div><div class="ttdef"><b>Definition</b> autoip.c:349</div></div>
+<div class="ttc" id="agroup__autoip_html_ga58a4dce658dd1263e84eb982f62587d4"><div class="ttname"><a href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop</a></div><div class="ttdeci">err_t autoip_stop(struct netif *netif)</div><div class="ttdef"><b>Definition</b> autoip.c:340</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4">autoip_stop()</a> </dd></dl>
 
 </div>
diff --git a/doc/doxygen/output/html/group__netifapi__dhcp4.html b/doc/doxygen/output/html/group__netifapi__dhcp4.html
index db4f256..fba38f7 100644
--- a/doc/doxygen/output/html/group__netifapi__dhcp4.html
+++ b/doc/doxygen/output/html/group__netifapi__dhcp4.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -136,7 +136,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="code hl_function" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform</a>, NULL)</div>
-<div class="ttc" id="agroup__dhcp4_html_gabd7fcc7e0799e313885fc7fd9d4992ad"><div class="ttname"><a href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform</a></div><div class="ttdeci">void dhcp_inform(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:819</div></div>
+<div class="ttc" id="agroup__dhcp4_html_gabd7fcc7e0799e313885fc7fd9d4992ad"><div class="ttname"><a href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform</a></div><div class="ttdeci">void dhcp_inform(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:894</div></div>
 <div class="ttc" id="anetifapi_8h_html_a26fd83042b53b2ff82e15262ed72f0a7"><div class="ttname"><a href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a></div><div class="ttdeci">err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc)</div><div class="ttdef"><b>Definition</b> netifapi.c:303</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad">dhcp_inform()</a> </dd></dl>
 
@@ -157,8 +157,8 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="code hl_function" href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a>)</div>
-<div class="ttc" id="agroup__dhcp4_html_gaf92f7afb58252f82a749064602974bd4"><div class="ttname"><a href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a></div><div class="ttdeci">err_t dhcp_release(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:1393</div></div>
-</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000004">Deprecated</a></b></dt><dd>Use <a class="el" href="#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead. </dd></dl>
+<div class="ttc" id="agroup__dhcp4_html_gaf92f7afb58252f82a749064602974bd4"><div class="ttname"><a href="group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4">dhcp_release</a></div><div class="ttdeci">err_t dhcp_release(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:1400</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000015">Deprecated</a></b></dt><dd>Use <a class="el" href="#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead. </dd></dl>
 
 </div>
 </div>
@@ -177,7 +177,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="code hl_function" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop</a>, NULL)</div>
-<div class="ttc" id="agroup__dhcp4_html_gaf7cd42b9f220446b6a597d3474da6ece"><div class="ttname"><a href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop</a></div><div class="ttdeci">void dhcp_release_and_stop(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:1316</div></div>
+<div class="ttc" id="agroup__dhcp4_html_gaf7cd42b9f220446b6a597d3474da6ece"><div class="ttname"><a href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop</a></div><div class="ttdeci">void dhcp_release_and_stop(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:1325</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece">dhcp_release_and_stop()</a> </dd></dl>
 
 </div>
@@ -197,7 +197,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="code hl_function" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp_renew</a>)</div>
-<div class="ttc" id="agroup__dhcp4_html_ga583eb8d58f5e96b7dea717948578a947"><div class="ttname"><a href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp_renew</a></div><div class="ttdeci">err_t dhcp_renew(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:1148</div></div>
+<div class="ttc" id="agroup__dhcp4_html_ga583eb8d58f5e96b7dea717948578a947"><div class="ttname"><a href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp_renew</a></div><div class="ttdeci">err_t dhcp_renew(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:1157</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947">dhcp_renew()</a> </dd></dl>
 
 </div>
@@ -217,7 +217,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, NULL, <a class="code hl_function" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a>)</div>
-<div class="ttc" id="agroup__dhcp4_html_ga0c50968d9811aa2aa67fadc0885d744f"><div class="ttname"><a href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a></div><div class="ttdeci">err_t dhcp_start(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:742</div></div>
+<div class="ttc" id="agroup__dhcp4_html_ga0c50968d9811aa2aa67fadc0885d744f"><div class="ttname"><a href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start</a></div><div class="ttdeci">err_t dhcp_start(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:810</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f">dhcp_start()</a> </dd></dl>
 
 </div>
@@ -237,8 +237,8 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="code hl_function" href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a>, NULL)</div>
-<div class="ttc" id="agroup__dhcp4_html_ga93f6bf21086dc9b10c0bec4676f97312"><div class="ttname"><a href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a></div><div class="ttdeci">void dhcp_stop(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:1405</div></div>
-</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated</a></b></dt><dd>Use <a class="el" href="#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead. </dd></dl>
+<div class="ttc" id="agroup__dhcp4_html_ga93f6bf21086dc9b10c0bec4676f97312"><div class="ttname"><a href="group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312">dhcp_stop</a></div><div class="ttdeci">void dhcp_stop(struct netif *netif)</div><div class="ttdef"><b>Definition</b> dhcp.c:1412</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000014">Deprecated</a></b></dt><dd>Use <a class="el" href="#ga1971af04f882f5afdb3ade454a680134">netifapi_dhcp_release_and_stop()</a> instead. </dd></dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__netifapi__netif.html b/doc/doxygen/output/html/group__netifapi__netif.html
index f017507..16c93a1 100644
--- a/doc/doxygen/output/html/group__netifapi__netif.html
+++ b/doc/doxygen/output/html/group__netifapi__netif.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -148,7 +148,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="code hl_function" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove</a>, NULL)</div>
-<div class="ttc" id="agroup__netif_html_ga9c6e541f0c184e1ea61a5cd8afe3e979"><div class="ttname"><a href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove</a></div><div class="ttdeci">void netif_remove(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:740</div></div>
+<div class="ttc" id="agroup__netif_html_ga9c6e541f0c184e1ea61a5cd8afe3e979"><div class="ttname"><a href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove</a></div><div class="ttdeci">void netif_remove(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:764</div></div>
 <div class="ttc" id="anetifapi_8h_html_a26fd83042b53b2ff82e15262ed72f0a7"><div class="ttname"><a href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a></div><div class="ttdeci">err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc)</div><div class="ttdef"><b>Definition</b> netifapi.c:303</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979">netif_remove()</a> </dd></dl>
 
@@ -169,7 +169,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="code hl_function" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a>, NULL)</div>
-<div class="ttc" id="agroup__netif_html_gac90f290edd005238d62aa94c4ac9dea3"><div class="ttname"><a href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a></div><div class="ttdeci">void netif_set_default(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:825</div></div>
+<div class="ttc" id="agroup__netif_html_gac90f290edd005238d62aa94c4ac9dea3"><div class="ttname"><a href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default</a></div><div class="ttdeci">void netif_set_default(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:849</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default()</a> </dd></dl>
 
 </div>
@@ -189,7 +189,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="code hl_function" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down</a>, NULL)</div>
-<div class="ttc" id="agroup__netif_html_ga641d07ed8c31fe5306bc01605a6790cf"><div class="ttname"><a href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down</a></div><div class="ttdeci">void netif_set_down(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:922</div></div>
+<div class="ttc" id="agroup__netif_html_ga641d07ed8c31fe5306bc01605a6790cf"><div class="ttname"><a href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down</a></div><div class="ttdeci">void netif_set_down(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:949</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf">netif_set_down()</a> </dd></dl>
 
 </div>
@@ -209,7 +209,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="code hl_function" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down</a>, NULL)</div>
-<div class="ttc" id="agroup__netif_html_ga34e37a1e8e358760dc1c43887922c7db"><div class="ttname"><a href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down</a></div><div class="ttdeci">void netif_set_link_down(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:1029</div></div>
+<div class="ttc" id="agroup__netif_html_ga34e37a1e8e358760dc1c43887922c7db"><div class="ttname"><a href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down</a></div><div class="ttdeci">void netif_set_link_down(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:1056</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#ga34e37a1e8e358760dc1c43887922c7db">netif_set_link_down()</a> </dd></dl>
 
 </div>
@@ -229,7 +229,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="code hl_function" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a>, NULL)</div>
-<div class="ttc" id="agroup__netif_html_gae0d2975f189277990e9d5276fdd9e9ea"><div class="ttname"><a href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a></div><div class="ttdeci">void netif_set_link_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:991</div></div>
+<div class="ttc" id="agroup__netif_html_gae0d2975f189277990e9d5276fdd9e9ea"><div class="ttname"><a href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a></div><div class="ttdeci">void netif_set_link_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:1018</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up()</a> </dd></dl>
 
 </div>
@@ -249,7 +249,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7">netifapi_netif_common</a>(n, <a class="code hl_function" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a>, NULL)</div>
-<div class="ttc" id="agroup__netif_html_gaf19693be401a265a52d2a56c65753121"><div class="ttname"><a href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a></div><div class="ttdeci">void netif_set_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:847</div></div>
+<div class="ttc" id="agroup__netif_html_gaf19693be401a265a52d2a56c65753121"><div class="ttname"><a href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a></div><div class="ttdeci">void netif_set_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:871</div></div>
 </div><!-- fragment --><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up()</a> </dd></dl>
 
 </div>
diff --git a/doc/doxygen/output/html/group__netifs.html b/doc/doxygen/output/html/group__netifs.html
index 4093aff..038fc03 100644
--- a/doc/doxygen/output/html/group__netifs.html
+++ b/doc/doxygen/output/html/group__netifs.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__pbuf.html b/doc/doxygen/output/html/group__pbuf.html
index 4fef0f4..59cc7d3 100644
--- a/doc/doxygen/output/html/group__pbuf.html
+++ b/doc/doxygen/output/html/group__pbuf.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -547,11 +547,8 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Create PBUF_RAM copies of pbufs.</p>
-<p>Used to queue packets on behalf of the lwIP stack, such as ARP based queueing.</p>
-<dl class="section note"><dt>Note</dt><dd>You MUST explicitly use p = pbuf_take(p);</dd>
-<dd>
-Only one packet is copied, no packet queue!</dd></dl>
+<p>Copy the contents of one packet buffer into another.</p>
+<dl class="section note"><dt>Note</dt><dd>Only one packet is copied, no packet queue!</dd></dl>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">p_to</td><td>pbuf destination of the copy </td></tr>
@@ -559,7 +556,7 @@
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>ERR_OK if pbuf was copied ERR_ARG if one of the pbufs is NULL or p_to is not big enough to hold p_from </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if pbuf was copied ERR_ARG if one of the pbufs is NULL or p_to is not big enough to hold p_from ERR_VAL if any of the pbufs are part of a queue </dd></dl>
 
 </div>
 </div>
@@ -674,9 +671,7 @@
   </dd>
 </dl>
 <dl class="section return"><dt>Returns</dt><dd>the number of pbufs that were de-allocated from the head of the chain.</dd></dl>
-<dl class="section note"><dt>Note</dt><dd>MUST NOT be called on a packet queue (Not verified to work yet). </dd>
-<dd>
-the reference counter of a pbuf equals the number of pointers that refer to the pbuf (or into the pbuf). </dd></dl>
+<dl class="section note"><dt>Note</dt><dd>the reference counter of a pbuf equals the number of pointers that refer to the pbuf (or into the pbuf). </dd></dl>
 
 </div>
 </div>
@@ -968,7 +963,7 @@
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>the pbuf in the queue where the offset is </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>the pbuf in the queue where the offset is or NULL when the offset is too high </dd></dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/group__perf.html b/doc/doxygen/output/html/group__perf.html
index 9db54ef..b0343a4 100644
--- a/doc/doxygen/output/html/group__perf.html
+++ b/doc/doxygen/output/html/group__perf.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__ppp.html b/doc/doxygen/output/html/group__ppp.html
index 14b9f54..a83f8e0 100644
--- a/doc/doxygen/output/html/group__ppp.html
+++ b/doc/doxygen/output/html/group__ppp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -297,7 +297,7 @@
  *
  * Return value: len if write succeed
  */
-static u32_t output_cb(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx) {
+static u32_t output_cb(ppp_pcb *pcb, const void *data, u32_t len, void *ctx) {
   return uart_write(UART, data, len);
 }
 
@@ -506,7 +506,7 @@
 
 
 /*
- * Fonction to call for received data
+ * Function to call for received data
  *
  * ppp, PPP control block
  * buffer, input buffer
diff --git a/doc/doxygen/output/html/group__raw__raw.html b/doc/doxygen/output/html/group__raw__raw.html
index 642f25c..b2868fd 100644
--- a/doc/doxygen/output/html/group__raw__raw.html
+++ b/doc/doxygen/output/html/group__raw__raw.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -130,7 +130,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>Implementation of raw protocol PCBs for low-level handling of different types of protocols besides (or overriding) those already available in lwIP.<br  />
-</p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__api.html">APIs</a> </dd></dl>
+ </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__api.html">APIs</a> </dd></dl>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="ga8576dbbc7f03797525d2cdb7ec3b9fe4" name="ga8576dbbc7f03797525d2cdb7ec3b9fe4"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga8576dbbc7f03797525d2cdb7ec3b9fe4">&#9670;&#160;</a></span>raw_bind()</h2>
@@ -301,7 +301,7 @@
 <dl class="section return"><dt>Returns</dt><dd>The RAW PCB which was created. NULL if the PCB data structure could not be allocated.</dd></dl>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">type</td><td>IP address type, see <a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a> definitions. If you want to listen to IPv4 and IPv6 (dual-stack) packets, supply <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a> as argument and bind to IP_ANY_TYPE. </td></tr>
+    <tr><td class="paramname">type</td><td>IP address type, see <a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a> definitions. If you want to listen to IPv4 and IPv6 (dual-stack) packets, supply <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a> as argument and bind to <a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">IP_ANY_TYPE</a>. </td></tr>
     <tr><td class="paramname">proto</td><td>the protocol number (next header) of the IPv6 packet payload (e.g. IP6_NEXTH_ICMP6)</td></tr>
   </table>
   </dd>
diff --git a/doc/doxygen/output/html/group__rfc7668if.html b/doc/doxygen/output/html/group__rfc7668if.html
index 7680ece..4bde7ae 100644
--- a/doc/doxygen/output/html/group__rfc7668if.html
+++ b/doc/doxygen/output/html/group__rfc7668if.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -105,10 +105,10 @@
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:gaa5b1823c2509b8816ef98dcac67e037c" id="r_gaa5b1823c2509b8816ef98dcac67e037c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa5b1823c2509b8816ef98dcac67e037c">ble_addr_to_eui64</a> (uint8_t *dst, const uint8_t *src, int public_addr)</td></tr>
-<tr class="separator:gaa5b1823c2509b8816ef98dcac67e037c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga3e245a85f9edddca93ddd2967209881d" id="r_ga3e245a85f9edddca93ddd2967209881d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga3e245a85f9edddca93ddd2967209881d">eui64_to_ble_addr</a> (uint8_t *dst, const uint8_t *src)</td></tr>
-<tr class="separator:ga3e245a85f9edddca93ddd2967209881d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga49e3a1fcedd9371023c776f0c3bb3f0f" id="r_ga49e3a1fcedd9371023c776f0c3bb3f0f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga49e3a1fcedd9371023c776f0c3bb3f0f">ble_addr_to_eui64</a> (u8_t *dst, const u8_t *src, int public_addr)</td></tr>
+<tr class="separator:ga49e3a1fcedd9371023c776f0c3bb3f0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga57d33f6024e419e8cbc32dfb783e39a4" id="r_ga57d33f6024e419e8cbc32dfb783e39a4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga57d33f6024e419e8cbc32dfb783e39a4">eui64_to_ble_addr</a> (u8_t *dst, const u8_t *src)</td></tr>
+<tr class="separator:ga57d33f6024e419e8cbc32dfb783e39a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga29dc0ebb8e640b64a57008b940fbca1e" id="r_ga29dc0ebb8e640b64a57008b940fbca1e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga29dc0ebb8e640b64a57008b940fbca1e">rfc7668_set_context</a> (u8_t idx, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *context)</td></tr>
 <tr class="separator:ga29dc0ebb8e640b64a57008b940fbca1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga22930ade4e77b3195fe59949834d85f0" id="r_ga22930ade4e77b3195fe59949834d85f0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga22930ade4e77b3195fe59949834d85f0">rfc7668_output</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structpbuf.html">pbuf</a> *q, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *ip6addr)</td></tr>
@@ -123,7 +123,7 @@
 <p>Usage:</p><ul>
 <li>add this netif<ul>
 <li>don't add IPv4 addresses (no IPv4 support in RFC7668), pass 'NULL','NULL','NULL'</li>
-<li>use the BLE to EUI64 conversation util to create an IPv6 link-local address from the BLE MAC (<a class="el" href="#gaa5b1823c2509b8816ef98dcac67e037c">ble_addr_to_eui64</a>)</li>
+<li>use the BLE to EUI64 conversation util to create an IPv6 link-local address from the BLE MAC (<a class="el" href="#ga49e3a1fcedd9371023c776f0c3bb3f0f">ble_addr_to_eui64</a>)</li>
 <li>input function: <a class="el" href="#ga1d9d7aff9f2f0515f761be0802178197">rfc7668_input</a></li>
 </ul>
 </li>
@@ -136,8 +136,8 @@
 </li>
 </ul>
 <h2 class="groupheader">Function Documentation</h2>
-<a id="gaa5b1823c2509b8816ef98dcac67e037c" name="gaa5b1823c2509b8816ef98dcac67e037c"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#gaa5b1823c2509b8816ef98dcac67e037c">&#9670;&#160;</a></span>ble_addr_to_eui64()</h2>
+<a id="ga49e3a1fcedd9371023c776f0c3bb3f0f" name="ga49e3a1fcedd9371023c776f0c3bb3f0f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga49e3a1fcedd9371023c776f0c3bb3f0f">&#9670;&#160;</a></span>ble_addr_to_eui64()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -145,12 +145,12 @@
         <tr>
           <td class="memname">void ble_addr_to_eui64 </td>
           <td>(</td>
-          <td class="paramtype">uint8_t *</td>          <td class="paramname"><span class="paramname"><em>dst</em></span>, </td>
+          <td class="paramtype">u8_t *</td>          <td class="paramname"><span class="paramname"><em>dst</em></span>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">const uint8_t *</td>          <td class="paramname"><span class="paramname"><em>src</em></span>, </td>
+          <td class="paramtype">const u8_t *</td>          <td class="paramname"><span class="paramname"><em>src</em></span>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -173,8 +173,8 @@
 
 </div>
 </div>
-<a id="ga3e245a85f9edddca93ddd2967209881d" name="ga3e245a85f9edddca93ddd2967209881d"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ga3e245a85f9edddca93ddd2967209881d">&#9670;&#160;</a></span>eui64_to_ble_addr()</h2>
+<a id="ga57d33f6024e419e8cbc32dfb783e39a4" name="ga57d33f6024e419e8cbc32dfb783e39a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga57d33f6024e419e8cbc32dfb783e39a4">&#9670;&#160;</a></span>eui64_to_ble_addr()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -182,12 +182,12 @@
         <tr>
           <td class="memname">void eui64_to_ble_addr </td>
           <td>(</td>
-          <td class="paramtype">uint8_t *</td>          <td class="paramname"><span class="paramname"><em>dst</em></span>, </td>
+          <td class="paramtype">u8_t *</td>          <td class="paramname"><span class="paramname"><em>dst</em></span>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">const uint8_t *</td>          <td class="paramname"><span class="paramname"><em>src</em></span>&#160;)</td>
+          <td class="paramtype">const u8_t *</td>          <td class="paramname"><span class="paramname"><em>src</em></span>&#160;)</td>
         </tr>
       </table>
 </div><div class="memdoc">
diff --git a/doc/doxygen/output/html/group__rfc7668if.js b/doc/doxygen/output/html/group__rfc7668if.js
index e48ae74..1b8e0a1 100644
--- a/doc/doxygen/output/html/group__rfc7668if.js
+++ b/doc/doxygen/output/html/group__rfc7668if.js
@@ -1,7 +1,7 @@
 var group__rfc7668if =
 [
-    [ "ble_addr_to_eui64", "group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c", null ],
-    [ "eui64_to_ble_addr", "group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d", null ],
+    [ "ble_addr_to_eui64", "group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f", null ],
+    [ "eui64_to_ble_addr", "group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4", null ],
     [ "rfc7668_if_init", "group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde", null ],
     [ "rfc7668_input", "group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197", null ],
     [ "rfc7668_output", "group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0", null ],
diff --git a/doc/doxygen/output/html/group__sequential__api.html b/doc/doxygen/output/html/group__sequential__api.html
index dde2551..9c56c77 100644
--- a/doc/doxygen/output/html/group__sequential__api.html
+++ b/doc/doxygen/output/html/group__sequential__api.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__sixlowpan.html b/doc/doxygen/output/html/group__sixlowpan.html
index 3caf36e..deda0f2 100644
--- a/doc/doxygen/output/html/group__sixlowpan.html
+++ b/doc/doxygen/output/html/group__sixlowpan.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__slipif.html b/doc/doxygen/output/html/group__slipif.html
index b61a3f2..41f8d6b 100644
--- a/doc/doxygen/output/html/group__slipif.html
+++ b/doc/doxygen/output/html/group__slipif.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -118,10 +118,11 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>This is an arch independent SLIP netif. The specific serial hooks must be provided by another file. They are sio_open, sio_read/sio_tryread and sio_send</p>
-<p>Usage: This netif can be used in three ways:<br  />
- 1) For NO_SYS==0, an RX thread can be used which blocks on sio_read() until data is received.<br  />
- 2) In your main loop, call <a class="el" href="#ga7b036fd1cde9b299139cac62f52d15a6">slipif_poll()</a> to check for new RX bytes, completed packets are fed into netif-&gt;input().<br  />
- 3) Call slipif_received_byte[s]() from your serial RX ISR and <a class="el" href="#gae135be7d61e5bb49ab72476b0aa70946">slipif_process_rxqueue()</a> from your main loop. ISR level decodes packets and puts completed packets on a queue which is fed into the stack from the main loop (needs SYS_LIGHTWEIGHT_PROT for pbuf_alloc to work on ISR level!). </p>
+<p>Usage: This netif can be used in three ways:</p><ol type="1">
+<li>For NO_SYS==0, an RX thread can be used which blocks on sio_read() until data is received.</li>
+<li>In your main loop, call <a class="el" href="#ga7b036fd1cde9b299139cac62f52d15a6">slipif_poll()</a> to check for new RX bytes, completed packets are fed into netif-&gt;input().</li>
+<li>Call slipif_received_byte[s]() from your serial RX ISR and <a class="el" href="#gae135be7d61e5bb49ab72476b0aa70946">slipif_process_rxqueue()</a> from your main loop. ISR level decodes packets and puts completed packets on a queue which is fed into the stack from the main loop (needs SYS_LIGHTWEIGHT_PROT for pbuf_alloc to work on ISR level!). </li>
+</ol>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="ga687973ba82dab13a5b9d38d7399aeee3" name="ga687973ba82dab13a5b9d38d7399aeee3"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga687973ba82dab13a5b9d38d7399aeee3">&#9670;&#160;</a></span>slipif_init()</h2>
diff --git a/doc/doxygen/output/html/group__smtp.html b/doc/doxygen/output/html/group__smtp.html
index 2bafda4..55b6f40 100644
--- a/doc/doxygen/output/html/group__smtp.html
+++ b/doc/doxygen/output/html/group__smtp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -157,7 +157,7 @@
 <div class="line">   <span class="keywordflow">return</span> BDH_WORKING;</div>
 <div class="line">}</div>
 <div class="line"> </div>
-<div class="line">smtp_send_mail_bodycback(<span class="stringliteral">&quot;sender&quot;</span>, <span class="stringliteral">&quot;recipient&quot;</span>, <span class="stringliteral">&quot;subject&quot;</span>, </div>
+<div class="line">smtp_send_mail_bodycback(<span class="stringliteral">&quot;sender&quot;</span>, <span class="stringliteral">&quot;recipient&quot;</span>, <span class="stringliteral">&quot;subject&quot;</span>,</div>
 <div class="line">               my_smtp_bodydh_fn, my_smtp_result_fn, some_argument);</div>
 </div><!-- fragment --><h2 class="groupheader">Function Documentation</h2>
 <a id="gae43119480c4146df9eeff7ae80c767f7" name="gae43119480c4146df9eeff7ae80c767f7"></a>
@@ -210,7 +210,7 @@
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>- ERR_OK if structures were allocated and no error occured starting the connection (this does not mean the email has been successfully sent!)<ul>
+<dl class="section return"><dt>Returns</dt><dd>- ERR_OK if structures were allocated and no error occurred starting the connection (this does not mean the email has been successfully sent!)<ul>
 <li>another err_t on error. </li>
 </ul>
 </dd></dl>
diff --git a/doc/doxygen/output/html/group__smtp__opts.html b/doc/doxygen/output/html/group__smtp__opts.html
index 6acd425..868d0a6 100644
--- a/doc/doxygen/output/html/group__smtp__opts.html
+++ b/doc/doxygen/output/html/group__smtp__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__snmp.html b/doc/doxygen/output/html/group__snmp.html
index 7adf3f6..b4865ea 100644
--- a/doc/doxygen/output/html/group__snmp.html
+++ b/doc/doxygen/output/html/group__snmp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -116,10 +116,10 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>SNMPv2c and SNMPv3 compatible agent<br  />
-There is also a MIB compiler and a MIB viewer in lwIP contrib repository (lwip-contrib/apps/LwipMibCompiler).<br  />
-The agent implements the most important MIB2 MIBs including IPv6 support (interfaces, UDP, TCP, SNMP, ICMP, SYSTEM). IP MIB is an older version without IPv6 statistics (TODO).<br  />
-Rewritten by Martin Hentschel <a href="#" onclick="location.href='mai'+'lto:'+'inf'+'o@'+'cl-'+'so'+'ft.'+'de'; return false;">info@<span class="obfuscator">.nosp@m.</span>cl-s<span class="obfuscator">.nosp@m.</span>oft.d<span class="obfuscator">.nosp@m.</span>e</a> and Dirk Ziegelmeier <a href="#" onclick="location.href='mai'+'lto:'+'dzi'+'eg'+'el@'+'gm'+'x.d'+'e'; return false;">dzieg<span class="obfuscator">.nosp@m.</span>el@g<span class="obfuscator">.nosp@m.</span>mx.de</a><br  />
- </p><h1>0 Agent Capabilities </h1>
+ There is also a MIB compiler and a MIB viewer in lwIP/contrib subdir (lwip/contrib/apps/LwipMibCompiler).<br  />
+ The agent implements the most important MIB2 MIBs including IPv6 support (interfaces, UDP, TCP, SNMP, ICMP, SYSTEM). IP MIB is an older version without IPv6 statistics (TODO).<br  />
+ Rewritten by Martin Hentschel <a href="#" onclick="location.href='mai'+'lto:'+'inf'+'o@'+'cl-'+'so'+'ft.'+'de'; return false;">info@<span class="obfuscator">.nosp@m.</span>cl-s<span class="obfuscator">.nosp@m.</span>oft.d<span class="obfuscator">.nosp@m.</span>e</a> and Dirk Ziegelmeier <a href="#" onclick="location.href='mai'+'lto:'+'dzi'+'eg'+'el@'+'gm'+'x.d'+'e'; return false;">dzieg<span class="obfuscator">.nosp@m.</span>el@g<span class="obfuscator">.nosp@m.</span>mx.de</a></p>
+<h1>0 Agent Capabilities </h1>
 <h2>Features: </h2>
 <ul>
 <li>SNMPv2c support.</li>
@@ -137,11 +137,11 @@
 </ul>
 <h2>MIB compiler (code generator): </h2>
 <ul>
-<li>Provided in lwIP contrib repository.</li>
-<li>Written in C#. MIB viewer used Windows Forms.</li>
+<li>Provided in contrib dir.</li>
+<li>Written in C#. MIB viewer using Windows Forms.</li>
 <li>Developed on Windows with Visual Studio 2010.</li>
 <li>Can be compiled and used on all platforms with <a href="http://www.monodevelop.com/">http://www.monodevelop.com/</a>.</li>
-<li>Based on a heavily modified version of of SharpSnmpLib (a4bd05c6afb4) (<a href="https://sharpsnmplib.codeplex.com/SourceControl/network/forks/Nemo157/MIBParserUpdate">https://sharpsnmplib.codeplex.com/SourceControl/network/forks/Nemo157/MIBParserUpdate</a>).</li>
+<li>Based on a heavily modified version of of SharpSnmpLib (a4bd05c6afb4) (<a href="https://sharpsnmplib.codeplex.com/SourceControl/network/forks/Nemo157/MIBParserUpdate">https://sharpsnmplib.codeplex.com/SourceControl/network/forks/Nemo157/MIBParserUpdate</a>). This has been the last known revision of that code before being converted to closed source. The new code on github has completely changed, so we can not just update :-(</li>
 <li>MIB parser, C file generation framework and LWIP code generation are cleanly separated, which means the code may be useful as a base for code generation of other SNMP agents.</li>
 </ul>
 <h2>Notes: </h2>
@@ -155,7 +155,7 @@
 <h2>MIB II </h2>
 <p>The standard lwIP stack management information base. This is a required MIB, so this is always enabled. The groups EGP, CMOT and transmission are disabled by default.</p>
 <p>Most mib-2 objects are not writable except: sysName, sysLocation, sysContact, snmpEnableAuthenTraps. Writing to or changing the ARP and IP address and route tables is not possible.</p>
-<p>Note lwIP has a very limited notion of IP routing. It currently doen't have a route table and doesn't have a notion of the U,G,H flags. Instead lwIP uses the interface list with only one default interface acting as a single gateway interface (G) for the default route.</p>
+<p>Note lwIP has a very limited notion of IP routing. It currently doesn't have a route table and doesn't have a notion of the U,G,H flags. Instead lwIP uses the interface list with only one default interface acting as a single gateway interface (G) for the default route.</p>
 <p>The agent returns a "virtual table" with the default route 0.0.0.0 for the default interface and network routes (no H) for each network interface in the netif_list. All routes are considered to be up (U).</p>
 <h2>Loading additional MIBs </h2>
 <p>MIBs can only be added in compile-time, not in run-time.</p>
diff --git a/doc/doxygen/output/html/group__snmp__core.html b/doc/doxygen/output/html/group__snmp__core.html
index 410a726..a4d5e16 100644
--- a/doc/doxygen/output/html/group__snmp__core.html
+++ b/doc/doxygen/output/html/group__snmp__core.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -121,6 +121,8 @@
 <tr class="separator:ga341461766863cff46a44e5f431f2da01"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaff6a6b39322e92862ab55cfcddfe254b" id="r_gaff6a6b39322e92862ab55cfcddfe254b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaff6a6b39322e92862ab55cfcddfe254b">snmp_set_write_callback</a> (snmp_write_callback_fct write_callback, void *callback_arg)</td></tr>
 <tr class="separator:gaff6a6b39322e92862ab55cfcddfe254b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga323ed081cc9903ceb6ebb26a046e0838" id="r_ga323ed081cc9903ceb6ebb26a046e0838"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga323ed081cc9903ceb6ebb26a046e0838">snmp_set_inform_callback</a> (snmp_inform_callback_fct inform_callback, void *callback_arg)</td></tr>
+<tr class="separator:ga323ed081cc9903ceb6ebb26a046e0838"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga4d88f2fc7655280384131d543e0d83e5" id="r_ga4d88f2fc7655280384131d543e0d83e5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga4d88f2fc7655280384131d543e0d83e5">snmp_init</a> (void)</td></tr>
 <tr class="separator:ga4d88f2fc7655280384131d543e0d83e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
@@ -265,6 +267,28 @@
 
 </div>
 </div>
+<a id="ga323ed081cc9903ceb6ebb26a046e0838" name="ga323ed081cc9903ceb6ebb26a046e0838"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga323ed081cc9903ceb6ebb26a046e0838">&#9670;&#160;</a></span>snmp_set_inform_callback()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_set_inform_callback </td>
+          <td>(</td>
+          <td class="paramtype">snmp_inform_callback_fct</td>          <td class="paramname"><span class="paramname"><em>inform_callback</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>callback_arg</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Callback fired on every received INFORM confirmation (get-response) </p>
+
+</div>
+</div>
 <a id="ga29c76474971f25d038fd486447c70e21" name="ga29c76474971f25d038fd486447c70e21"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga29c76474971f25d038fd486447c70e21">&#9670;&#160;</a></span>snmp_set_mibs()</h2>
 
diff --git a/doc/doxygen/output/html/group__snmp__core.js b/doc/doxygen/output/html/group__snmp__core.js
index b79f2f7..5626f1a 100644
--- a/doc/doxygen/output/html/group__snmp__core.js
+++ b/doc/doxygen/output/html/group__snmp__core.js
@@ -7,6 +7,7 @@
     [ "snmp_set_community", "group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1", null ],
     [ "snmp_set_community_write", "group__snmp__core.html#ga341461766863cff46a44e5f431f2da01", null ],
     [ "snmp_set_device_enterprise_oid", "group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a", null ],
+    [ "snmp_set_inform_callback", "group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838", null ],
     [ "snmp_set_mibs", "group__snmp__core.html#ga29c76474971f25d038fd486447c70e21", null ],
     [ "snmp_set_write_callback", "group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__snmp__mib2.html b/doc/doxygen/output/html/group__snmp__mib2.html
index ba568c9..87fa97c 100644
--- a/doc/doxygen/output/html/group__snmp__mib2.html
+++ b/doc/doxygen/output/html/group__snmp__mib2.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__snmp__opts.html b/doc/doxygen/output/html/group__snmp__opts.html
index 8decf12..25beb66 100644
--- a/doc/doxygen/output/html/group__snmp__opts.html
+++ b/doc/doxygen/output/html/group__snmp__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__snmp__traps.html b/doc/doxygen/output/html/group__snmp__traps.html
index d776bb1..4eba924 100644
--- a/doc/doxygen/output/html/group__snmp__traps.html
+++ b/doc/doxygen/output/html/group__snmp__traps.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -117,8 +117,12 @@
 <tr class="separator:gacaf816ff917f7b7e5d00ed6c9f79b51c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga7804a22615bd9b3a323a3f48a9fb8cb7" id="r_ga7804a22615bd9b3a323a3f48a9fb8cb7"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga7804a22615bd9b3a323a3f48a9fb8cb7">snmp_get_auth_traps_enabled</a> (void)</td></tr>
 <tr class="separator:ga7804a22615bd9b3a323a3f48a9fb8cb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga96cc7af0118d75049609872ea41187cd" id="r_ga96cc7af0118d75049609872ea41187cd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga96cc7af0118d75049609872ea41187cd">snmp_send_trap</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *eoid, s32_t generic_trap, s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds)</td></tr>
-<tr class="separator:ga96cc7af0118d75049609872ea41187cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6d411c0ba7a8fb1ed3777ebde5b5f455" id="r_ga6d411c0ba7a8fb1ed3777ebde5b5f455"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga6d411c0ba7a8fb1ed3777ebde5b5f455">snmp_set_default_trap_version</a> (u8_t snmp_version)</td></tr>
+<tr class="separator:ga6d411c0ba7a8fb1ed3777ebde5b5f455"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf6d83aae6464852427a812f573a40359" id="r_gaf6d83aae6464852427a812f573a40359"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaf6d83aae6464852427a812f573a40359">snmp_get_default_trap_version</a> (void)</td></tr>
+<tr class="separator:gaf6d83aae6464852427a812f573a40359"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga21974b1f6b626bce1e006f09db712e9c" id="r_ga21974b1f6b626bce1e006f09db712e9c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga21974b1f6b626bce1e006f09db712e9c">snmp_send_trap</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *oid, s32_t generic_trap, s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds)</td></tr>
+<tr class="separator:ga21974b1f6b626bce1e006f09db712e9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga0e044259289cb690197173f93c17607d" id="r_ga0e044259289cb690197173f93c17607d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga0e044259289cb690197173f93c17607d">snmp_send_trap_generic</a> (s32_t generic_trap)</td></tr>
 <tr class="separator:ga0e044259289cb690197173f93c17607d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga56bdce04e9e77cb3f8a872718cd273d1" id="r_ga56bdce04e9e77cb3f8a872718cd273d1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga56bdce04e9e77cb3f8a872718cd273d1">snmp_send_trap_specific</a> (s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds)</td></tr>
@@ -127,6 +131,12 @@
 <tr class="separator:gaa8a49d1a6a207740ba44e27b5bbc22be"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaf6d0a95a3a406d8ea00849c07aca05ee" id="r_gaf6d0a95a3a406d8ea00849c07aca05ee"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaf6d0a95a3a406d8ea00849c07aca05ee">snmp_authfail_trap</a> (void)</td></tr>
 <tr class="separator:gaf6d0a95a3a406d8ea00849c07aca05ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7492bb861ba73923221a8ab49ea79210" id="r_ga7492bb861ba73923221a8ab49ea79210"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga7492bb861ba73923221a8ab49ea79210">snmp_send_inform_specific</a> (s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds, s32_t *ptr_request_id)</td></tr>
+<tr class="separator:ga7492bb861ba73923221a8ab49ea79210"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7e4b943a9758010b02371b876abc275" id="r_gab7e4b943a9758010b02371b876abc275"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gab7e4b943a9758010b02371b876abc275">snmp_send_inform_generic</a> (s32_t generic_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds, s32_t *ptr_request_id)</td></tr>
+<tr class="separator:gab7e4b943a9758010b02371b876abc275"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae450dd71ad91f6c0bc243493a913f692" id="r_gae450dd71ad91f6c0bc243493a913f692"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gae450dd71ad91f6c0bc243493a913f692">snmp_send_inform</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *oid, s32_t generic_trap, s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds, s32_t *ptr_request_id)</td></tr>
+<tr class="separator:gae450dd71ad91f6c0bc243493a913f692"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <h2 class="groupheader">Function Documentation</h2>
@@ -180,7 +190,8 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Get authentication traps enabled state </p>
+<p>Get authentication traps enabled state</p>
+<dl class="section return"><dt>Returns</dt><dd>TRUE if traps are enabled, FALSE if they aren't </dd></dl>
 
 </div>
 </div>
@@ -202,8 +213,144 @@
 
 </div>
 </div>
-<a id="ga96cc7af0118d75049609872ea41187cd" name="ga96cc7af0118d75049609872ea41187cd"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ga96cc7af0118d75049609872ea41187cd">&#9670;&#160;</a></span>snmp_send_trap()</h2>
+<a id="gaf6d83aae6464852427a812f573a40359" name="gaf6d83aae6464852427a812f573a40359"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf6d83aae6464852427a812f573a40359">&#9670;&#160;</a></span>snmp_get_default_trap_version()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t snmp_get_default_trap_version </td>
+          <td>(</td>
+          <td class="paramtype">void</td>          <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Get default SNMP version for sending traps</p>
+<dl class="section return"><dt>Returns</dt><dd>selected default version: 0 - SNMP_VERSION_1 1 - SNMP_VERSION_2c 3 - SNMP_VERSION_3 </dd></dl>
+
+</div>
+</div>
+<a id="gae450dd71ad91f6c0bc243493a913f692" name="gae450dd71ad91f6c0bc243493a913f692"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gae450dd71ad91f6c0bc243493a913f692">&#9670;&#160;</a></span>snmp_send_inform()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> snmp_send_inform </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *</td>          <td class="paramname"><span class="paramname"><em>oid</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t</td>          <td class="paramname"><span class="paramname"><em>generic_trap</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t</td>          <td class="paramname"><span class="paramname"><em>specific_trap</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *</td>          <td class="paramname"><span class="paramname"><em>varbinds</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t *</td>          <td class="paramname"><span class="paramname"><em>ptr_request_id</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Generic function for sending informs </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">oid</td><td>points to object identifier </td></tr>
+    <tr><td class="paramname">generic_trap</td><td>is the trap code </td></tr>
+    <tr><td class="paramname">specific_trap</td><td>used for enterprise traps when generic_trap == 6 </td></tr>
+    <tr><td class="paramname">varbinds</td><td>linked list of varbinds (at the beginning of this list function will insert 2 special purpose varbinds [see RFC 3584]) </td></tr>
+    <tr><td class="paramname">ptr_request_id</td><td>[out] variable in which to store request_id needed to verify acknowledgement </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful </dd></dl>
+
+</div>
+</div>
+<a id="gab7e4b943a9758010b02371b876abc275" name="gab7e4b943a9758010b02371b876abc275"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gab7e4b943a9758010b02371b876abc275">&#9670;&#160;</a></span>snmp_send_inform_generic()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> snmp_send_inform_generic </td>
+          <td>(</td>
+          <td class="paramtype">s32_t</td>          <td class="paramname"><span class="paramname"><em>generic_trap</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *</td>          <td class="paramname"><span class="paramname"><em>varbinds</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t *</td>          <td class="paramname"><span class="paramname"><em>ptr_request_id</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Wrapper function for sending informs </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">generic_trap</td><td>is the trap code </td></tr>
+    <tr><td class="paramname">varbinds</td><td>linked list of varbinds (at the beginning of this list function will insert 2 special purpose varbinds [see RFC 3584]) </td></tr>
+    <tr><td class="paramname">ptr_request_id</td><td>[out] variable in which to store request_id needed to verify acknowledgement </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful </dd></dl>
+
+</div>
+</div>
+<a id="ga7492bb861ba73923221a8ab49ea79210" name="ga7492bb861ba73923221a8ab49ea79210"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7492bb861ba73923221a8ab49ea79210">&#9670;&#160;</a></span>snmp_send_inform_specific()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> snmp_send_inform_specific </td>
+          <td>(</td>
+          <td class="paramtype">s32_t</td>          <td class="paramname"><span class="paramname"><em>specific_trap</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *</td>          <td class="paramname"><span class="paramname"><em>varbinds</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">s32_t *</td>          <td class="paramname"><span class="paramname"><em>ptr_request_id</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Wrapper function for sending informs </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">specific_trap</td><td>will be appended to enterprise oid [see RFC 3584] </td></tr>
+    <tr><td class="paramname">varbinds</td><td>linked list of varbinds (at the beginning of this list function will insert 2 special purpose varbinds [see RFC 3584]) </td></tr>
+    <tr><td class="paramname">ptr_request_id</td><td>[out] variable in which to store request_id needed to verify acknowledgement </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if successful </dd></dl>
+
+</div>
+</div>
+<a id="ga21974b1f6b626bce1e006f09db712e9c" name="ga21974b1f6b626bce1e006f09db712e9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga21974b1f6b626bce1e006f09db712e9c">&#9670;&#160;</a></span>snmp_send_trap()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -211,7 +358,7 @@
         <tr>
           <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> snmp_send_trap </td>
           <td>(</td>
-          <td class="paramtype">const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *</td>          <td class="paramname"><span class="paramname"><em>eoid</em></span>, </td>
+          <td class="paramtype">const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *</td>          <td class="paramname"><span class="paramname"><em>oid</em></span>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -230,10 +377,10 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Sends a generic or enterprise specific trap message.</p>
+<p>This function is a wrapper function for preparing and sending generic or specific traps.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">eoid</td><td>points to enterprise object identifier </td></tr>
+    <tr><td class="paramname">oid</td><td>points to enterprise object identifier </td></tr>
     <tr><td class="paramname">generic_trap</td><td>is the trap code </td></tr>
     <tr><td class="paramname">specific_trap</td><td>used for enterprise traps when generic_trap == 6 </td></tr>
     <tr><td class="paramname">varbinds</td><td>linked list of varbinds to be sent </td></tr>
@@ -242,7 +389,6 @@
 </dl>
 <dl class="section return"><dt>Returns</dt><dd>ERR_OK when success, ERR_MEM if we're out of memory</dd></dl>
 <dl class="section note"><dt>Note</dt><dd>the use of the enterprise identifier field is per RFC1215. Use .iso.org.dod.internet.mgmt.mib-2.snmp for generic traps and .iso.org.dod.internet.private.enterprises.yourenterprise (sysObjectID) for specific traps. </dd></dl>
-<p>send to the TRAP destination</p>
 
 </div>
 </div>
@@ -260,7 +406,12 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Send generic SNMP trap </p>
+<p>Send generic SNMP trap </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">generic_trap</td><td>is the trap code return ERR_OK when success </td></tr>
+  </table>
+  </dd>
+</dl>
 
 </div>
 </div>
@@ -282,7 +433,14 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Send specific SNMP trap with variable bindings </p>
+<p>Send specific SNMP trap with variable bindings </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">specific_trap</td><td>used for enterprise traps (generic_trap = 6) </td></tr>
+    <tr><td class="paramname">varbinds</td><td>linked list of varbinds to be sent </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK when success </dd></dl>
 
 </div>
 </div>
@@ -300,7 +458,13 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Enable/disable authentication traps </p>
+<p>Enable/disable authentication traps</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">enable</td><td>enable SNMP traps </td></tr>
+  </table>
+  </dd>
+</dl>
 
 </div>
 </div>
@@ -328,6 +492,30 @@
 
 </div>
 </div>
+<a id="ga6d411c0ba7a8fb1ed3777ebde5b5f455" name="ga6d411c0ba7a8fb1ed3777ebde5b5f455"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga6d411c0ba7a8fb1ed3777ebde5b5f455">&#9670;&#160;</a></span>snmp_set_default_trap_version()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void snmp_set_default_trap_version </td>
+          <td>(</td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>snmp_version</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Choose default SNMP version for sending traps (if not specified, default version is SNMP_VERSION_1) SNMP_VERSION_1 0 SNMP_VERSION_2c 1 SNMP_VERSION_3 3</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">snmp_version</td><td>version that will be used for sending traps </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 <a id="gab101505be59778cf0f2f1ac40bcf3f32" name="gab101505be59778cf0f2f1ac40bcf3f32"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gab101505be59778cf0f2f1ac40bcf3f32">&#9670;&#160;</a></span>snmp_trap_dst_enable()</h2>
 
diff --git a/doc/doxygen/output/html/group__snmp__traps.js b/doc/doxygen/output/html/group__snmp__traps.js
index ffc9e5b..b6f3da8 100644
--- a/doc/doxygen/output/html/group__snmp__traps.js
+++ b/doc/doxygen/output/html/group__snmp__traps.js
@@ -4,11 +4,16 @@
     [ "snmp_coldstart_trap", "group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be", null ],
     [ "snmp_get_auth_traps_enabled", "group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7", null ],
     [ "snmp_get_community_trap", "group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba", null ],
-    [ "snmp_send_trap", "group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd", null ],
+    [ "snmp_get_default_trap_version", "group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359", null ],
+    [ "snmp_send_inform", "group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692", null ],
+    [ "snmp_send_inform_generic", "group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275", null ],
+    [ "snmp_send_inform_specific", "group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210", null ],
+    [ "snmp_send_trap", "group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c", null ],
     [ "snmp_send_trap_generic", "group__snmp__traps.html#ga0e044259289cb690197173f93c17607d", null ],
     [ "snmp_send_trap_specific", "group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1", null ],
     [ "snmp_set_auth_traps_enabled", "group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c", null ],
     [ "snmp_set_community_trap", "group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760", null ],
+    [ "snmp_set_default_trap_version", "group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455", null ],
     [ "snmp_trap_dst_enable", "group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32", null ],
     [ "snmp_trap_dst_ip_set", "group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sntp.html b/doc/doxygen/output/html/group__sntp.html
index 85a6cfb..66a2563 100644
--- a/doc/doxygen/output/html/group__sntp.html
+++ b/doc/doxygen/output/html/group__sntp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -127,9 +127,12 @@
 <tr class="separator:ga4fa038dcea66349fafdbe1cc3e52ff3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gab114c12154cf2c3e3a733724c6a77429" id="r_gab114c12154cf2c3e3a733724c6a77429"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gab114c12154cf2c3e3a733724c6a77429">sntp_getserver</a> (u8_t idx)</td></tr>
 <tr class="separator:gab114c12154cf2c3e3a733724c6a77429"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga68146d2ee1bba10e5aa01f098b597d9e" id="r_ga68146d2ee1bba10e5aa01f098b597d9e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga68146d2ee1bba10e5aa01f098b597d9e">sntp_getkodreceived</a> (u8_t idx)</td></tr>
+<tr class="separator:ga68146d2ee1bba10e5aa01f098b597d9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>This is simple "SNTP" client for the lwIP raw API. It is a minimal implementation of SNTPv4 as specified in RFC 4330.</p>
+<p>You need to increase MEMP_NUM_SYS_TIMEOUT by one if you use SNTP!</p>
 <p>For a list of some public NTP servers, see this link: <a href="http://support.ntp.org/bin/view/Servers/NTPPoolServers">http://support.ntp.org/bin/view/Servers/NTPPoolServers</a></p>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="ga3fe5254e5a056fca80802d9f26b9c3c5" name="ga3fe5254e5a056fca80802d9f26b9c3c5"></a>
@@ -150,6 +153,31 @@
 
 </div>
 </div>
+<a id="ga68146d2ee1bba10e5aa01f098b597d9e" name="ga68146d2ee1bba10e5aa01f098b597d9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga68146d2ee1bba10e5aa01f098b597d9e">&#9670;&#160;</a></span>sntp_getkodreceived()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t sntp_getkodreceived </td>
+          <td>(</td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>idx</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Check if a Kiss-of-Death has been received from this server (only valid for SNTP_MAX_SERVERS &gt; 1).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">idx</td><td>the index of the NTP server </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if a KoD has been received, 0 if not. </dd></dl>
+
+</div>
+</div>
 <a id="gae66404a551d5cef420cf844a71356fae" name="gae66404a551d5cef420cf844a71356fae"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gae66404a551d5cef420cf844a71356fae">&#9670;&#160;</a></span>sntp_getoperatingmode()</h2>
 
diff --git a/doc/doxygen/output/html/group__sntp.js b/doc/doxygen/output/html/group__sntp.js
index aa4d1f4..e0d9105 100644
--- a/doc/doxygen/output/html/group__sntp.js
+++ b/doc/doxygen/output/html/group__sntp.js
@@ -2,6 +2,7 @@
 [
     [ "Options", "group__sntp__opts.html", "group__sntp__opts" ],
     [ "sntp_enabled", "group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5", null ],
+    [ "sntp_getkodreceived", "group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e", null ],
     [ "sntp_getoperatingmode", "group__sntp.html#gae66404a551d5cef420cf844a71356fae", null ],
     [ "sntp_getreachability", "group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e", null ],
     [ "sntp_getserver", "group__sntp.html#gab114c12154cf2c3e3a733724c6a77429", null ],
diff --git a/doc/doxygen/output/html/group__sntp__opts.html b/doc/doxygen/output/html/group__sntp__opts.html
index 60aa329..4b31795 100644
--- a/doc/doxygen/output/html/group__sntp__opts.html
+++ b/doc/doxygen/output/html/group__sntp__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__socket.html b/doc/doxygen/output/html/group__socket.html
index b4429ca..feb3261 100644
--- a/doc/doxygen/output/html/group__socket.html
+++ b/doc/doxygen/output/html/group__socket.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -112,10 +112,10 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>BSD-style socket API.<br  />
-Thread-safe, to be called from non-TCPIP threads only.<br  />
-Can be activated by defining <a class="el" href="group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f">LWIP_SOCKET</a> to 1.<br  />
-Header is in <a class="el" href="socket_8h.html">posix/sys/socket.h</a><br  />
-The socket API is a compatibility API for existing applications, currently it is built on top of the sequential API. It is meant to provide all functions needed to run socket API applications running on other platforms (e.g. unix / windows etc.). However, due to limitations in the specification of this API, there might be incompatibilities that require small modifications of existing programs. </p>
+ Thread-safe, to be called from non-TCPIP threads only.<br  />
+ Can be activated by defining <a class="el" href="group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f">LWIP_SOCKET</a> to 1.<br  />
+ Header is in <a class="el" href="socket_8h.html">posix/sys/socket.h</a><br  />
+ The socket API is a compatibility API for existing applications, currently it is built on top of the sequential API. It is meant to provide all functions needed to run socket API applications running on other platforms (e.g. unix / windows etc.). However, due to limitations in the specification of this API, there might be incompatibilities that require small modifications of existing programs. </p>
 </div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/doxygen/output/html/group__sys__layer.html b/doc/doxygen/output/html/group__sys__layer.html
index f905cbc..e9f1033 100644
--- a/doc/doxygen/output/html/group__sys__layer.html
+++ b/doc/doxygen/output/html/group__sys__layer.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__sys__mbox.html b/doc/doxygen/output/html/group__sys__mbox.html
index f97f52a..66a020f 100644
--- a/doc/doxygen/output/html/group__sys__mbox.html
+++ b/doc/doxygen/output/html/group__sys__mbox.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__sys__misc.html b/doc/doxygen/output/html/group__sys__misc.html
index fb271b5..4426c50 100644
--- a/doc/doxygen/output/html/group__sys__misc.html
+++ b/doc/doxygen/output/html/group__sys__misc.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__sys__mutex.html b/doc/doxygen/output/html/group__sys__mutex.html
index f1db906..07e6642 100644
--- a/doc/doxygen/output/html/group__sys__mutex.html
+++ b/doc/doxygen/output/html/group__sys__mutex.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__sys__nonstandard.html b/doc/doxygen/output/html/group__sys__nonstandard.html
index 2d194ad..ec210cb 100644
--- a/doc/doxygen/output/html/group__sys__nonstandard.html
+++ b/doc/doxygen/output/html/group__sys__nonstandard.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -107,6 +107,8 @@
 Functions</h2></td></tr>
 <tr class="memitem:gaa2ba4b4e2dd7e1c856fedc6a6069813e" id="r_gaa2ba4b4e2dd7e1c856fedc6a6069813e"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa2ba4b4e2dd7e1c856fedc6a6069813e">lwip_strnstr</a> (const char *buffer, const char *token, size_t n)</td></tr>
 <tr class="separator:gaa2ba4b4e2dd7e1c856fedc6a6069813e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac0cd63b4a1a44f5081858199e68f46aa" id="r_gac0cd63b4a1a44f5081858199e68f46aa"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gac0cd63b4a1a44f5081858199e68f46aa">lwip_strnistr</a> (const char *buffer, const char *token, size_t n)</td></tr>
+<tr class="separator:gac0cd63b4a1a44f5081858199e68f46aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga263cbafcb697eff964139a9998a6668a" id="r_ga263cbafcb697eff964139a9998a6668a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga263cbafcb697eff964139a9998a6668a">lwip_stricmp</a> (const char *str1, const char *str2)</td></tr>
 <tr class="separator:ga263cbafcb697eff964139a9998a6668a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga997dcc49451121d4ed755b33bc7bd26a" id="r_ga997dcc49451121d4ed755b33bc7bd26a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga997dcc49451121d4ed755b33bc7bd26a">lwip_strnicmp</a> (const char *str1, const char *str2, size_t len)</td></tr>
@@ -193,6 +195,33 @@
 
 </div>
 </div>
+<a id="gac0cd63b4a1a44f5081858199e68f46aa" name="gac0cd63b4a1a44f5081858199e68f46aa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gac0cd63b4a1a44f5081858199e68f46aa">&#9670;&#160;</a></span>lwip_strnistr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char * lwip_strnistr </td>
+          <td>(</td>
+          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>buffer</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>token</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t</td>          <td class="paramname"><span class="paramname"><em>n</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>lwIP default implementation for strnistr() non-standard function. This can be #defined to strnistr() depending on your platform port. </p>
+
+</div>
+</div>
 <a id="gaa2ba4b4e2dd7e1c856fedc6a6069813e" name="gaa2ba4b4e2dd7e1c856fedc6a6069813e"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gaa2ba4b4e2dd7e1c856fedc6a6069813e">&#9670;&#160;</a></span>lwip_strnstr()</h2>
 
diff --git a/doc/doxygen/output/html/group__sys__nonstandard.js b/doc/doxygen/output/html/group__sys__nonstandard.js
index 7d5b98c..9c2e98b 100644
--- a/doc/doxygen/output/html/group__sys__nonstandard.js
+++ b/doc/doxygen/output/html/group__sys__nonstandard.js
@@ -3,5 +3,6 @@
     [ "lwip_itoa", "group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284", null ],
     [ "lwip_stricmp", "group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a", null ],
     [ "lwip_strnicmp", "group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a", null ],
+    [ "lwip_strnistr", "group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa", null ],
     [ "lwip_strnstr", "group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__sys__os.html b/doc/doxygen/output/html/group__sys__os.html
index c4fb0d5..19392b4 100644
--- a/doc/doxygen/output/html/group__sys__os.html
+++ b/doc/doxygen/output/html/group__sys__os.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__sys__prot.html b/doc/doxygen/output/html/group__sys__prot.html
index 4798e04..5ebc388 100644
--- a/doc/doxygen/output/html/group__sys__prot.html
+++ b/doc/doxygen/output/html/group__sys__prot.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__sys__sem.html b/doc/doxygen/output/html/group__sys__sem.html
index 7e3aaf7..72cc466 100644
--- a/doc/doxygen/output/html/group__sys__sem.html
+++ b/doc/doxygen/output/html/group__sys__sem.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__sys__time.html b/doc/doxygen/output/html/group__sys__time.html
index a286b01..f6c0964 100644
--- a/doc/doxygen/output/html/group__sys__time.html
+++ b/doc/doxygen/output/html/group__sys__time.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/group__tcp__raw.html b/doc/doxygen/output/html/group__tcp__raw.html
index 7fea8f1..1ec9c06 100644
--- a/doc/doxygen/output/html/group__tcp__raw.html
+++ b/doc/doxygen/output/html/group__tcp__raw.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -133,6 +133,8 @@
 <tr class="separator:gabdac0856a52b5789dc897d4c7137ec44"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga9a31deea4cadacd39f9485f37cfdd012" id="r_ga9a31deea4cadacd39f9485f37cfdd012"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga9a31deea4cadacd39f9485f37cfdd012">tcp_connect</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *ipaddr, u16_t port, <a class="el" href="tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8">tcp_connected_fn</a> connected)</td></tr>
 <tr class="separator:ga9a31deea4cadacd39f9485f37cfdd012"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2c4234f1e95b6bde0e84d4ea97ae95bc" id="r_ga2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga2c4234f1e95b6bde0e84d4ea97ae95bc">tcp_setprio</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t prio)</td></tr>
+<tr class="separator:ga2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga2e00c668b99d92113cd595647702be83" id="r_ga2e00c668b99d92113cd595647702be83"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga2e00c668b99d92113cd595647702be83">tcp_new</a> (void)</td></tr>
 <tr class="separator:ga2e00c668b99d92113cd595647702be83"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga89f6955b7248c76a073cd1be461aeb5b" id="r_ga89f6955b7248c76a073cd1be461aeb5b"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga89f6955b7248c76a073cd1be461aeb5b">tcp_new_ip_type</a> (u8_t type)</td></tr>
@@ -156,9 +158,10 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>Transmission Control Protocol for IP<br  />
-</p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__api.html">APIs</a></dd></dl>
+ </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__api.html">APIs</a></dd></dl>
 <p>Common functions for the TCP implementation, such as functions for manipulating the data structures and the TCP timer functions. TCP functions related to input and output is found in <a class="el" href="tcp__in_8c.html">tcp_in.c</a> and <a class="el" href="tcp__out_8c.html">tcp_out.c</a> respectively.<br  />
- </p><h2>TCP connection setup </h2>
+</p>
+<h2>TCP connection setup </h2>
 <p>The functions used for setting up connections is similar to that of the sequential API and of the BSD socket API. A new TCP connection identifier (i.e., a protocol control block - PCB) is created with the <a class="el" href="#ga2e00c668b99d92113cd595647702be83">tcp_new()</a> function. This PCB can then be either set to listen for new incoming connections or be explicitly connected to another host.</p><ul>
 <li><a class="el" href="#ga2e00c668b99d92113cd595647702be83">tcp_new()</a></li>
 <li><a class="el" href="#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind()</a></li>
@@ -449,7 +452,7 @@
     <tr><td class="paramname">pcb</td><td>the <a class="el" href="structtcp__pcb.html">tcp_pcb</a> used to establish the connection </td></tr>
     <tr><td class="paramname">ipaddr</td><td>the remote ip address to connect to </td></tr>
     <tr><td class="paramname">port</td><td>the remote tcp port to connect to </td></tr>
-    <tr><td class="paramname">connected</td><td>callback function to call when connected (on error, the err calback will be called) </td></tr>
+    <tr><td class="paramname">connected</td><td>callback function to call when connected (on error, the err callback will be called) </td></tr>
   </table>
   </dd>
 </dl>
@@ -594,7 +597,7 @@
 <p>Creates a new TCP protocol control block but doesn't place it on any of the TCP PCB lists. The pcb is not put on any list until binding using <a class="el" href="#gacf5aa67bd7fc66fef43f77a55a1201ee">tcp_bind()</a>. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a">MEMP_NUM_TCP_PCB_LISTEN</a> and <a class="el" href="group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e">MEMP_NUM_TCP_PCB</a></dd></dl>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">type</td><td>IP address type, see <a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a> definitions. If you want to listen to IPv4 and IPv6 (dual-stack) connections, supply <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a> as argument and bind to IP_ANY_TYPE. </td></tr>
+    <tr><td class="paramname">type</td><td>IP address type, see <a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a> definitions. If you want to listen to IPv4 and IPv6 (dual-stack) connections, supply <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a> as argument and bind to <a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">IP_ANY_TYPE</a>. </td></tr>
   </table>
   </dd>
 </dl>
@@ -742,6 +745,35 @@
 
 </div>
 </div>
+<a id="ga2c4234f1e95b6bde0e84d4ea97ae95bc" name="ga2c4234f1e95b6bde0e84d4ea97ae95bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga2c4234f1e95b6bde0e84d4ea97ae95bc">&#9670;&#160;</a></span>tcp_setprio()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_setprio </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *</td>          <td class="paramname"><span class="paramname"><em>pcb</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>prio</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets the priority of a connection.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pcb</td><td>the <a class="el" href="structtcp__pcb.html">tcp_pcb</a> to manipulate </td></tr>
+    <tr><td class="paramname">prio</td><td>new priority </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 <a id="ga5b94d57f1891b9287f88525a2ac561dd" name="ga5b94d57f1891b9287f88525a2ac561dd"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga5b94d57f1891b9287f88525a2ac561dd">&#9670;&#160;</a></span>tcp_shutdown()</h2>
 
@@ -765,7 +797,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Causes all or part of a full-duplex connection of this PCB to be shut down. This doesn't deallocate the PCB unless shutting down both sides! Shutting down both sides is the same as calling tcp_close, so if it succeds (i.e. returns ER_OK), the PCB must not be referenced any more!</p>
+<p>Causes all or part of a full-duplex connection of this PCB to be shut down. This doesn't deallocate the PCB unless shutting down both sides! Shutting down both sides is the same as calling tcp_close, so if it succeeds (i.e. returns ER_OK), the PCB must not be referenced any more!</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">pcb</td><td>PCB to shutdown </td></tr>
diff --git a/doc/doxygen/output/html/group__tcp__raw.js b/doc/doxygen/output/html/group__tcp__raw.js
index e504675..7a3d21b 100644
--- a/doc/doxygen/output/html/group__tcp__raw.js
+++ b/doc/doxygen/output/html/group__tcp__raw.js
@@ -20,6 +20,7 @@
     [ "tcp_recv", "group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0", null ],
     [ "tcp_recved", "group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44", null ],
     [ "tcp_sent", "group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808", null ],
+    [ "tcp_setprio", "group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc", null ],
     [ "tcp_shutdown", "group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd", null ],
     [ "tcp_write", "group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__tcp__raw__extargs.html b/doc/doxygen/output/html/group__tcp__raw__extargs.html
index e160e4a..e522281 100644
--- a/doc/doxygen/output/html/group__tcp__raw__extargs.html
+++ b/doc/doxygen/output/html/group__tcp__raw__extargs.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -107,19 +107,19 @@
 Functions</h2></td></tr>
 <tr class="memitem:ga4836e0b4f66439493e106a50400d1616" id="r_ga4836e0b4f66439493e106a50400d1616"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga4836e0b4f66439493e106a50400d1616">tcp_ext_arg_alloc_id</a> (void)</td></tr>
 <tr class="separator:ga4836e0b4f66439493e106a50400d1616"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga36e60dc02bfe0437c8da368a62e2f316" id="r_ga36e60dc02bfe0437c8da368a62e2f316"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga36e60dc02bfe0437c8da368a62e2f316">tcp_ext_arg_set_callbacks</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, uint8_t id, const struct <a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a> *const callbacks)</td></tr>
-<tr class="separator:ga36e60dc02bfe0437c8da368a62e2f316"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga58500cb2ce22438e16a37373595af318" id="r_ga58500cb2ce22438e16a37373595af318"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga58500cb2ce22438e16a37373595af318">tcp_ext_arg_set</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, uint8_t id, void *arg)</td></tr>
-<tr class="separator:ga58500cb2ce22438e16a37373595af318"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gadc7aa96ddd15fb6598523068b89f8855" id="r_gadc7aa96ddd15fb6598523068b89f8855"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gadc7aa96ddd15fb6598523068b89f8855">tcp_ext_arg_get</a> (const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, uint8_t id)</td></tr>
-<tr class="separator:gadc7aa96ddd15fb6598523068b89f8855"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaacea54ce1154e7ae8ef0199ff1c5bdc5" id="r_gaacea54ce1154e7ae8ef0199ff1c5bdc5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaacea54ce1154e7ae8ef0199ff1c5bdc5">tcp_ext_arg_set_callbacks</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t id, const struct <a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a> *const callbacks)</td></tr>
+<tr class="separator:gaacea54ce1154e7ae8ef0199ff1c5bdc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf5c2397b2d85b3a902584fb64cdb961e" id="r_gaf5c2397b2d85b3a902584fb64cdb961e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaf5c2397b2d85b3a902584fb64cdb961e">tcp_ext_arg_set</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t id, void *arg)</td></tr>
+<tr class="separator:gaf5c2397b2d85b3a902584fb64cdb961e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7499018469cd9c3dc6a15ad91c338e56" id="r_ga7499018469cd9c3dc6a15ad91c338e56"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga7499018469cd9c3dc6a15ad91c338e56">tcp_ext_arg_get</a> (const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t id)</td></tr>
+<tr class="separator:ga7499018469cd9c3dc6a15ad91c338e56"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>Additional data storage per tcp pcb<br  />
-</p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html">TCP</a></dd></dl>
+ </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__tcp__raw.html">TCP</a></dd></dl>
 <p>When LWIP_TCP_PCB_NUM_EXT_ARGS is &gt; 0, every tcp pcb (including listen pcb) includes a number of additional argument entries in an array.</p>
 <p>To support memory management, in addition to a 'void *', callbacks can be provided to manage transition from listening pcbs to connections and to deallocate memory when a pcb is deallocated (see struct <a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a>).</p>
-<p>After allocating this index, use <a class="el" href="#ga58500cb2ce22438e16a37373595af318">tcp_ext_arg_set</a> and <a class="el" href="#gadc7aa96ddd15fb6598523068b89f8855">tcp_ext_arg_get</a> to store and load arguments from this index for a given pcb. </p>
+<p>After allocating this index, use <a class="el" href="#gaf5c2397b2d85b3a902584fb64cdb961e">tcp_ext_arg_set</a> and <a class="el" href="#ga7499018469cd9c3dc6a15ad91c338e56">tcp_ext_arg_get</a> to store and load arguments from this index for a given pcb. </p>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="ga4836e0b4f66439493e106a50400d1616" name="ga4836e0b4f66439493e106a50400d1616"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ga4836e0b4f66439493e106a50400d1616">&#9670;&#160;</a></span>tcp_ext_arg_alloc_id()</h2>
@@ -138,13 +138,13 @@
 <p>Allocate an index to store data in ext_args member of struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a>. Returned value is an index in mentioned array. The index is <em>global</em> over all pcbs!</p>
 <p>When <a class="el" href="group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223">LWIP_TCP_PCB_NUM_EXT_ARGS</a> is &gt; 0, every tcp pcb (including listen pcb) includes a number of additional argument entries in an array.</p>
 <p>To support memory management, in addition to a 'void *', callbacks can be provided to manage transition from listening pcbs to connections and to deallocate memory when a pcb is deallocated (see struct <a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a>).</p>
-<p>After allocating this index, use <a class="el" href="#ga58500cb2ce22438e16a37373595af318">tcp_ext_arg_set</a> and <a class="el" href="#gadc7aa96ddd15fb6598523068b89f8855">tcp_ext_arg_get</a> to store and load arguments from this index for a given pcb.</p>
+<p>After allocating this index, use <a class="el" href="#gaf5c2397b2d85b3a902584fb64cdb961e">tcp_ext_arg_set</a> and <a class="el" href="#ga7499018469cd9c3dc6a15ad91c338e56">tcp_ext_arg_get</a> to store and load arguments from this index for a given pcb.</p>
 <dl class="section return"><dt>Returns</dt><dd>a unique index into struct tcp_pcb.ext_args </dd></dl>
 
 </div>
 </div>
-<a id="gadc7aa96ddd15fb6598523068b89f8855" name="gadc7aa96ddd15fb6598523068b89f8855"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#gadc7aa96ddd15fb6598523068b89f8855">&#9670;&#160;</a></span>tcp_ext_arg_get()</h2>
+<a id="ga7499018469cd9c3dc6a15ad91c338e56" name="ga7499018469cd9c3dc6a15ad91c338e56"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga7499018469cd9c3dc6a15ad91c338e56">&#9670;&#160;</a></span>tcp_ext_arg_get()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -157,7 +157,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">uint8_t</td>          <td class="paramname"><span class="paramname"><em>id</em></span>&#160;)</td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>id</em></span>&#160;)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -173,8 +173,8 @@
 
 </div>
 </div>
-<a id="ga58500cb2ce22438e16a37373595af318" name="ga58500cb2ce22438e16a37373595af318"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ga58500cb2ce22438e16a37373595af318">&#9670;&#160;</a></span>tcp_ext_arg_set()</h2>
+<a id="gaf5c2397b2d85b3a902584fb64cdb961e" name="gaf5c2397b2d85b3a902584fb64cdb961e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaf5c2397b2d85b3a902584fb64cdb961e">&#9670;&#160;</a></span>tcp_ext_arg_set()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -187,7 +187,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">uint8_t</td>          <td class="paramname"><span class="paramname"><em>id</em></span>, </td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>id</em></span>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
@@ -208,8 +208,8 @@
 
 </div>
 </div>
-<a id="ga36e60dc02bfe0437c8da368a62e2f316" name="ga36e60dc02bfe0437c8da368a62e2f316"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ga36e60dc02bfe0437c8da368a62e2f316">&#9670;&#160;</a></span>tcp_ext_arg_set_callbacks()</h2>
+<a id="gaacea54ce1154e7ae8ef0199ff1c5bdc5" name="gaacea54ce1154e7ae8ef0199ff1c5bdc5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaacea54ce1154e7ae8ef0199ff1c5bdc5">&#9670;&#160;</a></span>tcp_ext_arg_set_callbacks()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -222,7 +222,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">uint8_t</td>          <td class="paramname"><span class="paramname"><em>id</em></span>, </td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>id</em></span>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
diff --git a/doc/doxygen/output/html/group__tcp__raw__extargs.js b/doc/doxygen/output/html/group__tcp__raw__extargs.js
index 04d51d7..58e2ad1 100644
--- a/doc/doxygen/output/html/group__tcp__raw__extargs.js
+++ b/doc/doxygen/output/html/group__tcp__raw__extargs.js
@@ -1,7 +1,7 @@
 var group__tcp__raw__extargs =
 [
     [ "tcp_ext_arg_alloc_id", "group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616", null ],
-    [ "tcp_ext_arg_get", "group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855", null ],
-    [ "tcp_ext_arg_set", "group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318", null ],
-    [ "tcp_ext_arg_set_callbacks", "group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316", null ]
+    [ "tcp_ext_arg_get", "group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56", null ],
+    [ "tcp_ext_arg_set", "group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e", null ],
+    [ "tcp_ext_arg_set_callbacks", "group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__tftp.html b/doc/doxygen/output/html/group__tftp.html
index 04186eb..746f0ec 100644
--- a/doc/doxygen/output/html/group__tftp.html
+++ b/doc/doxygen/output/html/group__tftp.html
@@ -5,7 +5,7 @@
 <meta http-equiv="X-UA-Compatible" content="IE=11"/>
 <meta name="generator" content="Doxygen 1.12.0"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>lwIP: TFTP server</title>
+<title>lwIP: TFTP client/server</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,7 +101,7 @@
 <a href="#groups">Topics</a> &#124;
 <a href="#nested-classes">Data Structures</a> &#124;
 <a href="#func-members">Functions</a>  </div>
-  <div class="headertitle"><div class="title">TFTP server<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div></div>
+  <div class="headertitle"><div class="title">TFTP client/server<div class="ingroups"><a class="el" href="group__apps.html">Applications</a></div></div></div>
 </div><!--header-->
 <div class="contents">
 <table class="memberdecls">
@@ -117,13 +117,15 @@
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:ga7a80673a1324da5c8ae2440af7b008a3" id="r_ga7a80673a1324da5c8ae2440af7b008a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga7a80673a1324da5c8ae2440af7b008a3">tftp_init</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
-<tr class="separator:ga7a80673a1324da5c8ae2440af7b008a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73a98f0811244d5bd24d5b959db8ed40" id="r_ga73a98f0811244d5bd24d5b959db8ed40"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga73a98f0811244d5bd24d5b959db8ed40">tftp_init_server</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
+<tr class="separator:ga73a98f0811244d5bd24d5b959db8ed40"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa6b743a64287206acb825bd60448e5f8" id="r_gaa6b743a64287206acb825bd60448e5f8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa6b743a64287206acb825bd60448e5f8">tftp_init_client</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
+<tr class="separator:gaa6b743a64287206acb825bd60448e5f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gabb4a4e24b5c7ec8df70ec5a68a206dec" id="r_gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_cleanup</a> (void)</td></tr>
 <tr class="separator:gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<p>This is simple TFTP server for the lwIP raw API. </p>
+<p>This is simple TFTP client/server for the lwIP raw API. You need to increase MEMP_NUM_SYS_TIMEOUT by one if you use TFTP! </p>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="gabb4a4e24b5c7ec8df70ec5a68a206dec" name="gabb4a4e24b5c7ec8df70ec5a68a206dec"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gabb4a4e24b5c7ec8df70ec5a68a206dec">&#9670;&#160;</a></span>tftp_cleanup()</h2>
@@ -139,18 +141,41 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Deinitialize ("turn off") TFTP server. </p>
+<p>Deinitialize ("turn off") TFTP client/server. </p>
 
 </div>
 </div>
-<a id="ga7a80673a1324da5c8ae2440af7b008a3" name="ga7a80673a1324da5c8ae2440af7b008a3"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ga7a80673a1324da5c8ae2440af7b008a3">&#9670;&#160;</a></span>tftp_init()</h2>
+<a id="gaa6b743a64287206acb825bd60448e5f8" name="gaa6b743a64287206acb825bd60448e5f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#gaa6b743a64287206acb825bd60448e5f8">&#9670;&#160;</a></span>tftp_init_client()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> tftp_init </td>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> tftp_init_client </td>
+          <td>(</td>
+          <td class="paramtype">const struct <a class="el" href="structtftp__context.html">tftp_context</a> *</td>          <td class="paramname"><span class="paramname"><em>ctx</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize TFTP client. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ctx</td><td>TFTP callback struct </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ga73a98f0811244d5bd24d5b959db8ed40" name="ga73a98f0811244d5bd24d5b959db8ed40"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga73a98f0811244d5bd24d5b959db8ed40">&#9670;&#160;</a></span>tftp_init_server()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> tftp_init_server </td>
           <td>(</td>
           <td class="paramtype">const struct <a class="el" href="structtftp__context.html">tftp_context</a> *</td>          <td class="paramname"><span class="paramname"><em>ctx</em></span></td><td>)</td>
           <td></td>
diff --git a/doc/doxygen/output/html/group__tftp.js b/doc/doxygen/output/html/group__tftp.js
index e741261..4081580 100644
--- a/doc/doxygen/output/html/group__tftp.js
+++ b/doc/doxygen/output/html/group__tftp.js
@@ -3,10 +3,12 @@
     [ "Options", "group__tftp__opts.html", "group__tftp__opts" ],
     [ "tftp_context", "structtftp__context.html", [
       [ "close", "structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65", null ],
+      [ "error", "structtftp__context.html#a39cbb84a9c0eaa8ea62d183ba8214519", null ],
       [ "open", "structtftp__context.html#a65d6359e2aac571813c05c61676c01a1", null ],
       [ "read", "structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c", null ],
       [ "write", "structtftp__context.html#a9e6e4ec803ec9597822923369701754d", null ]
     ] ],
     [ "tftp_cleanup", "group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec", null ],
-    [ "tftp_init", "group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3", null ]
+    [ "tftp_init_client", "group__tftp.html#gaa6b743a64287206acb825bd60448e5f8", null ],
+    [ "tftp_init_server", "group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/group__tftp__opts.html b/doc/doxygen/output/html/group__tftp__opts.html
index 4b85078..8e8139e 100644
--- a/doc/doxygen/output/html/group__tftp__opts.html
+++ b/doc/doxygen/output/html/group__tftp__opts.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -99,7 +99,7 @@
 <div class="header">
   <div class="summary">
 <a href="#define-members">Macros</a>  </div>
-  <div class="headertitle"><div class="title">Options<div class="ingroups"><a class="el" href="group__apps.html">Applications</a> &raquo; <a class="el" href="group__tftp.html">TFTP server</a></div></div></div>
+  <div class="headertitle"><div class="title">Options<div class="ingroups"><a class="el" href="group__apps.html">Applications</a> &raquo; <a class="el" href="group__tftp.html">TFTP client/server</a></div></div></div>
 </div><!--header-->
 <div class="contents">
 <table class="memberdecls">
@@ -117,7 +117,7 @@
 <tr class="separator:ga3e6caacb3f4d43f780b2d68ffe4258ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga8e975900b4397313f1a649ff76a3063b" id="r_ga8e975900b4397313f1a649ff76a3063b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga8e975900b4397313f1a649ff76a3063b">TFTP_MAX_FILENAME_LEN</a>&#160;&#160;&#160;20</td></tr>
 <tr class="separator:ga8e975900b4397313f1a649ff76a3063b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaa8a449c25e37be757f5efccd422c9055" id="r_gaa8a449c25e37be757f5efccd422c9055"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa8a449c25e37be757f5efccd422c9055">TFTP_MAX_MODE_LEN</a>&#160;&#160;&#160;7</td></tr>
+<tr class="memitem:gaa8a449c25e37be757f5efccd422c9055" id="r_gaa8a449c25e37be757f5efccd422c9055"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gaa8a449c25e37be757f5efccd422c9055">TFTP_MAX_MODE_LEN</a>&#160;&#160;&#160;10</td></tr>
 <tr class="separator:gaa8a449c25e37be757f5efccd422c9055"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
@@ -159,7 +159,7 @@
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">#define TFTP_MAX_MODE_LEN&#160;&#160;&#160;7</td>
+          <td class="memname">#define TFTP_MAX_MODE_LEN&#160;&#160;&#160;10</td>
         </tr>
       </table>
 </div><div class="memdoc">
diff --git a/doc/doxygen/output/html/group__udp__raw.html b/doc/doxygen/output/html/group__udp__raw.html
index fc0560c..107e816 100644
--- a/doc/doxygen/output/html/group__udp__raw.html
+++ b/doc/doxygen/output/html/group__udp__raw.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -132,7 +132,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <p>User Datagram Protocol module<br  />
-</p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__api.html">APIs</a> </dd></dl>
+ </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__api.html">APIs</a> </dd></dl>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="gac7fbda8b12b9b9360e92b51e805e799e" name="gac7fbda8b12b9b9360e92b51e805e799e"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gac7fbda8b12b9b9360e92b51e805e799e">&#9670;&#160;</a></span>udp_bind()</h2>
@@ -306,7 +306,7 @@
 <p>Create a UDP PCB for specific IP type. The pcb is not active until it has either been bound to a local address or connected to a remote address. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb">MEMP_NUM_UDP_PCB</a></dd></dl>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">type</td><td>IP address type, see <a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a> definitions. If you want to listen to IPv4 and IPv6 (dual-stack) packets, supply <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a> as argument and bind to IP_ANY_TYPE. </td></tr>
+    <tr><td class="paramname">type</td><td>IP address type, see <a class="el" href="group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c">lwip_ip_addr_type</a> definitions. If you want to listen to IPv4 and IPv6 (dual-stack) packets, supply <a class="el" href="group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e">IPADDR_TYPE_ANY</a> as argument and bind to <a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">IP_ANY_TYPE</a>. </td></tr>
   </table>
   </dd>
 </dl>
@@ -364,8 +364,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Removes and deallocates the pcb. <br  />
-</p>
+<p>Removes and deallocates the pcb.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">pcb</td><td>UDP PCB to be removed. The PCB is removed from the list of UDP PCB's and the data structure is freed from memory.</td></tr>
diff --git a/doc/doxygen/output/html/group__zepif.html b/doc/doxygen/output/html/group__zepif.html
index e5bca15..f1413db 100644
--- a/doc/doxygen/output/html/group__zepif.html
+++ b/doc/doxygen/output/html/group__zepif.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -114,11 +114,11 @@
 <div class="line"><a class="code hl_function" href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a>(&amp;zep_netif, 1);</div>
 <div class="line"><a class="code hl_function" href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a>(&amp;zep_netif);</div>
 <div class="line"><a class="code hl_function" href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a>(&amp;zep_netif);</div>
-<div class="ttc" id="agroup__netif__ip6_html_gae864211a5eb052deb5da7bc7e3427fb9"><div class="ttname"><a href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a></div><div class="ttdeci">void netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit)</div><div class="ttdef"><b>Definition</b> netif.c:1515</div></div>
-<div class="ttc" id="agroup__netif_html_ga22055759a25f5d6cea7e7deab0a07434"><div class="ttname"><a href="group__netif.html#ga22055759a25f5d6cea7e7deab0a07434">netif_add</a></div><div class="ttdeci">struct netif * netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)</div><div class="ttdef"><b>Definition</b> netif.c:276</div></div>
-<div class="ttc" id="agroup__netif_html_gae0d2975f189277990e9d5276fdd9e9ea"><div class="ttname"><a href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a></div><div class="ttdeci">void netif_set_link_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:991</div></div>
-<div class="ttc" id="agroup__netif_html_gaf19693be401a265a52d2a56c65753121"><div class="ttname"><a href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a></div><div class="ttdeci">void netif_set_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:847</div></div>
-<div class="ttc" id="agroup__sixlowpan_html_ga9d9b93c47dd138fd84a503ffecb9336b"><div class="ttname"><a href="group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b">tcpip_6lowpan_input</a></div><div class="ttdeci">err_t tcpip_6lowpan_input(struct pbuf *p, struct netif *inp)</div><div class="ttdef"><b>Definition</b> lowpan6.c:914</div></div>
+<div class="ttc" id="agroup__netif__ip6_html_gae864211a5eb052deb5da7bc7e3427fb9"><div class="ttname"><a href="group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9">netif_create_ip6_linklocal_address</a></div><div class="ttdeci">void netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit)</div><div class="ttdef"><b>Definition</b> netif.c:1551</div></div>
+<div class="ttc" id="agroup__netif_html_ga22055759a25f5d6cea7e7deab0a07434"><div class="ttname"><a href="group__netif.html#ga22055759a25f5d6cea7e7deab0a07434">netif_add</a></div><div class="ttdeci">struct netif * netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)</div><div class="ttdef"><b>Definition</b> netif.c:287</div></div>
+<div class="ttc" id="agroup__netif_html_gae0d2975f189277990e9d5276fdd9e9ea"><div class="ttname"><a href="group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea">netif_set_link_up</a></div><div class="ttdeci">void netif_set_link_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:1018</div></div>
+<div class="ttc" id="agroup__netif_html_gaf19693be401a265a52d2a56c65753121"><div class="ttname"><a href="group__netif.html#gaf19693be401a265a52d2a56c65753121">netif_set_up</a></div><div class="ttdeci">void netif_set_up(struct netif *netif)</div><div class="ttdef"><b>Definition</b> netif.c:871</div></div>
+<div class="ttc" id="agroup__sixlowpan_html_ga9d9b93c47dd138fd84a503ffecb9336b"><div class="ttname"><a href="group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b">tcpip_6lowpan_input</a></div><div class="ttdeci">err_t tcpip_6lowpan_input(struct pbuf *p, struct netif *inp)</div><div class="ttdef"><b>Definition</b> lowpan6.c:915</div></div>
 <div class="ttc" id="astructzepif__init_html"><div class="ttname"><a href="structzepif__init.html">zepif_init</a></div><div class="ttdef"><b>Definition</b> zepif.h:58</div></div>
 </div><!-- fragment --> <h2 class="groupheader">Function Documentation</h2>
 <a id="gad61a6d9c1ab17e5b2c2c3eb9b42cc004" name="gad61a6d9c1ab17e5b2c2c3eb9b42cc004"></a>
diff --git a/doc/doxygen/output/html/http__client_8c.html b/doc/doxygen/output/html/http__client_8c.html
index 738a9bc..4ddd1dc 100644
--- a/doc/doxygen/output/html/http__client_8c.html
+++ b/doc/doxygen/output/html/http__client_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/http__client_8h.html b/doc/doxygen/output/html/http__client_8h.html
index 15c7ab8..8983895 100644
--- a/doc/doxygen/output/html/http__client_8h.html
+++ b/doc/doxygen/output/html/http__client_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/httpd_8c.html b/doc/doxygen/output/html/httpd_8c.html
index 0408d92..5485282 100644
--- a/doc/doxygen/output/html/httpd_8c.html
+++ b/doc/doxygen/output/html/httpd_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/httpd_8h.html b/doc/doxygen/output/html/httpd_8h.html
index 572db03..b91eec9 100644
--- a/doc/doxygen/output/html/httpd_8h.html
+++ b/doc/doxygen/output/html/httpd_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/httpd__opts_8h.html b/doc/doxygen/output/html/httpd__opts_8h.html
index 7af1fec..68a51f2 100644
--- a/doc/doxygen/output/html/httpd__opts_8h.html
+++ b/doc/doxygen/output/html/httpd__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -117,6 +117,8 @@
 <tr class="separator:ga520858778b84d4d2fa125294c0f119e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaba2d4cfe4c1f5bdbe37b339084a7d466" id="r_gaba2d4cfe4c1f5bdbe37b339084a7d466"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466">LWIP_HTTPD_SSI_BY_FILE_EXTENSION</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:gaba2d4cfe4c1f5bdbe37b339084a7d466"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga006baa7219cff5ee02f5a14ef7d7c89d" id="r_ga006baa7219cff5ee02f5a14ef7d7c89d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga006baa7219cff5ee02f5a14ef7d7c89d">LWIP_HTTPD_SSI_EXTENSIONS</a>&#160;&#160;&#160;&quot;.shtml&quot;, &quot;.shtm&quot;, &quot;.ssi&quot;, &quot;.xml&quot;, &quot;.json&quot;</td></tr>
+<tr class="separator:ga006baa7219cff5ee02f5a14ef7d7c89d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gacbea06ce33933e3ef2f2f1834a21cc2c" id="r_gacbea06ce33933e3ef2f2f1834a21cc2c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c">LWIP_HTTPD_SUPPORT_POST</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gacbea06ce33933e3ef2f2f1834a21cc2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga3167d52d20cf90857e2c809b92458bf0" id="r_ga3167d52d20cf90857e2c809b92458bf0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0">LWIP_HTTPD_SSI_MULTIPART</a>&#160;&#160;&#160;0</td></tr>
@@ -177,6 +179,8 @@
 <tr class="separator:ga1ee8d7c975c7e3d1c9d9dd9b43660c79"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaedd0fa3d356170d8ca3557acb410fd7c" id="r_gaedd0fa3d356170d8ca3557acb410fd7c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c">LWIP_HTTPD_FILE_STATE</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gaedd0fa3d356170d8ca3557acb410fd7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3648a9fdefe3ab1c890b715a4786429" id="r_gaa3648a9fdefe3ab1c890b715a4786429"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#gaa3648a9fdefe3ab1c890b715a4786429">LWIP_HTTPD_FILE_EXTENSION</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gaa3648a9fdefe3ab1c890b715a4786429"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga6e5de8515c89af12277e4cb011165103" id="r_ga6e5de8515c89af12277e4cb011165103"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103">HTTPD_PRECALCULATED_CHECKSUM</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga6e5de8515c89af12277e4cb011165103"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga51cb673cb5cc362acc409f23c1e0a331" id="r_ga51cb673cb5cc362acc409f23c1e0a331"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331">LWIP_HTTPD_FS_ASYNC_READ</a>&#160;&#160;&#160;0</td></tr>
diff --git a/doc/doxygen/output/html/httpd__opts_8h.js b/doc/doxygen/output/html/httpd__opts_8h.js
index bb2653d..5c85649 100644
--- a/doc/doxygen/output/html/httpd__opts_8h.js
+++ b/doc/doxygen/output/html/httpd__opts_8h.js
@@ -18,6 +18,7 @@
     [ "LWIP_HTTPD_CUSTOM_FILES", "group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd", null ],
     [ "LWIP_HTTPD_DYNAMIC_FILE_READ", "group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79", null ],
     [ "LWIP_HTTPD_DYNAMIC_HEADERS", "group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7", null ],
+    [ "LWIP_HTTPD_FILE_EXTENSION", "group__httpd__opts.html#gaa3648a9fdefe3ab1c890b715a4786429", null ],
     [ "LWIP_HTTPD_FILE_STATE", "group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c", null ],
     [ "LWIP_HTTPD_FS_ASYNC_READ", "group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331", null ],
     [ "LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED", "group__httpd__opts.html#ga0d5074965efd40786182287895feb691", null ],
@@ -29,6 +30,7 @@
     [ "LWIP_HTTPD_REQ_QUEUELEN", "group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0", null ],
     [ "LWIP_HTTPD_SSI", "group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949", null ],
     [ "LWIP_HTTPD_SSI_BY_FILE_EXTENSION", "group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466", null ],
+    [ "LWIP_HTTPD_SSI_EXTENSIONS", "group__httpd__opts.html#ga006baa7219cff5ee02f5a14ef7d7c89d", null ],
     [ "LWIP_HTTPD_SSI_INCLUDE_TAG", "group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a", null ],
     [ "LWIP_HTTPD_SSI_MULTIPART", "group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0", null ],
     [ "LWIP_HTTPD_SSI_RAW", "group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5", null ],
diff --git a/doc/doxygen/output/html/iana_8h.html b/doc/doxygen/output/html/iana_8h.html
index 1d424fb..97fb1c0 100644
--- a/doc/doxygen/output/html/iana_8h.html
+++ b/doc/doxygen/output/html/iana_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/icmp6_8c.html b/doc/doxygen/output/html/icmp6_8c.html
index 709db58..011ad80 100644
--- a/doc/doxygen/output/html/icmp6_8c.html
+++ b/doc/doxygen/output/html/icmp6_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/icmp6_8h.html b/doc/doxygen/output/html/icmp6_8h.html
index 1a77fa0..71b5a92 100644
--- a/doc/doxygen/output/html/icmp6_8h.html
+++ b/doc/doxygen/output/html/icmp6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/icmp_8c.html b/doc/doxygen/output/html/icmp_8c.html
index 3229a43..37e2f29 100644
--- a/doc/doxygen/output/html/icmp_8c.html
+++ b/doc/doxygen/output/html/icmp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/icmp_8h.html b/doc/doxygen/output/html/icmp_8h.html
index 9c91d92..362f526 100644
--- a/doc/doxygen/output/html/icmp_8h.html
+++ b/doc/doxygen/output/html/icmp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ieee802154_8h.html b/doc/doxygen/output/html/ieee802154_8h.html
index 7c60f06..ee45f90 100644
--- a/doc/doxygen/output/html/ieee802154_8h.html
+++ b/doc/doxygen/output/html/ieee802154_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ieee_8h.html b/doc/doxygen/output/html/ieee_8h.html
index d406c64..d609434 100644
--- a/doc/doxygen/output/html/ieee_8h.html
+++ b/doc/doxygen/output/html/ieee_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/if_8h.html b/doc/doxygen/output/html/if_8h.html
index 40c3f8a..4c50884 100644
--- a/doc/doxygen/output/html/if_8h.html
+++ b/doc/doxygen/output/html/if_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/if__api_8c.html b/doc/doxygen/output/html/if__api_8c.html
index 135b5c4..4bfc93a 100644
--- a/doc/doxygen/output/html/if__api_8c.html
+++ b/doc/doxygen/output/html/if__api_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/if__api_8h.html b/doc/doxygen/output/html/if__api_8h.html
index 59b085b..03b001d 100644
--- a/doc/doxygen/output/html/if__api_8h.html
+++ b/doc/doxygen/output/html/if__api_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/igmp_8c.html b/doc/doxygen/output/html/igmp_8c.html
index dada3d6..3298b2b 100644
--- a/doc/doxygen/output/html/igmp_8c.html
+++ b/doc/doxygen/output/html/igmp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/igmp_8h.html b/doc/doxygen/output/html/igmp_8h.html
index 0bfe593..4e08641 100644
--- a/doc/doxygen/output/html/igmp_8h.html
+++ b/doc/doxygen/output/html/igmp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/index.html b/doc/doxygen/output/html/index.html
index e1ca86e..f26cbc0 100644
--- a/doc/doxygen/output/html/index.html
+++ b/doc/doxygen/output/html/index.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -119,12 +119,13 @@
     multiple network interfaces
   * ICMP (Internet Control Message Protocol) for network maintenance and debugging
   * IGMP (Internet Group Management Protocol) for multicast traffic management
-  * MLD (Multicast listener discovery for IPv6). Aims to be compliant with 
+  * MLD (Multicast listener discovery for IPv6). Aims to be compliant with
     RFC 2710. No support for MLDv2
   * ND (Neighbor discovery and stateless address autoconfiguration for IPv6).
     Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862
     (Address autoconfiguration)
-  * DHCP, AutoIP/APIPA (Zeroconf) and (stateless) DHCPv6
+  * DHCP, AutoIP/APIPA (Zeroconf), ACD (Address Conflict Detection)
+    and (stateless) DHCPv6
   * UDP (User Datagram Protocol) including experimental UDP-lite extensions
   * TCP (Transmission Control Protocol) with congestion control, RTT estimation
     fast recovery/fast retransmit and sending SACKs
@@ -165,37 +166,39 @@
 mailing list. A core team of developers will commit changes to the
 Git source tree.
 
-The lwIP TCP/IP stack is maintained in the 'lwip' Git module and
-contributions (such as platform ports) are in the 'contrib' Git module.
+The lwIP TCP/IP stack is maintained in the 'src' directory and
+contributions (such as platform ports and applications) are in
+the 'contrib' directory.
 
 See doc/savannah.txt for details on Git server access for users and
 developers.
 
-The current Git trees are web-browsable:
-  http://git.savannah.gnu.org/cgit/lwip.git
-  http://git.savannah.gnu.org/cgit/lwip/lwip-contrib.git
+The current Git tree is web-browsable:
+  https://git.savannah.gnu.org/cgit/lwip.git
 
 Submit patches and bugs via the lwIP project page:
-  http://savannah.nongnu.org/projects/lwip/
+  https://savannah.nongnu.org/projects/lwip/
 
 Continuous integration builds (GCC, clang):
-  https://travis-ci.org/yarrick/lwip-merged
+  https://github.com/lwip-tcpip/lwip/actions
 
 
 DOCUMENTATION
 
 Self documentation of the source code is regularly extracted from the current
 Git sources and is available from this web page:
-  http://www.nongnu.org/lwip/
-
-There is now a constantly growing wiki about lwIP at
-  http://lwip.wikia.com/wiki/LwIP_Wiki
+  https://www.nongnu.org/lwip/
 
 Also, there are mailing lists you can subscribe at
-  http://savannah.nongnu.org/mail/?group=lwip
+  https://savannah.nongnu.org/mail/?group=lwip
 plus searchable archives:
-  http://lists.nongnu.org/archive/html/lwip-users/
-  http://lists.nongnu.org/archive/html/lwip-devel/
+  https://lists.nongnu.org/archive/html/lwip-users/
+  https://lists.nongnu.org/archive/html/lwip-devel/
+
+There is a wiki about lwIP at
+  https://lwip.wikia.com/wiki/LwIP_Wiki
+You might get questions answered there, but unfortunately, it is not as
+well maintained as it should be.
 
 lwIP was originally written by Adam Dunkels:
   http://dunkels.com/adam/
diff --git a/doc/doxygen/output/html/inet6_8c.html b/doc/doxygen/output/html/inet6_8c.html
index d3589de..c69dcda 100644
--- a/doc/doxygen/output/html/inet6_8c.html
+++ b/doc/doxygen/output/html/inet6_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/inet__chksum_8c.html b/doc/doxygen/output/html/inet__chksum_8c.html
index 80ac8ad..b3b58eb 100644
--- a/doc/doxygen/output/html/inet__chksum_8c.html
+++ b/doc/doxygen/output/html/inet__chksum_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -118,8 +118,8 @@
 <tr class="separator:ab35967a50418358e194e8f80fdc3c865"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Internet checksum functions.<br  />
- These are some reference implementations of the checksum algorithm, with the aim of being simple, correct and fully portable. Checksumming is the first thing you would want to optimize for your platform. If you create your own version, link it in and in your cc.h put:</p>
+<div class="textblock"><p>Internet checksum functions.</p>
+<p>These are some reference implementations of the checksum algorithm, with the aim of being simple, correct and fully portable. Checksumming is the first thing you would want to optimize for your platform. If you create your own version, link it in and in your cc.h put:</p>
 <p>#define LWIP_CHKSUM your_checksum_routine</p>
 <p>Or you can select from the implementations below by defining LWIP_CHKSUM_ALGORITHM to 1, 2 or 3. </p>
 </div><h2 class="groupheader">Function Documentation</h2>
diff --git a/doc/doxygen/output/html/inet__chksum_8h.html b/doc/doxygen/output/html/inet__chksum_8h.html
index 7f9fbc6..fff5e7a 100644
--- a/doc/doxygen/output/html/inet__chksum_8h.html
+++ b/doc/doxygen/output/html/inet__chksum_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/init_8c.html b/doc/doxygen/output/html/init_8c.html
index 7225334..6896650 100644
--- a/doc/doxygen/output/html/init_8c.html
+++ b/doc/doxygen/output/html/init_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/init_8h.html b/doc/doxygen/output/html/init_8h.html
index fb4735c..fdcc617 100644
--- a/doc/doxygen/output/html/init_8h.html
+++ b/doc/doxygen/output/html/init_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -109,9 +109,9 @@
 Macros</h2></td></tr>
 <tr class="memitem:ga4308c06ef36496e00c798d96d7d03246" id="r_ga4308c06ef36496e00c798d96d7d03246"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246">LWIP_VERSION_MAJOR</a>&#160;&#160;&#160;2</td></tr>
 <tr class="separator:ga4308c06ef36496e00c798d96d7d03246"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga1e596388c15ba81e753c5633fad1c034" id="r_ga1e596388c15ba81e753c5633fad1c034"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034">LWIP_VERSION_MINOR</a>&#160;&#160;&#160;1</td></tr>
+<tr class="memitem:ga1e596388c15ba81e753c5633fad1c034" id="r_ga1e596388c15ba81e753c5633fad1c034"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034">LWIP_VERSION_MINOR</a>&#160;&#160;&#160;2</td></tr>
 <tr class="separator:ga1e596388c15ba81e753c5633fad1c034"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga0a57983df1b199cf39a2e6a2d90e3d50" id="r_ga0a57983df1b199cf39a2e6a2d90e3d50"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50">LWIP_VERSION_REVISION</a>&#160;&#160;&#160;3</td></tr>
+<tr class="memitem:ga0a57983df1b199cf39a2e6a2d90e3d50" id="r_ga0a57983df1b199cf39a2e6a2d90e3d50"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50">LWIP_VERSION_REVISION</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga0a57983df1b199cf39a2e6a2d90e3d50"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gac1dc92d8f453a98560de7e2e00a221a1" id="r_gac1dc92d8f453a98560de7e2e00a221a1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1">LWIP_VERSION_RC</a>&#160;&#160;&#160;<a class="el" href="group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469">LWIP_RC_RELEASE</a></td></tr>
 <tr class="separator:gac1dc92d8f453a98560de7e2e00a221a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
diff --git a/doc/doxygen/output/html/ip4_8c.html b/doc/doxygen/output/html/ip4_8c.html
index 7620c7b..1280098 100644
--- a/doc/doxygen/output/html/ip4_8c.html
+++ b/doc/doxygen/output/html/ip4_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip4_8h.html b/doc/doxygen/output/html/ip4_8h.html
index c3aa3ce..24f3d7e 100644
--- a/doc/doxygen/output/html/ip4_8h.html
+++ b/doc/doxygen/output/html/ip4_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip4__addr_8c.html b/doc/doxygen/output/html/ip4__addr_8c.html
index 43c3f77..e4e46f3 100644
--- a/doc/doxygen/output/html/ip4__addr_8c.html
+++ b/doc/doxygen/output/html/ip4__addr_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip4__addr_8h.html b/doc/doxygen/output/html/ip4__addr_8h.html
index 7ed09c7..3a19519 100644
--- a/doc/doxygen/output/html/ip4__addr_8h.html
+++ b/doc/doxygen/output/html/ip4__addr_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -147,6 +147,10 @@
 <tr class="separator:a81658cb05ba504d13ee860e82dc444e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:afd43f6ceb2df8d50c84509ad1059f514" id="r_afd43f6ceb2df8d50c84509ad1059f514"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#afd43f6ceb2df8d50c84509ad1059f514">ip4_addr_netcmp</a>(addr1,  addr2,  mask)</td></tr>
 <tr class="separator:afd43f6ceb2df8d50c84509ad1059f514"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95d05df9201602fc873a97fb61fd1134" id="r_a95d05df9201602fc873a97fb61fd1134"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a95d05df9201602fc873a97fb61fd1134">ip4_addr_net_eq</a>(addr1,  addr2,  mask)</td></tr>
+<tr class="separator:a95d05df9201602fc873a97fb61fd1134"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59494c562c62fdf62a6c9c6a66a50fb3" id="r_a59494c562c62fdf62a6c9c6a66a50fb3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a59494c562c62fdf62a6c9c6a66a50fb3">ip4_addr_cmp</a>(addr1,  addr2)</td></tr>
+<tr class="separator:a59494c562c62fdf62a6c9c6a66a50fb3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a2b2230516e7911dfacc9b87644ba30f1" id="r_a2b2230516e7911dfacc9b87644ba30f1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2b2230516e7911dfacc9b87644ba30f1">ip_ntoa</a>(ipaddr)</td></tr>
 <tr class="separator:a2b2230516e7911dfacc9b87644ba30f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
@@ -212,6 +216,29 @@
 
 </div>
 </div>
+<a id="a59494c562c62fdf62a6c9c6a66a50fb3" name="a59494c562c62fdf62a6c9c6a66a50fb3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a59494c562c62fdf62a6c9c6a66a50fb3">&#9670;&#160;</a></span>ip4_addr_cmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_cmp</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">ip4_addr_eq(addr1, addr2)</div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000004">Deprecated</a></b></dt><dd>Renamed to ip4_addr_eq </dd></dl>
+
+</div>
+</div>
 <a id="a2f4e9c339e897e6ca5cb4a2f1e8394d5" name="a2f4e9c339e897e6ca5cb4a2f1e8394d5"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a2f4e9c339e897e6ca5cb4a2f1e8394d5">&#9670;&#160;</a></span>ip4_addr_copy</h2>
 
@@ -301,14 +328,14 @@
 
 </div>
 </div>
-<a id="afd43f6ceb2df8d50c84509ad1059f514" name="afd43f6ceb2df8d50c84509ad1059f514"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#afd43f6ceb2df8d50c84509ad1059f514">&#9670;&#160;</a></span>ip4_addr_netcmp</h2>
+<a id="a95d05df9201602fc873a97fb61fd1134" name="a95d05df9201602fc873a97fb61fd1134"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a95d05df9201602fc873a97fb61fd1134">&#9670;&#160;</a></span>ip4_addr_net_eq</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">#define ip4_addr_netcmp</td>
+          <td class="memname">#define ip4_addr_net_eq</td>
           <td>(</td>
           <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
         </tr>
@@ -338,6 +365,35 @@
 
 </div>
 </div>
+<a id="afd43f6ceb2df8d50c84509ad1059f514" name="afd43f6ceb2df8d50c84509ad1059f514"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afd43f6ceb2df8d50c84509ad1059f514">&#9670;&#160;</a></span>ip4_addr_netcmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip4_addr_netcmp</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>mask</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#a95d05df9201602fc873a97fb61fd1134">ip4_addr_net_eq</a>(addr1, addr2, mask)</div>
+<div class="ttc" id="aip4__addr_8h_html_a95d05df9201602fc873a97fb61fd1134"><div class="ttname"><a href="#a95d05df9201602fc873a97fb61fd1134">ip4_addr_net_eq</a></div><div class="ttdeci">#define ip4_addr_net_eq(addr1, addr2, mask)</div><div class="ttdef"><b>Definition</b> ip4_addr.h:146</div></div>
+</div><!-- fragment --><p>Determine if two address are on the same network. </p><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#a95d05df9201602fc873a97fb61fd1134">ip4_addr_net_eq</a> </dd></dl>
+
+</div>
+</div>
 <a id="a33a17a8d2025ce3715db835534868e88" name="a33a17a8d2025ce3715db835534868e88"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a33a17a8d2025ce3715db835534868e88">&#9670;&#160;</a></span>ip4_addr_set</h2>
 
diff --git a/doc/doxygen/output/html/ip4__addr_8h.js b/doc/doxygen/output/html/ip4__addr_8h.js
index dbe9234..3e47848 100644
--- a/doc/doxygen/output/html/ip4__addr_8h.js
+++ b/doc/doxygen/output/html/ip4__addr_8h.js
@@ -2,10 +2,12 @@
 [
     [ "ip4_addr", "structip4__addr.html", null ],
     [ "IP4_ADDR", "ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974", null ],
+    [ "ip4_addr_cmp", "ip4__addr_8h.html#a59494c562c62fdf62a6c9c6a66a50fb3", null ],
     [ "ip4_addr_copy", "ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5", null ],
     [ "ip4_addr_get_network", "ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9", null ],
     [ "ip4_addr_get_u32", "ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b", null ],
     [ "ip4_addr_isloopback", "ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051", null ],
+    [ "ip4_addr_net_eq", "ip4__addr_8h.html#a95d05df9201602fc873a97fb61fd1134", null ],
     [ "ip4_addr_netcmp", "ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514", null ],
     [ "ip4_addr_set", "ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88", null ],
     [ "ip4_addr_set_any", "ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567", null ],
diff --git a/doc/doxygen/output/html/ip4__frag_8c.html b/doc/doxygen/output/html/ip4__frag_8c.html
index d7a5910..eeec149 100644
--- a/doc/doxygen/output/html/ip4__frag_8c.html
+++ b/doc/doxygen/output/html/ip4__frag_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip4__frag_8h.html b/doc/doxygen/output/html/ip4__frag_8h.html
index 865e2d0..17ca231 100644
--- a/doc/doxygen/output/html/ip4__frag_8h.html
+++ b/doc/doxygen/output/html/ip4__frag_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip6_8c.html b/doc/doxygen/output/html/ip6_8c.html
index 093ca73..3349e5a 100644
--- a/doc/doxygen/output/html/ip6_8c.html
+++ b/doc/doxygen/output/html/ip6_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip6_8h.html b/doc/doxygen/output/html/ip6_8h.html
index 82595cf..ecc5de7 100644
--- a/doc/doxygen/output/html/ip6_8h.html
+++ b/doc/doxygen/output/html/ip6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip6__addr_8c.html b/doc/doxygen/output/html/ip6__addr_8c.html
index 27fb611..6b783c8 100644
--- a/doc/doxygen/output/html/ip6__addr_8c.html
+++ b/doc/doxygen/output/html/ip6__addr_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -105,6 +105,7 @@
 <div class="textblock"><code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="def_8h.html">lwip/def.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
 <code>#include &lt;string.h&gt;</code><br />
 <code>#include &quot;<a class="el" href="ip4__addr_8h.html">lwip/ip4_addr.h</a>&quot;</code><br />
 </div><table class="memberdecls">
diff --git a/doc/doxygen/output/html/ip6__addr_8h.html b/doc/doxygen/output/html/ip6__addr_8h.html
index 83b0d33..53ba77b 100644
--- a/doc/doxygen/output/html/ip6__addr_8h.html
+++ b/doc/doxygen/output/html/ip6__addr_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -154,14 +154,24 @@
 <tr class="separator:ad636c27d56d1b3deca9f780bc173d3c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:acc1622ab895680da0a3b6e5e56070342" id="r_acc1622ab895680da0a3b6e5e56070342"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#acc1622ab895680da0a3b6e5e56070342">ip6_addr_netcmp_zoneless</a>(addr1,  addr2)</td></tr>
 <tr class="separator:acc1622ab895680da0a3b6e5e56070342"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc9d2b8d0a05f2ff23ab3b7fd3bf8229" id="r_afc9d2b8d0a05f2ff23ab3b7fd3bf8229"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#afc9d2b8d0a05f2ff23ab3b7fd3bf8229">ip6_addr_net_zoneless_eq</a>(addr1,  addr2)</td></tr>
+<tr class="separator:afc9d2b8d0a05f2ff23ab3b7fd3bf8229"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a76b01f76b65647767d00ee9fad9fbaa2" id="r_a76b01f76b65647767d00ee9fad9fbaa2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a76b01f76b65647767d00ee9fad9fbaa2">ip6_addr_netcmp</a>(addr1,  addr2)</td></tr>
 <tr class="separator:a76b01f76b65647767d00ee9fad9fbaa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a983c7d613ab45e37aaf66c067a0c7a" id="r_a9a983c7d613ab45e37aaf66c067a0c7a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9a983c7d613ab45e37aaf66c067a0c7a">ip6_addr_net_eq</a>(addr1,  addr2)</td></tr>
+<tr class="separator:a9a983c7d613ab45e37aaf66c067a0c7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad0fc088972d395839a7ad75d3dab8322" id="r_ad0fc088972d395839a7ad75d3dab8322"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ad0fc088972d395839a7ad75d3dab8322">ip6_addr_cmp_zoneless</a>(addr1,  addr2)</td></tr>
 <tr class="separator:ad0fc088972d395839a7ad75d3dab8322"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a811d8a2aa6417ae22a7a46b27d9ead26" id="r_a811d8a2aa6417ae22a7a46b27d9ead26"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a811d8a2aa6417ae22a7a46b27d9ead26">ip6_addr_zoneless_eq</a>(addr1,  addr2)</td></tr>
+<tr class="separator:a811d8a2aa6417ae22a7a46b27d9ead26"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aea8d4c4134abff1c76bc997a91163fe1" id="r_aea8d4c4134abff1c76bc997a91163fe1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aea8d4c4134abff1c76bc997a91163fe1">ip6_addr_cmp</a>(addr1,  addr2)</td></tr>
 <tr class="separator:aea8d4c4134abff1c76bc997a91163fe1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ea0b6b837baff1e1e62cccd4f17d50e" id="r_a9ea0b6b837baff1e1e62cccd4f17d50e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9ea0b6b837baff1e1e62cccd4f17d50e">ip6_addr_eq</a>(addr1,  addr2)</td></tr>
+<tr class="separator:a9ea0b6b837baff1e1e62cccd4f17d50e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a11fe84789e3f039b3f71009e802946a8" id="r_a11fe84789e3f039b3f71009e802946a8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a11fe84789e3f039b3f71009e802946a8">ip6_addr_cmp_packed</a>(ip6addr,  paddr,  zone_idx)</td></tr>
 <tr class="separator:a11fe84789e3f039b3f71009e802946a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa324ac65d537997ebaaed78bd40f6da9" id="r_aa324ac65d537997ebaaed78bd40f6da9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa324ac65d537997ebaaed78bd40f6da9">ip6_addr_packed_eq</a>(ip6addr,  paddr,  zone_idx)</td></tr>
+<tr class="separator:aa324ac65d537997ebaaed78bd40f6da9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
 Typedefs</h2></td></tr>
@@ -394,18 +404,9 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line">                                    (<a class="code hl_define" href="#ad0fc088972d395839a7ad75d3dab8322">ip6_addr_cmp_zoneless</a>((addr1), (addr2)) &amp;&amp; \</div>
-<div class="line">                                    ip6_addr_cmp_zone((addr1), (addr2)))</div>
-<div class="ttc" id="aip6__addr_8h_html_ad0fc088972d395839a7ad75d3dab8322"><div class="ttname"><a href="#ad0fc088972d395839a7ad75d3dab8322">ip6_addr_cmp_zoneless</a></div><div class="ttdeci">#define ip6_addr_cmp_zoneless(addr1, addr2)</div><div class="ttdef"><b>Definition</b> ip6_addr.h:168</div></div>
-</div><!-- fragment --><p>Determine if two IPv6 addresses are the same. In particular, the address part of both must be the same, and the zone must be compatible.</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">addr1</td><td>IPv6 address 1 </td></tr>
-    <tr><td class="paramname">addr2</td><td>IPv6 address 2 </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>1 if the addresses are considered equal, 0 if not </dd></dl>
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#a9ea0b6b837baff1e1e62cccd4f17d50e">ip6_addr_eq</a>(addr1, addr2)</div>
+<div class="ttc" id="aip6__addr_8h_html_a9ea0b6b837baff1e1e62cccd4f17d50e"><div class="ttname"><a href="#a9ea0b6b837baff1e1e62cccd4f17d50e">ip6_addr_eq</a></div><div class="ttdeci">#define ip6_addr_eq(addr1, addr2)</div><div class="ttdef"><b>Definition</b> ip6_addr.h:192</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000008">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#a9ea0b6b837baff1e1e62cccd4f17d50e">ip6_addr_eq</a> </dd></dl>
 
 </div>
 </div>
@@ -432,12 +433,9 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line">                                    (((ip6addr)-&gt;addr[0] == (paddr)-&gt;addr[0]) &amp;&amp; \</div>
-<div class="line">                                    ((ip6addr)-&gt;addr[1] == (paddr)-&gt;addr[1]) &amp;&amp; \</div>
-<div class="line">                                    ((ip6addr)-&gt;addr[2] == (paddr)-&gt;addr[2]) &amp;&amp; \</div>
-<div class="line">                                    ((ip6addr)-&gt;addr[3] == (paddr)-&gt;addr[3]) &amp;&amp; \</div>
-<div class="line">                                    ip6_addr_equals_zone((ip6addr), (zone_idx)))</div>
-</div><!-- fragment --><p>Compare IPv6 address to packed address and zone </p>
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#aa324ac65d537997ebaaed78bd40f6da9">ip6_addr_packed_eq</a>(ip6addr, paddr, zone_idx)</div>
+<div class="ttc" id="aip6__addr_8h_html_aa324ac65d537997ebaaed78bd40f6da9"><div class="ttname"><a href="#aa324ac65d537997ebaaed78bd40f6da9">ip6_addr_packed_eq</a></div><div class="ttdeci">#define ip6_addr_packed_eq(ip6addr, paddr, zone_idx)</div><div class="ttdef"><b>Definition</b> ip6_addr.h:198</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000009">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#aa324ac65d537997ebaaed78bd40f6da9">ip6_addr_packed_eq</a> </dd></dl>
 
 </div>
 </div>
@@ -459,11 +457,9 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line">                                    (((addr1)-&gt;addr[0] == (addr2)-&gt;addr[0]) &amp;&amp; \</div>
-<div class="line">                                    ((addr1)-&gt;addr[1] == (addr2)-&gt;addr[1]) &amp;&amp; \</div>
-<div class="line">                                    ((addr1)-&gt;addr[2] == (addr2)-&gt;addr[2]) &amp;&amp; \</div>
-<div class="line">                                    ((addr1)-&gt;addr[3] == (addr2)-&gt;addr[3]))</div>
-</div><!-- fragment --><p>Compare IPv6 addresses, ignoring zone information. To be used sparingly! </p>
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#a811d8a2aa6417ae22a7a46b27d9ead26">ip6_addr_zoneless_eq</a>(addr1, addr2)</div>
+<div class="ttc" id="aip6__addr_8h_html_a811d8a2aa6417ae22a7a46b27d9ead26"><div class="ttname"><a href="#a811d8a2aa6417ae22a7a46b27d9ead26">ip6_addr_zoneless_eq</a></div><div class="ttdeci">#define ip6_addr_zoneless_eq(addr1, addr2)</div><div class="ttdef"><b>Definition</b> ip6_addr.h:178</div></div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000007">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#a811d8a2aa6417ae22a7a46b27d9ead26">ip6_addr_zoneless_eq</a> </dd></dl>
 
 </div>
 </div>
@@ -547,6 +543,95 @@
 
 </div>
 </div>
+<a id="a9ea0b6b837baff1e1e62cccd4f17d50e" name="a9ea0b6b837baff1e1e62cccd4f17d50e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ea0b6b837baff1e1e62cccd4f17d50e">&#9670;&#160;</a></span>ip6_addr_eq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_eq</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">                                    (<a class="code hl_define" href="#a811d8a2aa6417ae22a7a46b27d9ead26">ip6_addr_zoneless_eq</a>((addr1), (addr2)) &amp;&amp; \</div>
+<div class="line">                                    ip6_addr_zone_eq((addr1), (addr2)))</div>
+</div><!-- fragment --><p>Determine if two IPv6 addresses are the same. In particular, the address part of both must be the same, and the zone must be compatible.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr1</td><td>IPv6 address 1 </td></tr>
+    <tr><td class="paramname">addr2</td><td>IPv6 address 2 </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if the addresses are considered equal, 0 if not </dd></dl>
+
+</div>
+</div>
+<a id="a9a983c7d613ab45e37aaf66c067a0c7a" name="a9a983c7d613ab45e37aaf66c067a0c7a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a983c7d613ab45e37aaf66c067a0c7a">&#9670;&#160;</a></span>ip6_addr_net_eq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_net_eq</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">                                       (<a class="code hl_define" href="#afc9d2b8d0a05f2ff23ab3b7fd3bf8229">ip6_addr_net_zoneless_eq</a>((addr1), (addr2)) &amp;&amp; \</div>
+<div class="line">                                       ip6_addr_zone_eq((addr1), (addr2)))</div>
+<div class="ttc" id="aip6__addr_8h_html_afc9d2b8d0a05f2ff23ab3b7fd3bf8229"><div class="ttname"><a href="#afc9d2b8d0a05f2ff23ab3b7fd3bf8229">ip6_addr_net_zoneless_eq</a></div><div class="ttdeci">#define ip6_addr_net_zoneless_eq(addr1, addr2)</div><div class="ttdef"><b>Definition</b> ip6_addr.h:152</div></div>
+</div><!-- fragment --><p>Determine if two IPv6 address are on the same network.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">addr1</td><td>IPv6 address 1 </td></tr>
+    <tr><td class="paramname">addr2</td><td>IPv6 address 2 </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if the network identifiers of both address match, 0 if not </dd></dl>
+
+</div>
+</div>
+<a id="afc9d2b8d0a05f2ff23ab3b7fd3bf8229" name="afc9d2b8d0a05f2ff23ab3b7fd3bf8229"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc9d2b8d0a05f2ff23ab3b7fd3bf8229">&#9670;&#160;</a></span>ip6_addr_net_zoneless_eq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_net_zoneless_eq</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">                                               (((addr1)-&gt;addr[0] == (addr2)-&gt;addr[0]) &amp;&amp; \</div>
+<div class="line">                                               ((addr1)-&gt;addr[1] == (addr2)-&gt;addr[1]))</div>
+</div><!-- fragment --><p>Compare IPv6 networks, ignoring zone information. To be used sparingly! </p>
+
+</div>
+</div>
 <a id="a76b01f76b65647767d00ee9fad9fbaa2" name="a76b01f76b65647767d00ee9fad9fbaa2"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a76b01f76b65647767d00ee9fad9fbaa2">&#9670;&#160;</a></span>ip6_addr_netcmp</h2>
 
@@ -565,18 +650,9 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line">                                       (<a class="code hl_define" href="#acc1622ab895680da0a3b6e5e56070342">ip6_addr_netcmp_zoneless</a>((addr1), (addr2)) &amp;&amp; \</div>
-<div class="line">                                       ip6_addr_cmp_zone((addr1), (addr2)))</div>
-<div class="ttc" id="aip6__addr_8h_html_acc1622ab895680da0a3b6e5e56070342"><div class="ttname"><a href="#acc1622ab895680da0a3b6e5e56070342">ip6_addr_netcmp_zoneless</a></div><div class="ttdeci">#define ip6_addr_netcmp_zoneless(addr1, addr2)</div><div class="ttdef"><b>Definition</b> ip6_addr.h:150</div></div>
-</div><!-- fragment --><p>Determine if two IPv6 address are on the same network.</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">addr1</td><td>IPv6 address 1 </td></tr>
-    <tr><td class="paramname">addr2</td><td>IPv6 address 2 </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>1 if the network identifiers of both address match, 0 if not </dd></dl>
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#a9a983c7d613ab45e37aaf66c067a0c7a">ip6_addr_net_eq</a>(addr1, addr2)</div>
+<div class="ttc" id="aip6__addr_8h_html_a9a983c7d613ab45e37aaf66c067a0c7a"><div class="ttname"><a href="#a9a983c7d613ab45e37aaf66c067a0c7a">ip6_addr_net_eq</a></div><div class="ttdeci">#define ip6_addr_net_eq(addr1, addr2)</div><div class="ttdef"><b>Definition</b> ip6_addr.h:167</div></div>
+</div><!-- fragment --><p>Determine if two IPv6 address are on the same network. </p><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000006">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#a9a983c7d613ab45e37aaf66c067a0c7a">ip6_addr_net_eq</a> </dd></dl>
 
 </div>
 </div>
@@ -598,9 +674,40 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<b>Value:</b><div class="fragment"><div class="line">                                               (((addr1)-&gt;addr[0] == (addr2)-&gt;addr[0]) &amp;&amp; \</div>
-<div class="line">                                               ((addr1)-&gt;addr[1] == (addr2)-&gt;addr[1]))</div>
-</div><!-- fragment --><p>Compare IPv6 networks, ignoring zone information. To be used sparingly! </p>
+<b>Value:</b><div class="fragment"><div class="line"><a class="code hl_define" href="#afc9d2b8d0a05f2ff23ab3b7fd3bf8229">ip6_addr_net_zoneless_eq</a>(addr1, addr2)</div>
+</div><!-- fragment --><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000005">Deprecated</a></b></dt><dd>Renamed to <a class="el" href="#afc9d2b8d0a05f2ff23ab3b7fd3bf8229">ip6_addr_net_zoneless_eq</a> </dd></dl>
+
+</div>
+</div>
+<a id="aa324ac65d537997ebaaed78bd40f6da9" name="aa324ac65d537997ebaaed78bd40f6da9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa324ac65d537997ebaaed78bd40f6da9">&#9670;&#160;</a></span>ip6_addr_packed_eq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_packed_eq</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>ip6addr</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>paddr</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>zone_idx</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">                                    (((ip6addr)-&gt;addr[0] == (paddr)-&gt;addr[0]) &amp;&amp; \</div>
+<div class="line">                                    ((ip6addr)-&gt;addr[1] == (paddr)-&gt;addr[1]) &amp;&amp; \</div>
+<div class="line">                                    ((ip6addr)-&gt;addr[2] == (paddr)-&gt;addr[2]) &amp;&amp; \</div>
+<div class="line">                                    ((ip6addr)-&gt;addr[3] == (paddr)-&gt;addr[3]) &amp;&amp; \</div>
+<div class="line">                                    ip6_addr_equals_zone((ip6addr), (zone_idx)))</div>
+</div><!-- fragment --><p>Compare IPv6 address to packed address and zone </p>
 
 </div>
 </div>
@@ -770,6 +877,32 @@
 
 </div>
 </div>
+<a id="a811d8a2aa6417ae22a7a46b27d9ead26" name="a811d8a2aa6417ae22a7a46b27d9ead26"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a811d8a2aa6417ae22a7a46b27d9ead26">&#9670;&#160;</a></span>ip6_addr_zoneless_eq</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ip6_addr_zoneless_eq</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr1</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em>addr2</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">                                    (((addr1)-&gt;addr[0] == (addr2)-&gt;addr[0]) &amp;&amp; \</div>
+<div class="line">                                    ((addr1)-&gt;addr[1] == (addr2)-&gt;addr[1]) &amp;&amp; \</div>
+<div class="line">                                    ((addr1)-&gt;addr[2] == (addr2)-&gt;addr[2]) &amp;&amp; \</div>
+<div class="line">                                    ((addr1)-&gt;addr[3] == (addr2)-&gt;addr[3]))</div>
+</div><!-- fragment --><p>Compare IPv6 addresses, ignoring zone information. To be used sparingly! </p>
+
+</div>
+</div>
 <h2 class="groupheader">Typedef Documentation</h2>
 <a id="aaca9e796e93a355294c4954c08d01762" name="aaca9e796e93a355294c4954c08d01762"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aaca9e796e93a355294c4954c08d01762">&#9670;&#160;</a></span>ip6_addr_t</h2>
diff --git a/doc/doxygen/output/html/ip6__addr_8h.js b/doc/doxygen/output/html/ip6__addr_8h.js
index 4ec0fc8..a721074 100644
--- a/doc/doxygen/output/html/ip6__addr_8h.js
+++ b/doc/doxygen/output/html/ip6__addr_8h.js
@@ -16,14 +16,19 @@
     [ "ip6_addr_copy", "ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073", null ],
     [ "ip6_addr_copy_from_packed", "ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3", null ],
     [ "ip6_addr_copy_to_packed", "ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b", null ],
+    [ "ip6_addr_eq", "ip6__addr_8h.html#a9ea0b6b837baff1e1e62cccd4f17d50e", null ],
+    [ "ip6_addr_net_eq", "ip6__addr_8h.html#a9a983c7d613ab45e37aaf66c067a0c7a", null ],
+    [ "ip6_addr_net_zoneless_eq", "ip6__addr_8h.html#afc9d2b8d0a05f2ff23ab3b7fd3bf8229", null ],
     [ "ip6_addr_netcmp", "ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2", null ],
     [ "ip6_addr_netcmp_zoneless", "ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342", null ],
+    [ "ip6_addr_packed_eq", "ip6__addr_8h.html#aa324ac65d537997ebaaed78bd40f6da9", null ],
     [ "IP6_ADDR_PART", "ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd", null ],
     [ "ip6_addr_set", "ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad", null ],
     [ "ip6_addr_set_any", "ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b", null ],
     [ "ip6_addr_set_hton", "ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2", null ],
     [ "ip6_addr_set_loopback", "ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292", null ],
     [ "ip6_addr_set_zero", "ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c", null ],
+    [ "ip6_addr_zoneless_eq", "ip6__addr_8h.html#a811d8a2aa6417ae22a7a46b27d9ead26", null ],
     [ "ip6_addr_t", "ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762", null ],
     [ "ip6addr_aton", "ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e", null ],
     [ "ip6addr_ntoa", "ip6__addr_8h.html#ab153e5b58a5674e5e1bacdbbc0934c44", null ],
diff --git a/doc/doxygen/output/html/ip6__frag_8c.html b/doc/doxygen/output/html/ip6__frag_8c.html
index b90b4fb..ec721b7 100644
--- a/doc/doxygen/output/html/ip6__frag_8c.html
+++ b/doc/doxygen/output/html/ip6__frag_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip6__frag_8h.html b/doc/doxygen/output/html/ip6__frag_8h.html
index 3e0b3ab..9790e8f 100644
--- a/doc/doxygen/output/html/ip6__frag_8h.html
+++ b/doc/doxygen/output/html/ip6__frag_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip6__zone_8h.html b/doc/doxygen/output/html/ip6__zone_8h.html
index b28eee6..72c55a8 100644
--- a/doc/doxygen/output/html/ip6__zone_8h.html
+++ b/doc/doxygen/output/html/ip6__zone_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -122,8 +122,10 @@
 <tr class="separator:ga7347729485d837bcff85ae4731bbf5c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaeead8379cc3fd4c257be0bb654994a8f" id="r_gaeead8379cc3fd4c257be0bb654994a8f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f">ip6_addr_equals_zone</a>(ip6addr,  zone_idx)</td></tr>
 <tr class="separator:gaeead8379cc3fd4c257be0bb654994a8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gacbb8e1a7505d9772181defa0e75b8da9" id="r_gacbb8e1a7505d9772181defa0e75b8da9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9">ip6_addr_cmp_zone</a>(ip6addr1,  ip6addr2)</td></tr>
-<tr class="separator:gacbb8e1a7505d9772181defa0e75b8da9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac01d0bad0a682dcc239ba3d5695e0648" id="r_gac01d0bad0a682dcc239ba3d5695e0648"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gac01d0bad0a682dcc239ba3d5695e0648">ip6_addr_cmp_zone</a>(addr1,  addr2)</td></tr>
+<tr class="separator:gac01d0bad0a682dcc239ba3d5695e0648"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabc6d5f833b2abef31aa602dc11ace0a9" id="r_gabc6d5f833b2abef31aa602dc11ace0a9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gabc6d5f833b2abef31aa602dc11ace0a9">ip6_addr_zone_eq</a>(ip6addr1,  ip6addr2)</td></tr>
+<tr class="separator:gabc6d5f833b2abef31aa602dc11ace0a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gae677a65970f4b667156b256dd9a4924b" id="r_gae677a65970f4b667156b256dd9a4924b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b">IPV6_CUSTOM_SCOPES</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gae677a65970f4b667156b256dd9a4924b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaa5332bb3b70c1a9acba1bea3ea0ecb90" id="r_gaa5332bb3b70c1a9acba1bea3ea0ecb90"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90">ip6_addr_has_scope</a>(ip6addr,  type)</td></tr>
diff --git a/doc/doxygen/output/html/ip6__zone_8h.js b/doc/doxygen/output/html/ip6__zone_8h.js
index 3ae3aae..b7abfc6 100644
--- a/doc/doxygen/output/html/ip6__zone_8h.js
+++ b/doc/doxygen/output/html/ip6__zone_8h.js
@@ -2,7 +2,7 @@
 [
     [ "ip6_addr_assign_zone", "group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5", null ],
     [ "ip6_addr_clear_zone", "group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad", null ],
-    [ "ip6_addr_cmp_zone", "group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9", null ],
+    [ "ip6_addr_cmp_zone", "group__ip6__zones.html#gac01d0bad0a682dcc239ba3d5695e0648", null ],
     [ "ip6_addr_copy_zone", "group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4", null ],
     [ "ip6_addr_equals_zone", "group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f", null ],
     [ "ip6_addr_has_scope", "group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90", null ],
@@ -12,6 +12,7 @@
     [ "ip6_addr_set_zone", "group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6", null ],
     [ "ip6_addr_test_zone", "group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e", null ],
     [ "ip6_addr_zone", "group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634", null ],
+    [ "ip6_addr_zone_eq", "group__ip6__zones.html#gabc6d5f833b2abef31aa602dc11ace0a9", null ],
     [ "IP6_NO_ZONE", "group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb", null ],
     [ "IPADDR6_ZONE_INIT", "group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9", null ],
     [ "IPV6_CUSTOM_SCOPES", "group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b", null ],
diff --git a/doc/doxygen/output/html/ip_8c.html b/doc/doxygen/output/html/ip_8c.html
index c2d64a3..ecff9c7 100644
--- a/doc/doxygen/output/html/ip_8c.html
+++ b/doc/doxygen/output/html/ip_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/ip_8h.html b/doc/doxygen/output/html/ip_8h.html
index d7e4f6a..554e844 100644
--- a/doc/doxygen/output/html/ip_8h.html
+++ b/doc/doxygen/output/html/ip_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -209,7 +209,7 @@
 <b>Value:</b><div class="fragment"><div class="line">(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;<a class="code hl_variable" href="#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a>.<a class="code hl_variable" href="structip__globals.html#a0b4e54250c692c638408de54593d2aa1">current_iphdr_dest</a>))</div>
 <div class="ttc" id="agroup__ip4addr_html_gad7268a496b7e3f872efecd859eba6f03"><div class="ttname"><a href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a></div><div class="ttdeci">#define ip_2_ip4(ipaddr)</div><div class="ttdef"><b>Definition</b> ip_addr.h:120</div></div>
 <div class="ttc" id="aip_8h_html_ac944fb6564f181bc90bc7c2b8b00d94c"><div class="ttname"><a href="#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a></div><div class="ttdeci">struct ip_globals ip_data</div><div class="ttdef"><b>Definition</b> ip.c:64</div></div>
-<div class="ttc" id="astructip__globals_html_a0b4e54250c692c638408de54593d2aa1"><div class="ttname"><a href="structip__globals.html#a0b4e54250c692c638408de54593d2aa1">ip_globals::current_iphdr_dest</a></div><div class="ttdeci">ip_addr_t current_iphdr_dest</div><div class="ttdef"><b>Definition</b> ip.h:126</div></div>
+<div class="ttc" id="astructip__globals_html_a0b4e54250c692c638408de54593d2aa1"><div class="ttname"><a href="structip__globals.html#a0b4e54250c692c638408de54593d2aa1">ip_globals::current_iphdr_dest</a></div><div class="ttdeci">ip_addr_t current_iphdr_dest</div><div class="ttdef"><b>Definition</b> ip.h:137</div></div>
 </div><!-- fragment --><p>Destination IP4 address of current_header </p>
 
 </div>
@@ -229,7 +229,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_variable" href="#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a>.<a class="code hl_variable" href="structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4">current_ip4_header</a></div>
-<div class="ttc" id="astructip__globals_html_a2e810f97cf3e8e855e3baafc3be8c0d4"><div class="ttname"><a href="structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4">ip_globals::current_ip4_header</a></div><div class="ttdeci">const struct ip_hdr * current_ip4_header</div><div class="ttdef"><b>Definition</b> ip.h:115</div></div>
+<div class="ttc" id="astructip__globals_html_a2e810f97cf3e8e855e3baafc3be8c0d4"><div class="ttname"><a href="structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4">ip_globals::current_ip4_header</a></div><div class="ttdeci">const struct ip_hdr * current_ip4_header</div><div class="ttdef"><b>Definition</b> ip.h:126</div></div>
 </div><!-- fragment --><p>Get the IPv4 header of the current packet. This function must only be called from a receive callback (udp_recv, raw_recv, tcp_accept). It will return NULL otherwise. </p>
 
 </div>
@@ -249,7 +249,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">(<a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(&amp;<a class="code hl_variable" href="#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a>.<a class="code hl_variable" href="structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0">current_iphdr_src</a>))</div>
-<div class="ttc" id="astructip__globals_html_a04d85a3dc2c417050b3e088fa58a74b0"><div class="ttname"><a href="structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0">ip_globals::current_iphdr_src</a></div><div class="ttdeci">ip_addr_t current_iphdr_src</div><div class="ttdef"><b>Definition</b> ip.h:124</div></div>
+<div class="ttc" id="astructip__globals_html_a04d85a3dc2c417050b3e088fa58a74b0"><div class="ttname"><a href="structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0">ip_globals::current_iphdr_src</a></div><div class="ttdeci">ip_addr_t current_iphdr_src</div><div class="ttdef"><b>Definition</b> ip.h:135</div></div>
 </div><!-- fragment --><p>Source IP4 address of current_header </p>
 
 </div>
@@ -290,7 +290,7 @@
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">((<span class="keyword">const</span> <span class="keyword">struct </span><a class="code hl_struct" href="structip6__hdr.html">ip6_hdr</a>*)(<a class="code hl_variable" href="#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a>.<a class="code hl_variable" href="structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41">current_ip6_header</a>))</div>
 <div class="ttc" id="astructip6__hdr_html"><div class="ttname"><a href="structip6__hdr.html">ip6_hdr</a></div><div class="ttdef"><b>Definition</b> ip6.h:82</div></div>
-<div class="ttc" id="astructip__globals_html_aa5cfc3ac29dc746a4cbe844206b0ed41"><div class="ttname"><a href="structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41">ip_globals::current_ip6_header</a></div><div class="ttdeci">struct ip6_hdr * current_ip6_header</div><div class="ttdef"><b>Definition</b> ip.h:119</div></div>
+<div class="ttc" id="astructip__globals_html_aa5cfc3ac29dc746a4cbe844206b0ed41"><div class="ttname"><a href="structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41">ip_globals::current_ip6_header</a></div><div class="ttdeci">struct ip6_hdr * current_ip6_header</div><div class="ttdef"><b>Definition</b> ip.h:130</div></div>
 </div><!-- fragment --><p>Get the IPv6 header of the current packet. This function must only be called from a receive callback (udp_recv, raw_recv, tcp_accept). It will return NULL otherwise. </p>
 
 </div>
@@ -371,9 +371,9 @@
 <b>Value:</b><div class="fragment"><div class="line">                                   (<a class="code hl_define" href="#abc56623d434a204298a4e98352af1c9d">ip_current_is_v6</a>() ? \</div>
 <div class="line">                                   IP6H_NEXTH(<a class="code hl_define" href="#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header</a>()) :\</div>
 <div class="line">                                   IPH_PROTO(<a class="code hl_define" href="#a3ce482b7e08282effd670001198ecd87">ip4_current_header</a>()))</div>
-<div class="ttc" id="aip_8h_html_a3ce482b7e08282effd670001198ecd87"><div class="ttname"><a href="#a3ce482b7e08282effd670001198ecd87">ip4_current_header</a></div><div class="ttdeci">#define ip4_current_header()</div><div class="ttdef"><b>Definition</b> ip.h:151</div></div>
-<div class="ttc" id="aip_8h_html_abc56623d434a204298a4e98352af1c9d"><div class="ttname"><a href="#abc56623d434a204298a4e98352af1c9d">ip_current_is_v6</a></div><div class="ttdeci">#define ip_current_is_v6()</div><div class="ttdef"><b>Definition</b> ip.h:157</div></div>
-<div class="ttc" id="aip_8h_html_af9bf74750c9d7a219ee88d240300fe69"><div class="ttname"><a href="#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header</a></div><div class="ttdeci">#define ip6_current_header()</div><div class="ttdef"><b>Definition</b> ip.h:155</div></div>
+<div class="ttc" id="aip_8h_html_a3ce482b7e08282effd670001198ecd87"><div class="ttname"><a href="#a3ce482b7e08282effd670001198ecd87">ip4_current_header</a></div><div class="ttdeci">#define ip4_current_header()</div><div class="ttdef"><b>Definition</b> ip.h:162</div></div>
+<div class="ttc" id="aip_8h_html_abc56623d434a204298a4e98352af1c9d"><div class="ttname"><a href="#abc56623d434a204298a4e98352af1c9d">ip_current_is_v6</a></div><div class="ttdeci">#define ip_current_is_v6()</div><div class="ttdef"><b>Definition</b> ip.h:168</div></div>
+<div class="ttc" id="aip_8h_html_af9bf74750c9d7a219ee88d240300fe69"><div class="ttname"><a href="#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header</a></div><div class="ttdeci">#define ip6_current_header()</div><div class="ttdef"><b>Definition</b> ip.h:166</div></div>
 </div><!-- fragment --><p>Get the transport layer protocol </p>
 
 </div>
@@ -393,7 +393,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">(<a class="code hl_variable" href="#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a>.<a class="code hl_variable" href="structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a">current_ip_header_tot_len</a>)</div>
-<div class="ttc" id="astructip__globals_html_a17004526e6f1a164c0bab01aeac5e34a"><div class="ttname"><a href="structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a">ip_globals::current_ip_header_tot_len</a></div><div class="ttdeci">u16_t current_ip_header_tot_len</div><div class="ttdef"><b>Definition</b> ip.h:122</div></div>
+<div class="ttc" id="astructip__globals_html_a17004526e6f1a164c0bab01aeac5e34a"><div class="ttname"><a href="structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a">ip_globals::current_ip_header_tot_len</a></div><div class="ttdeci">u16_t current_ip_header_tot_len</div><div class="ttdef"><b>Definition</b> ip.h:133</div></div>
 </div><!-- fragment --><p>Total header length of ip(6)_current_header() (i.e. after this, the UDP/TCP header starts) </p>
 
 </div>
@@ -413,7 +413,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">(<a class="code hl_variable" href="#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a>.<a class="code hl_variable" href="structip__globals.html#a7da899c663b1d560b61d92ba6d544701">current_input_netif</a>)</div>
-<div class="ttc" id="astructip__globals_html_a7da899c663b1d560b61d92ba6d544701"><div class="ttname"><a href="structip__globals.html#a7da899c663b1d560b61d92ba6d544701">ip_globals::current_input_netif</a></div><div class="ttdeci">struct netif * current_input_netif</div><div class="ttdef"><b>Definition</b> ip.h:112</div></div>
+<div class="ttc" id="astructip__globals_html_a7da899c663b1d560b61d92ba6d544701"><div class="ttname"><a href="structip__globals.html#a7da899c663b1d560b61d92ba6d544701">ip_globals::current_input_netif</a></div><div class="ttdeci">struct netif * current_input_netif</div><div class="ttdef"><b>Definition</b> ip.h:123</div></div>
 </div><!-- fragment --><p>Get the interface that received the current packet. This function must only be called from a receive callback (udp_recv, raw_recv, tcp_accept). It will return NULL otherwise. </p>
 
 </div>
@@ -452,7 +452,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">(<a class="code hl_variable" href="#ac944fb6564f181bc90bc7c2b8b00d94c">ip_data</a>.<a class="code hl_variable" href="structip__globals.html#a7803dc5950d143e4433a0df689989bab">current_netif</a>)</div>
-<div class="ttc" id="astructip__globals_html_a7803dc5950d143e4433a0df689989bab"><div class="ttname"><a href="structip__globals.html#a7803dc5950d143e4433a0df689989bab">ip_globals::current_netif</a></div><div class="ttdeci">struct netif * current_netif</div><div class="ttdef"><b>Definition</b> ip.h:110</div></div>
+<div class="ttc" id="astructip__globals_html_a7803dc5950d143e4433a0df689989bab"><div class="ttname"><a href="structip__globals.html#a7803dc5950d143e4433a0df689989bab">ip_globals::current_netif</a></div><div class="ttdeci">struct netif * current_netif</div><div class="ttdef"><b>Definition</b> ip.h:121</div></div>
 </div><!-- fragment --><p>Get the interface that accepted the current packet. This may or may not be the receiving netif, depending on your netif/network setup. This function must only be called from a receive callback (udp_recv, raw_recv, tcp_accept). It will return NULL otherwise. </p>
 
 </div>
@@ -536,7 +536,7 @@
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">  ((<span class="keyword">const</span> <span class="keywordtype">void</span>*)((<a class="code hl_define" href="#abc56623d434a204298a4e98352af1c9d">ip_current_is_v6</a>() ? \</div>
 <div class="line">  (<span class="keyword">const</span> u8_t*)<a class="code hl_define" href="#af9bf74750c9d7a219ee88d240300fe69">ip6_current_header</a>() : (<span class="keyword">const</span> u8_t*)<a class="code hl_define" href="#a3ce482b7e08282effd670001198ecd87">ip4_current_header</a>())  + <a class="code hl_define" href="#a2ca15ea285a10982294378cd7b8e83e2">ip_current_header_tot_len</a>()))</div>
-<div class="ttc" id="aip_8h_html_a2ca15ea285a10982294378cd7b8e83e2"><div class="ttname"><a href="#a2ca15ea285a10982294378cd7b8e83e2">ip_current_header_tot_len</a></div><div class="ttdeci">#define ip_current_header_tot_len()</div><div class="ttdef"><b>Definition</b> ip.h:141</div></div>
+<div class="ttc" id="aip_8h_html_a2ca15ea285a10982294378cd7b8e83e2"><div class="ttname"><a href="#a2ca15ea285a10982294378cd7b8e83e2">ip_current_header_tot_len</a></div><div class="ttdeci">#define ip_current_header_tot_len()</div><div class="ttdef"><b>Definition</b> ip.h:152</div></div>
 </div><!-- fragment --><p>Get the transport layer header </p>
 
 </div>
@@ -622,8 +622,8 @@
 <b>Value:</b><div class="fragment"><div class="line">        (IP_IS_V6(dest) ? \</div>
 <div class="line">        ip6_output_if(p, <a class="code hl_define" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(src), LWIP_IP_HDRINCL, 0, 0, 0, <a class="code hl_struct" href="structnetif.html">netif</a>) : \</div>
 <div class="line">        <a class="code hl_function" href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a>(p, <a class="code hl_define" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(src), LWIP_IP_HDRINCL, 0, 0, 0, <a class="code hl_struct" href="structnetif.html">netif</a>))</div>
-<div class="ttc" id="aip4_8c_html_ab220bc4ce4f48bdbba447358b3594917"><div class="ttname"><a href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a></div><div class="ttdeci">err_t ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif)</div><div class="ttdef"><b>Definition</b> ip4.c:787</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="aip4_8c_html_ab220bc4ce4f48bdbba447358b3594917"><div class="ttname"><a href="ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917">ip4_output_if</a></div><div class="ttdeci">err_t ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif)</div><div class="ttdef"><b>Definition</b> ip4.c:821</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>Output IP packet that already includes an IP header. </p>
 
 </div>
diff --git a/doc/doxygen/output/html/ip__addr_8h.html b/doc/doxygen/output/html/ip__addr_8h.html
index 82d9ca0..98705d2 100644
--- a/doc/doxygen/output/html/ip__addr_8h.html
+++ b/doc/doxygen/output/html/ip__addr_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -122,6 +122,30 @@
 <tr class="separator:ga06e75bcd198012b5ba39480c233608bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gad7268a496b7e3f872efecd859eba6f03" id="r_gad7268a496b7e3f872efecd859eba6f03"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03">ip_2_ip4</a>(ipaddr)</td></tr>
 <tr class="separator:gad7268a496b7e3f872efecd859eba6f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3a2123f0bbf6fe843c8542e349c680eb" id="r_ga3a2123f0bbf6fe843c8542e349c680eb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb">ip_addr_netcmp</a>(addr1,  addr2,  mask)</td></tr>
+<tr class="separator:ga3a2123f0bbf6fe843c8542e349c680eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad1bbbe4c93ea2368663e90814953b929" id="r_gad1bbbe4c93ea2368663e90814953b929"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gad1bbbe4c93ea2368663e90814953b929">ip_addr_net_eq</a>(addr1,  addr2,  mask)</td></tr>
+<tr class="separator:gad1bbbe4c93ea2368663e90814953b929"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga008c9c92d770cc030ea054e6b259835a" id="r_ga008c9c92d770cc030ea054e6b259835a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a">ip_addr_cmp</a>(addr1,  addr2)</td></tr>
+<tr class="separator:ga008c9c92d770cc030ea054e6b259835a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga5b40158bdffa4b0c81c4ee77066e6b28" id="r_ga5b40158bdffa4b0c81c4ee77066e6b28"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga5b40158bdffa4b0c81c4ee77066e6b28">ip_addr_eq</a>(addr1,  addr2)</td></tr>
+<tr class="separator:ga5b40158bdffa4b0c81c4ee77066e6b28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadb66f6d5fa926ed4b0e69db58dffcbe4" id="r_gadb66f6d5fa926ed4b0e69db58dffcbe4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4">ip_addr_cmp_zoneless</a>(addr1,  addr2)</td></tr>
+<tr class="separator:gadb66f6d5fa926ed4b0e69db58dffcbe4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga8ac2686417ec2974bb0b3fc6ee0ee1a7" id="r_ga8ac2686417ec2974bb0b3fc6ee0ee1a7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga8ac2686417ec2974bb0b3fc6ee0ee1a7">ip_addr_zoneless_eq</a>(addr1,  addr2)</td></tr>
+<tr class="separator:ga8ac2686417ec2974bb0b3fc6ee0ee1a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga279118890e6a90aa740051fb8b0cc5f4" id="r_ga279118890e6a90aa740051fb8b0cc5f4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4">ip_addr_isany</a>(ipaddr)</td></tr>
+<tr class="separator:ga279118890e6a90aa740051fb8b0cc5f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gacd8f5aa151cff966fd28368b85f38c05" id="r_gacd8f5aa151cff966fd28368b85f38c05"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05">ip_addr_isany_val</a>(ipaddr)</td></tr>
+<tr class="separator:gacd8f5aa151cff966fd28368b85f38c05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa3345706e3aa8b32dd630c195b053e75" id="r_gaa3345706e3aa8b32dd630c195b053e75"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75">ip_addr_isbroadcast</a>(ipaddr,  <a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:gaa3345706e3aa8b32dd630c195b053e75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2170d3ee13dd22722222228e7b1c5752" id="r_ga2170d3ee13dd22722222228e7b1c5752"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752">ip_addr_ismulticast</a>(ipaddr)</td></tr>
+<tr class="separator:ga2170d3ee13dd22722222228e7b1c5752"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0fc8bf6662809274750868683b3a422e" id="r_ga0fc8bf6662809274750868683b3a422e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e">ip_addr_isloopback</a>(ipaddr)</td></tr>
+<tr class="separator:ga0fc8bf6662809274750868683b3a422e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga33bc079baaf513a9a7381b9531a1f653" id="r_ga33bc079baaf513a9a7381b9531a1f653"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653">ip_addr_islinklocal</a>(ipaddr)</td></tr>
+<tr class="separator:ga33bc079baaf513a9a7381b9531a1f653"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga3e5e67b7292b156034560fef2202776c" id="r_ga3e5e67b7292b156034560fef2202776c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c">IP_ADDR_ANY</a>&#160;&#160;&#160;<a class="el" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a></td></tr>
 <tr class="separator:ga3e5e67b7292b156034560fef2202776c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gae920b6e81610a38cf9ada52118807eff" id="r_gae920b6e81610a38cf9ada52118807eff"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff">IP4_ADDR_ANY</a>&#160;&#160;&#160;(&amp;ip_addr_any)</td></tr>
@@ -132,6 +156,8 @@
 <tr class="separator:ga5181d2cb6b9254eb5ad4137f7b3635a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga953cdd2592764ba2e6e021aea350ad43" id="r_ga953cdd2592764ba2e6e021aea350ad43"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43">IP6_ADDR_ANY6</a>&#160;&#160;&#160;(<a class="el" href="group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd">ip_2_ip6</a>(&amp;ip6_addr_any))</td></tr>
 <tr class="separator:ga953cdd2592764ba2e6e021aea350ad43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gabe43b154533b73585c4e58f568370ede" id="r_gabe43b154533b73585c4e58f568370ede"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__ipaddr.html#gabe43b154533b73585c4e58f568370ede">IP_ANY_TYPE</a>&#160;&#160;&#160;(&amp;ip_addr_any_type)</td></tr>
+<tr class="separator:gabe43b154533b73585c4e58f568370ede"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
 Typedefs</h2></td></tr>
diff --git a/doc/doxygen/output/html/ip__addr_8h.js b/doc/doxygen/output/html/ip__addr_8h.js
index e9c4968..507aa78 100644
--- a/doc/doxygen/output/html/ip__addr_8h.js
+++ b/doc/doxygen/output/html/ip__addr_8h.js
@@ -7,6 +7,19 @@
     [ "ip_2_ip4", "group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03", null ],
     [ "ip_2_ip6", "group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd", null ],
     [ "IP_ADDR_ANY", "group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c", null ],
+    [ "ip_addr_cmp", "group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a", null ],
+    [ "ip_addr_cmp_zoneless", "group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4", null ],
+    [ "ip_addr_eq", "group__ipaddr.html#ga5b40158bdffa4b0c81c4ee77066e6b28", null ],
+    [ "ip_addr_isany", "group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4", null ],
+    [ "ip_addr_isany_val", "group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05", null ],
+    [ "ip_addr_isbroadcast", "group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75", null ],
+    [ "ip_addr_islinklocal", "group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653", null ],
+    [ "ip_addr_isloopback", "group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e", null ],
+    [ "ip_addr_ismulticast", "group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752", null ],
+    [ "ip_addr_net_eq", "group__ipaddr.html#gad1bbbe4c93ea2368663e90814953b929", null ],
+    [ "ip_addr_netcmp", "group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb", null ],
+    [ "ip_addr_zoneless_eq", "group__ipaddr.html#ga8ac2686417ec2974bb0b3fc6ee0ee1a7", null ],
+    [ "IP_ANY_TYPE", "group__ipaddr.html#gabe43b154533b73585c4e58f568370ede", null ],
     [ "ip_addr_t", "group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e", null ],
     [ "lwip_ip_addr_type", "group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c", [
       [ "IPADDR_TYPE_V4", "group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049", null ],
diff --git a/doc/doxygen/output/html/lowpan6_8c.html b/doc/doxygen/output/html/lowpan6_8c.html
index 1421240..b89d4d2 100644
--- a/doc/doxygen/output/html/lowpan6_8c.html
+++ b/doc/doxygen/output/html/lowpan6_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lowpan6_8h.html b/doc/doxygen/output/html/lowpan6_8h.html
index f1e20b2..2cea7a0 100644
--- a/doc/doxygen/output/html/lowpan6_8h.html
+++ b/doc/doxygen/output/html/lowpan6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lowpan6__ble_8c.html b/doc/doxygen/output/html/lowpan6__ble_8c.html
index c26d05d..8733164 100644
--- a/doc/doxygen/output/html/lowpan6__ble_8c.html
+++ b/doc/doxygen/output/html/lowpan6__ble_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -116,10 +116,10 @@
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:gaa5b1823c2509b8816ef98dcac67e037c" id="r_gaa5b1823c2509b8816ef98dcac67e037c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c">ble_addr_to_eui64</a> (uint8_t *dst, const uint8_t *src, int public_addr)</td></tr>
-<tr class="separator:gaa5b1823c2509b8816ef98dcac67e037c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga3e245a85f9edddca93ddd2967209881d" id="r_ga3e245a85f9edddca93ddd2967209881d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d">eui64_to_ble_addr</a> (uint8_t *dst, const uint8_t *src)</td></tr>
-<tr class="separator:ga3e245a85f9edddca93ddd2967209881d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga49e3a1fcedd9371023c776f0c3bb3f0f" id="r_ga49e3a1fcedd9371023c776f0c3bb3f0f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f">ble_addr_to_eui64</a> (u8_t *dst, const u8_t *src, int public_addr)</td></tr>
+<tr class="separator:ga49e3a1fcedd9371023c776f0c3bb3f0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga57d33f6024e419e8cbc32dfb783e39a4" id="r_ga57d33f6024e419e8cbc32dfb783e39a4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4">eui64_to_ble_addr</a> (u8_t *dst, const u8_t *src)</td></tr>
+<tr class="separator:ga57d33f6024e419e8cbc32dfb783e39a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a9c5b721f6fb28b4c999baab56a65d8e2" id="r_a9c5b721f6fb28b4c999baab56a65d8e2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9c5b721f6fb28b4c999baab56a65d8e2">rfc7668_set_local_addr_eui64</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const u8_t *local_addr, size_t local_addr_len)</td></tr>
 <tr class="separator:a9c5b721f6fb28b4c999baab56a65d8e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a53d4e8096dd714f94c69d67a6cd49ac2" id="r_a53d4e8096dd714f94c69d67a6cd49ac2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a53d4e8096dd714f94c69d67a6cd49ac2">rfc7668_set_local_addr_mac48</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const u8_t *local_addr, size_t local_addr_len, int is_public_addr)</td></tr>
diff --git a/doc/doxygen/output/html/lowpan6__ble_8c.js b/doc/doxygen/output/html/lowpan6__ble_8c.js
index 388eeb7..23ba9f8 100644
--- a/doc/doxygen/output/html/lowpan6__ble_8c.js
+++ b/doc/doxygen/output/html/lowpan6__ble_8c.js
@@ -1,7 +1,7 @@
 var lowpan6__ble_8c =
 [
-    [ "ble_addr_to_eui64", "group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c", null ],
-    [ "eui64_to_ble_addr", "group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d", null ],
+    [ "ble_addr_to_eui64", "group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f", null ],
+    [ "eui64_to_ble_addr", "group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4", null ],
     [ "rfc7668_if_init", "group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde", null ],
     [ "rfc7668_input", "group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197", null ],
     [ "rfc7668_output", "group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0", null ],
diff --git a/doc/doxygen/output/html/lowpan6__ble_8h.html b/doc/doxygen/output/html/lowpan6__ble_8h.html
index 538ab74..be7a93e 100644
--- a/doc/doxygen/output/html/lowpan6__ble_8h.html
+++ b/doc/doxygen/output/html/lowpan6__ble_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -129,10 +129,10 @@
 <tr class="separator:ga3d940376bd983c14ffcc8d2580f3bdde"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a6ae90ad69f5d901eb44cf87b9120cd9a" id="r_a6ae90ad69f5d901eb44cf87b9120cd9a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a6ae90ad69f5d901eb44cf87b9120cd9a">tcpip_rfc7668_input</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, struct <a class="el" href="structnetif.html">netif</a> *inp)</td></tr>
 <tr class="separator:a6ae90ad69f5d901eb44cf87b9120cd9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaa5b1823c2509b8816ef98dcac67e037c" id="r_gaa5b1823c2509b8816ef98dcac67e037c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c">ble_addr_to_eui64</a> (uint8_t *dst, const uint8_t *src, int public_addr)</td></tr>
-<tr class="separator:gaa5b1823c2509b8816ef98dcac67e037c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga3e245a85f9edddca93ddd2967209881d" id="r_ga3e245a85f9edddca93ddd2967209881d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d">eui64_to_ble_addr</a> (uint8_t *dst, const uint8_t *src)</td></tr>
-<tr class="separator:ga3e245a85f9edddca93ddd2967209881d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga49e3a1fcedd9371023c776f0c3bb3f0f" id="r_ga49e3a1fcedd9371023c776f0c3bb3f0f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f">ble_addr_to_eui64</a> (u8_t *dst, const u8_t *src, int public_addr)</td></tr>
+<tr class="separator:ga49e3a1fcedd9371023c776f0c3bb3f0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga57d33f6024e419e8cbc32dfb783e39a4" id="r_ga57d33f6024e419e8cbc32dfb783e39a4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4">eui64_to_ble_addr</a> (u8_t *dst, const u8_t *src)</td></tr>
+<tr class="separator:ga57d33f6024e419e8cbc32dfb783e39a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>6LowPAN over BLE for IPv6 (RFC7668). </p>
diff --git a/doc/doxygen/output/html/lowpan6__ble_8h.js b/doc/doxygen/output/html/lowpan6__ble_8h.js
index 93fa2ef..828c504 100644
--- a/doc/doxygen/output/html/lowpan6__ble_8h.js
+++ b/doc/doxygen/output/html/lowpan6__ble_8h.js
@@ -1,7 +1,7 @@
 var lowpan6__ble_8h =
 [
-    [ "ble_addr_to_eui64", "group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c", null ],
-    [ "eui64_to_ble_addr", "group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d", null ],
+    [ "ble_addr_to_eui64", "group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f", null ],
+    [ "eui64_to_ble_addr", "group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4", null ],
     [ "rfc7668_if_init", "group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde", null ],
     [ "rfc7668_input", "group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197", null ],
     [ "rfc7668_output", "group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0", null ],
diff --git a/doc/doxygen/output/html/lowpan6__common_8c.html b/doc/doxygen/output/html/lowpan6__common_8c.html
index 114b4ea..8f5c7b2 100644
--- a/doc/doxygen/output/html/lowpan6__common_8c.html
+++ b/doc/doxygen/output/html/lowpan6__common_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lowpan6__common_8h.html b/doc/doxygen/output/html/lowpan6__common_8h.html
index e70d6b3..007adae 100644
--- a/doc/doxygen/output/html/lowpan6__common_8h.html
+++ b/doc/doxygen/output/html/lowpan6__common_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lowpan6__opts_8h.html b/doc/doxygen/output/html/lowpan6__opts_8h.html
index a05a0d8..8f8eb30 100644
--- a/doc/doxygen/output/html/lowpan6__opts_8h.html
+++ b/doc/doxygen/output/html/lowpan6__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lwip_2errno_8h.html b/doc/doxygen/output/html/lwip_2errno_8h.html
index 612f407..c96cb17 100644
--- a/doc/doxygen/output/html/lwip_2errno_8h.html
+++ b/doc/doxygen/output/html/lwip_2errno_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lwip_2etharp_8h.html b/doc/doxygen/output/html/lwip_2etharp_8h.html
index 636d4c0..0bf2be2 100644
--- a/doc/doxygen/output/html/lwip_2etharp_8h.html
+++ b/doc/doxygen/output/html/lwip_2etharp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -140,6 +140,10 @@
 <tr class="separator:a3e56faced96841e615f88dd57d1b2b15"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae94677a2a5f3698276027c7475f6ca05" id="r_ae94677a2a5f3698276027c7475f6ca05"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ae94677a2a5f3698276027c7475f6ca05">etharp_cleanup_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ae94677a2a5f3698276027c7475f6ca05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac7d5048a81ef1c63b18d769700f4899" id="r_aac7d5048a81ef1c63b18d769700f4899"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aac7d5048a81ef1c63b18d769700f4899">etharp_acd_probe</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:aac7d5048a81ef1c63b18d769700f4899"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c41ba8b145fa4d06f8d6af3df44c4ff" id="r_a7c41ba8b145fa4d06f8d6af3df44c4ff"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7c41ba8b145fa4d06f8d6af3df44c4ff">etharp_acd_announce</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr)</td></tr>
+<tr class="separator:a7c41ba8b145fa4d06f8d6af3df44c4ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a540a5506979693ef9ac4496db9bfa7d6" id="r_a540a5506979693ef9ac4496db9bfa7d6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a540a5506979693ef9ac4496db9bfa7d6">etharp_input</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:a540a5506979693ef9ac4496db9bfa7d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
@@ -176,13 +180,73 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line"><a class="code hl_function" href="#a3e56faced96841e615f88dd57d1b2b15">etharp_request</a>((<a class="code hl_struct" href="structnetif.html">netif</a>), netif_ip4_addr(<a class="code hl_struct" href="structnetif.html">netif</a>))</div>
-<div class="ttc" id="alwip_2etharp_8h_html_a3e56faced96841e615f88dd57d1b2b15"><div class="ttname"><a href="#a3e56faced96841e615f88dd57d1b2b15">etharp_request</a></div><div class="ttdeci">err_t etharp_request(struct netif *netif, const ip4_addr_t *ipaddr)</div><div class="ttdef"><b>Definition</b> etharp.c:1206</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
+<div class="ttc" id="alwip_2etharp_8h_html_a3e56faced96841e615f88dd57d1b2b15"><div class="ttname"><a href="#a3e56faced96841e615f88dd57d1b2b15">etharp_request</a></div><div class="ttdeci">err_t etharp_request(struct netif *netif, const ip4_addr_t *ipaddr)</div><div class="ttdef"><b>Definition</b> etharp.c:1207</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
 </div><!-- fragment --><p>For Ethernet network interfaces, we might want to send "gratuitous ARP"; this is an ARP packet sent by a node in order to spontaneously cause other nodes to update an entry in their ARP cache. From RFC 3220 "IP Mobility Support for IPv4" section 4.6. </p>
 
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
+<a id="a7c41ba8b145fa4d06f8d6af3df44c4ff" name="a7c41ba8b145fa4d06f8d6af3df44c4ff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7c41ba8b145fa4d06f8d6af3df44c4ff">&#9670;&#160;</a></span>etharp_acd_announce()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> etharp_acd_announce </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ARP request packet announcing an ipaddr. Used to send announce messages for address conflict detection.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the lwip network interface on which to send the request </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>the IP address to announce </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the request has been sent ERR_MEM if the ARP packet couldn't be allocated any other err_t on failure </dd></dl>
+
+</div>
+</div>
+<a id="aac7d5048a81ef1c63b18d769700f4899" name="aac7d5048a81ef1c63b18d769700f4899"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aac7d5048a81ef1c63b18d769700f4899">&#9670;&#160;</a></span>etharp_acd_probe()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> etharp_acd_probe </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send an ARP request packet probing for an ipaddr. Used to send probe messages for address conflict detection.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the lwip network interface on which to send the request </td></tr>
+    <tr><td class="paramname">ipaddr</td><td>the IP address to probe </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the request has been sent ERR_MEM if the ARP packet couldn't be allocated any other err_t on failure </dd></dl>
+
+</div>
+</div>
 <a id="ae94677a2a5f3698276027c7475f6ca05" name="ae94677a2a5f3698276027c7475f6ca05"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ae94677a2a5f3698276027c7475f6ca05">&#9670;&#160;</a></span>etharp_cleanup_netif()</h2>
 
diff --git a/doc/doxygen/output/html/lwip_2etharp_8h.js b/doc/doxygen/output/html/lwip_2etharp_8h.js
index bdd938a..d2f89bc 100644
--- a/doc/doxygen/output/html/lwip_2etharp_8h.js
+++ b/doc/doxygen/output/html/lwip_2etharp_8h.js
@@ -3,6 +3,8 @@
     [ "etharp_q_entry", "structetharp__q__entry.html", null ],
     [ "ARP_TMR_INTERVAL", "lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37", null ],
     [ "etharp_gratuitous", "lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e", null ],
+    [ "etharp_acd_announce", "lwip_2etharp_8h.html#a7c41ba8b145fa4d06f8d6af3df44c4ff", null ],
+    [ "etharp_acd_probe", "lwip_2etharp_8h.html#aac7d5048a81ef1c63b18d769700f4899", null ],
     [ "etharp_cleanup_netif", "lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05", null ],
     [ "etharp_find_addr", "lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c", null ],
     [ "etharp_get_entry", "lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8", null ],
diff --git a/doc/doxygen/output/html/lwip_2inet_8h.html b/doc/doxygen/output/html/lwip_2inet_8h.html
index 3e33755..ccd545d 100644
--- a/doc/doxygen/output/html/lwip_2inet_8h.html
+++ b/doc/doxygen/output/html/lwip_2inet_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lwip_2netdb_8h.html b/doc/doxygen/output/html/lwip_2netdb_8h.html
index 5fc437d..5313a2a 100644
--- a/doc/doxygen/output/html/lwip_2netdb_8h.html
+++ b/doc/doxygen/output/html/lwip_2netdb_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lwip_2prot_2etharp_8h.html b/doc/doxygen/output/html/lwip_2prot_2etharp_8h.html
index a72d394..6ef078c 100644
--- a/doc/doxygen/output/html/lwip_2prot_2etharp_8h.html
+++ b/doc/doxygen/output/html/lwip_2prot_2etharp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.html b/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.html
index 2c1e246..5e2c23d 100644
--- a/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.html
+++ b/doc/doxygen/output/html/lwip_2prot_2ethernet_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/lwiperf_8c.html b/doc/doxygen/output/html/lwiperf_8c.html
index 948f5bc..3669a89 100644
--- a/doc/doxygen/output/html/lwiperf_8c.html
+++ b/doc/doxygen/output/html/lwiperf_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -108,6 +108,7 @@
 <div class="textblock"><code>#include &quot;<a class="el" href="lwiperf_8h.html">lwip/apps/lwiperf.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="tcp_8h.html">lwip/tcp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="sys_8h.html">lwip/sys.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="lwip_2inet_8h.html">lwip/inet.h</a>&quot;</code><br />
 <code>#include &lt;string.h&gt;</code><br />
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
diff --git a/doc/doxygen/output/html/lwiperf_8h.html b/doc/doxygen/output/html/lwiperf_8h.html
index 37e1a18..4eb97bc 100644
--- a/doc/doxygen/output/html/lwiperf_8h.html
+++ b/doc/doxygen/output/html/lwiperf_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -160,7 +160,15 @@
 </div><div class="memdoc">
 <p>Prototype of a report function that is called when a session is finished. This report function can show the test results. </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
+    <tr><td class="paramname">arg</td><td>Report_arg from when the test was started. </td></tr>
     <tr><td class="paramname">report_type</td><td>contains the test result </td></tr>
+    <tr><td class="paramname">local_addr</td><td>The local address from the session </td></tr>
+    <tr><td class="paramname">local_port</td><td>The local port </td></tr>
+    <tr><td class="paramname">remote_addr</td><td>The remote address from the session </td></tr>
+    <tr><td class="paramname">remote_port</td><td>The remote port </td></tr>
+    <tr><td class="paramname">bytes_transferred</td><td>Total transferred bytes </td></tr>
+    <tr><td class="paramname">ms_duration</td><td>Total session duration, in milliseconds </td></tr>
+    <tr><td class="paramname">bandwidth_kbitpsec</td><td>Average bandwidth during the session, in kbps </td></tr>
   </table>
   </dd>
 </dl>
diff --git a/doc/doxygen/output/html/mdns_8c.html b/doc/doxygen/output/html/mdns_8c.html
index 17d6d84..237dfae 100644
--- a/doc/doxygen/output/html/mdns_8c.html
+++ b/doc/doxygen/output/html/mdns_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -99,203 +99,130 @@
 <div class="header">
   <div class="summary">
 <a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle"><div class="title">mdns.c File Reference</div></div>
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><code>#include &quot;<a class="el" href="mdns_8h.html">lwip/apps/mdns.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="mdns__priv_8h.html">lwip/apps/mdns_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mdns__domain_8h.html">lwip/apps/mdns_domain.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mdns__out_8h.html">lwip/apps/mdns_out.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="mem_8h.html">lwip/mem.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="memp_8h.html">lwip/memp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="prot_2dns_8h.html">lwip/prot/dns.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="timeouts_8h.html">lwip/timeouts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="sys_8h.html">lwip/sys.h</a>&quot;</code><br />
 <code>#include &lt;string.h&gt;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
 <code>#include &quot;<a class="el" href="igmp_8h.html">lwip/igmp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="mld6_8h.html">lwip/mld6.h</a>&quot;</code><br />
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
 Data Structures</h2></td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__service.html">mdns_service</a></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__host.html">mdns_host</a></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__packet.html">mdns_packet</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html">mdns_outpacket</a></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__rr__info.html">mdns_rr_info</a></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a482d6bf710af4424b71ee57034edbdbe" id="r_a482d6bf710af4424b71ee57034edbdbe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a482d6bf710af4424b71ee57034edbdbe">MDNS_RESPONSE_DELAY_MAX</a>&#160;&#160;&#160;120</td></tr>
+<tr class="separator:a482d6bf710af4424b71ee57034edbdbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af24e590bf9c225a2efc0b55fac14809d" id="r_af24e590bf9c225a2efc0b55fac14809d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af24e590bf9c225a2efc0b55fac14809d">MDNS_PROBE_COUNT</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:af24e590bf9c225a2efc0b55fac14809d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:a17db69fa887515374452b945e959bbf9" id="r_a17db69fa887515374452b945e959bbf9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a17db69fa887515374452b945e959bbf9">mdns_domain_add_label</a> (struct mdns_domain *domain, const char *label, u8_t len)</td></tr>
-<tr class="separator:a17db69fa887515374452b945e959bbf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab5f49d9356a76879e0e6a14eb0643b23" id="r_ab5f49d9356a76879e0e6a14eb0643b23"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab5f49d9356a76879e0e6a14eb0643b23">mdns_readname</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, struct mdns_domain *domain)</td></tr>
-<tr class="separator:ab5f49d9356a76879e0e6a14eb0643b23"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a52d8f70432ae998814f16b18431213cd" id="r_a52d8f70432ae998814f16b18431213cd"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a52d8f70432ae998814f16b18431213cd">mdns_domain_eq</a> (struct mdns_domain *a, struct mdns_domain *b)</td></tr>
-<tr class="separator:a52d8f70432ae998814f16b18431213cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab72e48cf076afd1e3a08030d1d0bff9e" id="r_ab72e48cf076afd1e3a08030d1d0bff9e"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_compress_domain</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *<a class="el" href="structpbuf.html">pbuf</a>, u16_t *offset, struct mdns_domain *domain)</td></tr>
-<tr class="separator:ab72e48cf076afd1e3a08030d1d0bff9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaa619ac8f46a4b4021195720f0355cbeb" id="r_gaa619ac8f46a4b4021195720f0355cbeb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb">mdns_resp_add_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *hostname, u32_t dns_ttl)</td></tr>
-<tr class="separator:gaa619ac8f46a4b4021195720f0355cbeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af15fa5b6331bec605f68f53cb87f58fa" id="r_af15fa5b6331bec605f68f53cb87f58fa"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__host.html">mdns_host</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af15fa5b6331bec605f68f53cb87f58fa">netif_mdns_data</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af15fa5b6331bec605f68f53cb87f58fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa31b798a5fb96b6ef0dde5d4f32371af" id="r_aa31b798a5fb96b6ef0dde5d4f32371af"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa31b798a5fb96b6ef0dde5d4f32371af">get_mdns_pcb</a> (void)</td></tr>
+<tr class="separator:aa31b798a5fb96b6ef0dde5d4f32371af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga67f842c27f37c03b48d10e4ce6856b8e" id="r_ga67f842c27f37c03b48d10e4ce6856b8e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e">mdns_resp_add_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *hostname)</td></tr>
+<tr class="separator:ga67f842c27f37c03b48d10e4ce6856b8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaa8144e3c77a92c4043e6214ff6b6010c" id="r_gaa8144e3c77a92c4043e6214ff6b6010c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c">mdns_resp_remove_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:gaa8144e3c77a92c4043e6214ff6b6010c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga7b1473e595eb0c185bab293f3ec2e50e" id="r_ga7b1473e595eb0c185bab293f3ec2e50e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e">mdns_resp_rename_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *hostname)</td></tr>
 <tr class="separator:ga7b1473e595eb0c185bab293f3ec2e50e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga824e992e94be216c8e059f48f49a59ce" id="r_ga824e992e94be216c8e059f48f49a59ce"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga824e992e94be216c8e059f48f49a59ce">mdns_resp_add_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, <a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a> txt_fn, void *txt_data)</td></tr>
-<tr class="separator:ga824e992e94be216c8e059f48f49a59ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga3df2ae751cdfdffb0a567390940eb8ad" id="r_ga3df2ae751cdfdffb0a567390940eb8ad"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad">mdns_resp_del_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t slot)</td></tr>
-<tr class="separator:ga3df2ae751cdfdffb0a567390940eb8ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaf273897059f1bbddc74cfcb820777dd9" id="r_gaf273897059f1bbddc74cfcb820777dd9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9">mdns_resp_rename_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t slot, const char *name)</td></tr>
-<tr class="separator:gaf273897059f1bbddc74cfcb820777dd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09b7a259f497648d8ef734b080f997c1" id="r_ga09b7a259f497648d8ef734b080f997c1"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga09b7a259f497648d8ef734b080f997c1">mdns_resp_netif_active</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga09b7a259f497648d8ef734b080f997c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2130111662d044b32970ce9c763bd409" id="r_ga2130111662d044b32970ce9c763bd409"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga2130111662d044b32970ce9c763bd409">mdns_resp_add_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, <a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a> txt_fn, void *txt_data)</td></tr>
+<tr class="separator:ga2130111662d044b32970ce9c763bd409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga55f3fd46cfe1375452210688fc05bf9a" id="r_ga55f3fd46cfe1375452210688fc05bf9a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a">mdns_resp_del_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t slot)</td></tr>
+<tr class="separator:ga55f3fd46cfe1375452210688fc05bf9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab1e989a4c7305d754377c76052474beb" id="r_gab1e989a4c7305d754377c76052474beb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gab1e989a4c7305d754377c76052474beb">mdns_resp_rename_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t slot, const char *name)</td></tr>
+<tr class="separator:gab1e989a4c7305d754377c76052474beb"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga01c85202f4b85edc8b571f2f419db576" id="r_ga01c85202f4b85edc8b571f2f419db576"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga01c85202f4b85edc8b571f2f419db576">mdns_resp_add_service_txtitem</a> (struct <a class="el" href="structmdns__service.html">mdns_service</a> *service, const char *txt, u8_t txt_len)</td></tr>
 <tr class="separator:ga01c85202f4b85edc8b571f2f419db576"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0c5617b4d021353bbd0fb24ddcb8b3ac" id="r_ga0c5617b4d021353bbd0fb24ddcb8b3ac"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac">mdns_search_stop</a> (u8_t request_id)</td></tr>
+<tr class="separator:ga0c5617b4d021353bbd0fb24ddcb8b3ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac388b2eab379a23dd1f46f2ac8d63725" id="r_gac388b2eab379a23dd1f46f2ac8d63725"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725">mdns_search_service</a> (const char *name, const char *service, enum mdns_sd_proto proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, search_result_fn_t result_fn, void *arg, u8_t *request_id)</td></tr>
+<tr class="separator:gac388b2eab379a23dd1f46f2ac8d63725"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga0f462fb91a9d0323bb4636bd725f0e85" id="r_ga0f462fb91a9d0323bb4636bd725f0e85"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns_resp_announce</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga0f462fb91a9d0323bb4636bd725f0e85"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a01f8850b9c2d2cd40ed77a1438c85bf1" id="r_a01f8850b9c2d2cd40ed77a1438c85bf1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a01f8850b9c2d2cd40ed77a1438c85bf1">mdns_resp_register_name_result_cb</a> (<a class="el" href="mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536">mdns_name_result_cb_t</a> cb)</td></tr>
+<tr class="memitem:a01f8850b9c2d2cd40ed77a1438c85bf1" id="r_a01f8850b9c2d2cd40ed77a1438c85bf1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a01f8850b9c2d2cd40ed77a1438c85bf1">mdns_resp_register_name_result_cb</a> (<a class="el" href="mdns_8h.html#a6d658e2c5228b224b89488663d2b72f7">mdns_name_result_cb_t</a> cb)</td></tr>
 <tr class="separator:a01f8850b9c2d2cd40ed77a1438c85bf1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga367ac89ddae6cbec3e0a9c55e9c46737" id="r_ga367ac89ddae6cbec3e0a9c55e9c46737"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737">mdns_resp_restart_delay</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, uint32_t delay)</td></tr>
+<tr class="separator:ga367ac89ddae6cbec3e0a9c55e9c46737"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga93eccdc0d9afff0f24160d31c70e2c9a" id="r_ga93eccdc0d9afff0f24160d31c70e2c9a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a">mdns_resp_restart</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga93eccdc0d9afff0f24160d31c70e2c9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga5fa15978a398dae1a8d7620ae169bdd3" id="r_ga5fa15978a398dae1a8d7620ae169bdd3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3">mdns_resp_init</a> (void)</td></tr>
 <tr class="separator:ga5fa15978a398dae1a8d7620ae169bdd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaee5b489b77b74511517d41f7609ccd49" id="r_gaee5b489b77b74511517d41f7609ccd49"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gaee5b489b77b74511517d41f7609ccd49">mdns_get_service_txt_userdata</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t slot)</td></tr>
+<tr class="separator:gaee5b489b77b74511517d41f7609ccd49"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>MDNS responder implementation </p>
-</div><h2 class="groupheader">Function Documentation</h2>
-<a id="ab72e48cf076afd1e3a08030d1d0bff9e" name="ab72e48cf076afd1e3a08030d1d0bff9e"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ab72e48cf076afd1e3a08030d1d0bff9e">&#9670;&#160;</a></span>mdns_compress_domain()</h2>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="af24e590bf9c225a2efc0b55fac14809d" name="af24e590bf9c225a2efc0b55fac14809d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af24e590bf9c225a2efc0b55fac14809d">&#9670;&#160;</a></span>MDNS_PROBE_COUNT</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">u16_t mdns_compress_domain </td>
-          <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *</td>          <td class="paramname"><span class="paramname"><em>pbuf</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">u16_t *</td>          <td class="paramname"><span class="paramname"><em>offset</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
+          <td class="memname">#define MDNS_PROBE_COUNT&#160;&#160;&#160;3</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Return bytes needed to write before jump for best result of compressing supplied domain against domain in outpacket starting at specified offset. If a match is found, offset is updated to where to jump to </p><dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">pbuf</td><td>Pointer to pbuf with the partially constructed DNS packet </td></tr>
-    <tr><td class="paramname">offset</td><td>Start position of a domain written earlier. If this location is suitable for compression, the pointer is updated to where in the domain to jump to. </td></tr>
-    <tr><td class="paramname">domain</td><td>The domain to write </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>Number of bytes to write of the new domain before writing a jump to the offset. If compression can not be done against this previous domain name, the full new domain length is returned. </dd></dl>
+<p>Probing &amp; announcing defines </p>
 
 </div>
 </div>
-<a id="a17db69fa887515374452b945e959bbf9" name="a17db69fa887515374452b945e959bbf9"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a17db69fa887515374452b945e959bbf9">&#9670;&#160;</a></span>mdns_domain_add_label()</h2>
+<a id="a482d6bf710af4424b71ee57034edbdbe" name="a482d6bf710af4424b71ee57034edbdbe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a482d6bf710af4424b71ee57034edbdbe">&#9670;&#160;</a></span>MDNS_RESPONSE_DELAY_MAX</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_domain_add_label </td>
-          <td>(</td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>label</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>len</em></span>&#160;)</td>
+          <td class="memname">#define MDNS_RESPONSE_DELAY_MAX&#160;&#160;&#160;120</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Add a label part to a domain </p><dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">domain</td><td>The domain to add a label to </td></tr>
-    <tr><td class="paramname">label</td><td>The label to add, like &lt;hostname&gt;, 'local', 'com' or '' </td></tr>
-    <tr><td class="paramname">len</td><td>The length of the label </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise if label too long </dd></dl>
+<p>Delayed response defines </p>
 
 </div>
 </div>
-<a id="a52d8f70432ae998814f16b18431213cd" name="a52d8f70432ae998814f16b18431213cd"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a52d8f70432ae998814f16b18431213cd">&#9670;&#160;</a></span>mdns_domain_eq()</h2>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aa31b798a5fb96b6ef0dde5d4f32371af" name="aa31b798a5fb96b6ef0dde5d4f32371af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa31b798a5fb96b6ef0dde5d4f32371af">&#9670;&#160;</a></span>get_mdns_pcb()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">int mdns_domain_eq </td>
+          <td class="memname">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> * get_mdns_pcb </td>
           <td>(</td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
+          <td class="paramtype">void</td>          <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
           <td></td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>b</em></span>&#160;)</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Return 1 if contents of domains match (case-insensitive) </p><dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">a</td><td>Domain name to compare 1 </td></tr>
-    <tr><td class="paramname">b</td><td>Domain name to compare 2 </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>1 if domains are equal ignoring case, 0 otherwise </dd></dl>
-
-</div>
-</div>
-<a id="ab5f49d9356a76879e0e6a14eb0643b23" name="ab5f49d9356a76879e0e6a14eb0643b23"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ab5f49d9356a76879e0e6a14eb0643b23">&#9670;&#160;</a></span>mdns_readname()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u16_t mdns_readname </td>
-          <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *</td>          <td class="paramname"><span class="paramname"><em>p</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">u16_t</td>          <td class="paramname"><span class="paramname"><em>offset</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Read possibly compressed domain name from packet buffer </p><dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">p</td><td>The packet </td></tr>
-    <tr><td class="paramname">offset</td><td>start position of domain name in packet </td></tr>
-    <tr><td class="paramname">domain</td><td>The domain name destination </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>The new offset after the domain, or MDNS_READNAME_ERROR if reading failed </dd></dl>
+<p>Construction to access the mdns udp pcb.</p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="structudp__pcb.html">udp_pcb</a> struct of mdns </dd></dl>
 
 </div>
 </div>
@@ -308,7 +235,7 @@
         <tr>
           <td class="memname">void mdns_resp_register_name_result_cb </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536">mdns_name_result_cb_t</a></td>          <td class="paramname"><span class="paramname"><em>cb</em></span></td><td>)</td>
+          <td class="paramtype"><a class="el" href="mdns_8h.html#a6d658e2c5228b224b89488663d2b72f7">mdns_name_result_cb_t</a></td>          <td class="paramname"><span class="paramname"><em>cb</em></span></td><td>)</td>
           <td></td>
         </tr>
       </table>
@@ -317,6 +244,31 @@
 
 </div>
 </div>
+<a id="af15fa5b6331bec605f68f53cb87f58fa" name="af15fa5b6331bec605f68f53cb87f58fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af15fa5b6331bec605f68f53cb87f58fa">&#9670;&#160;</a></span>netif_mdns_data()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmdns__host.html">mdns_host</a> * netif_mdns_data </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Construction to make mdns struct accessible from <a class="el" href="mdns__out_8c.html">mdns_out.c</a> TODO: can we add the mdns struct to the netif like we do for dhcp, autoip,...? Then this is not needed any more.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>The network interface </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>mdns struct </dd></dl>
+
+</div>
+</div>
 </div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/doxygen/output/html/mdns_8c.js b/doc/doxygen/output/html/mdns_8c.js
index 6fe4187..fbeead2 100644
--- a/doc/doxygen/output/html/mdns_8c.js
+++ b/doc/doxygen/output/html/mdns_8c.js
@@ -1,23 +1,24 @@
 var mdns_8c =
 [
-    [ "mdns_service", "structmdns__service.html", "structmdns__service" ],
-    [ "mdns_host", "structmdns__host.html", "structmdns__host" ],
     [ "mdns_packet", "structmdns__packet.html", "structmdns__packet" ],
-    [ "mdns_outpacket", "structmdns__outpacket.html", "structmdns__outpacket" ],
-    [ "mdns_rr_info", "structmdns__rr__info.html", null ],
-    [ "mdns_compress_domain", "mdns_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e", null ],
-    [ "mdns_domain_add_label", "mdns_8c.html#a17db69fa887515374452b945e959bbf9", null ],
-    [ "mdns_domain_eq", "mdns_8c.html#a52d8f70432ae998814f16b18431213cd", null ],
-    [ "mdns_readname", "mdns_8c.html#ab5f49d9356a76879e0e6a14eb0643b23", null ],
-    [ "mdns_resp_add_netif", "group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb", null ],
-    [ "mdns_resp_add_service", "group__mdns.html#ga824e992e94be216c8e059f48f49a59ce", null ],
+    [ "MDNS_PROBE_COUNT", "mdns_8c.html#af24e590bf9c225a2efc0b55fac14809d", null ],
+    [ "MDNS_RESPONSE_DELAY_MAX", "mdns_8c.html#a482d6bf710af4424b71ee57034edbdbe", null ],
+    [ "get_mdns_pcb", "mdns_8c.html#aa31b798a5fb96b6ef0dde5d4f32371af", null ],
+    [ "mdns_get_service_txt_userdata", "group__mdns.html#gaee5b489b77b74511517d41f7609ccd49", null ],
+    [ "mdns_resp_add_netif", "group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e", null ],
+    [ "mdns_resp_add_service", "group__mdns.html#ga2130111662d044b32970ce9c763bd409", null ],
     [ "mdns_resp_add_service_txtitem", "group__mdns.html#ga01c85202f4b85edc8b571f2f419db576", null ],
     [ "mdns_resp_announce", "group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85", null ],
-    [ "mdns_resp_del_service", "group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad", null ],
+    [ "mdns_resp_del_service", "group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a", null ],
     [ "mdns_resp_init", "group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3", null ],
+    [ "mdns_resp_netif_active", "group__mdns.html#ga09b7a259f497648d8ef734b080f997c1", null ],
     [ "mdns_resp_register_name_result_cb", "mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1", null ],
     [ "mdns_resp_remove_netif", "group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c", null ],
     [ "mdns_resp_rename_netif", "group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e", null ],
-    [ "mdns_resp_rename_service", "group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9", null ],
-    [ "mdns_resp_restart", "group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a", null ]
+    [ "mdns_resp_rename_service", "group__mdns.html#gab1e989a4c7305d754377c76052474beb", null ],
+    [ "mdns_resp_restart", "group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a", null ],
+    [ "mdns_resp_restart_delay", "group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737", null ],
+    [ "mdns_search_service", "group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725", null ],
+    [ "mdns_search_stop", "group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac", null ],
+    [ "netif_mdns_data", "mdns_8c.html#af15fa5b6331bec605f68f53cb87f58fa", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mdns_8h.html b/doc/doxygen/output/html/mdns_8h.html
index f6517c7..9bf4f07 100644
--- a/doc/doxygen/output/html/mdns_8h.html
+++ b/doc/doxygen/output/html/mdns_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -98,6 +98,7 @@
 
 <div class="header">
   <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
 <a href="#define-members">Macros</a> &#124;
 <a href="#typedef-members">Typedefs</a> &#124;
 <a href="#func-members">Functions</a>  </div>
@@ -107,6 +108,11 @@
 <div class="textblock"><code>#include &quot;<a class="el" href="mdns__opts_8h.html">lwip/apps/mdns_opts.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
 </div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__rr__info.html">mdns_rr_info</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
 Macros</h2></td></tr>
 <tr class="memitem:gab2edba12d5cad1949f7ca040ae12beec" id="r_gab2edba12d5cad1949f7ca040ae12beec"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec">mdns_resp_netif_settings_changed</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
@@ -116,45 +122,55 @@
 Typedefs</h2></td></tr>
 <tr class="memitem:a3b9ee5953214665e585e5bcaf6b8ea83" id="r_a3b9ee5953214665e585e5bcaf6b8ea83"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a>) (struct <a class="el" href="structmdns__service.html">mdns_service</a> *service, void *txt_userdata)</td></tr>
 <tr class="separator:a3b9ee5953214665e585e5bcaf6b8ea83"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a19f12d7092de6fe90d5843e4ef8d4536" id="r_a19f12d7092de6fe90d5843e4ef8d4536"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a19f12d7092de6fe90d5843e4ef8d4536">mdns_name_result_cb_t</a>) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t result)</td></tr>
-<tr class="separator:a19f12d7092de6fe90d5843e4ef8d4536"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d658e2c5228b224b89488663d2b72f7" id="r_a6d658e2c5228b224b89488663d2b72f7"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a6d658e2c5228b224b89488663d2b72f7">mdns_name_result_cb_t</a>) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t result, s8_t slot)</td></tr>
+<tr class="separator:a6d658e2c5228b224b89488663d2b72f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
+<tr class="memitem:gaee5b489b77b74511517d41f7609ccd49" id="r_gaee5b489b77b74511517d41f7609ccd49"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gaee5b489b77b74511517d41f7609ccd49">mdns_get_service_txt_userdata</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t slot)</td></tr>
+<tr class="separator:gaee5b489b77b74511517d41f7609ccd49"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga5fa15978a398dae1a8d7620ae169bdd3" id="r_ga5fa15978a398dae1a8d7620ae169bdd3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3">mdns_resp_init</a> (void)</td></tr>
 <tr class="separator:ga5fa15978a398dae1a8d7620ae169bdd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a01f8850b9c2d2cd40ed77a1438c85bf1" id="r_a01f8850b9c2d2cd40ed77a1438c85bf1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a01f8850b9c2d2cd40ed77a1438c85bf1">mdns_resp_register_name_result_cb</a> (<a class="el" href="#a19f12d7092de6fe90d5843e4ef8d4536">mdns_name_result_cb_t</a> cb)</td></tr>
+<tr class="memitem:a01f8850b9c2d2cd40ed77a1438c85bf1" id="r_a01f8850b9c2d2cd40ed77a1438c85bf1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a01f8850b9c2d2cd40ed77a1438c85bf1">mdns_resp_register_name_result_cb</a> (<a class="el" href="#a6d658e2c5228b224b89488663d2b72f7">mdns_name_result_cb_t</a> cb)</td></tr>
 <tr class="separator:a01f8850b9c2d2cd40ed77a1438c85bf1"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaa619ac8f46a4b4021195720f0355cbeb" id="r_gaa619ac8f46a4b4021195720f0355cbeb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb">mdns_resp_add_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *hostname, u32_t dns_ttl)</td></tr>
-<tr class="separator:gaa619ac8f46a4b4021195720f0355cbeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga67f842c27f37c03b48d10e4ce6856b8e" id="r_ga67f842c27f37c03b48d10e4ce6856b8e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e">mdns_resp_add_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *hostname)</td></tr>
+<tr class="separator:ga67f842c27f37c03b48d10e4ce6856b8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaa8144e3c77a92c4043e6214ff6b6010c" id="r_gaa8144e3c77a92c4043e6214ff6b6010c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c">mdns_resp_remove_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:gaa8144e3c77a92c4043e6214ff6b6010c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga7b1473e595eb0c185bab293f3ec2e50e" id="r_ga7b1473e595eb0c185bab293f3ec2e50e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e">mdns_resp_rename_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *hostname)</td></tr>
 <tr class="separator:ga7b1473e595eb0c185bab293f3ec2e50e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga824e992e94be216c8e059f48f49a59ce" id="r_ga824e992e94be216c8e059f48f49a59ce"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga824e992e94be216c8e059f48f49a59ce">mdns_resp_add_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, <a class="el" href="#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a> txt_fn, void *txt_userdata)</td></tr>
-<tr class="separator:ga824e992e94be216c8e059f48f49a59ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga3df2ae751cdfdffb0a567390940eb8ad" id="r_ga3df2ae751cdfdffb0a567390940eb8ad"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad">mdns_resp_del_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t slot)</td></tr>
-<tr class="separator:ga3df2ae751cdfdffb0a567390940eb8ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaf273897059f1bbddc74cfcb820777dd9" id="r_gaf273897059f1bbddc74cfcb820777dd9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9">mdns_resp_rename_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, s8_t slot, const char *name)</td></tr>
-<tr class="separator:gaf273897059f1bbddc74cfcb820777dd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga09b7a259f497648d8ef734b080f997c1" id="r_ga09b7a259f497648d8ef734b080f997c1"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga09b7a259f497648d8ef734b080f997c1">mdns_resp_netif_active</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ga09b7a259f497648d8ef734b080f997c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2130111662d044b32970ce9c763bd409" id="r_ga2130111662d044b32970ce9c763bd409"><td class="memItemLeft" align="right" valign="top">s8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga2130111662d044b32970ce9c763bd409">mdns_resp_add_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, <a class="el" href="#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a> txt_fn, void *txt_userdata)</td></tr>
+<tr class="separator:ga2130111662d044b32970ce9c763bd409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga55f3fd46cfe1375452210688fc05bf9a" id="r_ga55f3fd46cfe1375452210688fc05bf9a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a">mdns_resp_del_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t slot)</td></tr>
+<tr class="separator:ga55f3fd46cfe1375452210688fc05bf9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab1e989a4c7305d754377c76052474beb" id="r_gab1e989a4c7305d754377c76052474beb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gab1e989a4c7305d754377c76052474beb">mdns_resp_rename_service</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t slot, const char *name)</td></tr>
+<tr class="separator:gab1e989a4c7305d754377c76052474beb"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga01c85202f4b85edc8b571f2f419db576" id="r_ga01c85202f4b85edc8b571f2f419db576"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga01c85202f4b85edc8b571f2f419db576">mdns_resp_add_service_txtitem</a> (struct <a class="el" href="structmdns__service.html">mdns_service</a> *service, const char *txt, u8_t txt_len)</td></tr>
 <tr class="separator:ga01c85202f4b85edc8b571f2f419db576"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga367ac89ddae6cbec3e0a9c55e9c46737" id="r_ga367ac89ddae6cbec3e0a9c55e9c46737"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737">mdns_resp_restart_delay</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, uint32_t delay)</td></tr>
+<tr class="separator:ga367ac89ddae6cbec3e0a9c55e9c46737"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga93eccdc0d9afff0f24160d31c70e2c9a" id="r_ga93eccdc0d9afff0f24160d31c70e2c9a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a">mdns_resp_restart</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga93eccdc0d9afff0f24160d31c70e2c9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga0f462fb91a9d0323bb4636bd725f0e85" id="r_ga0f462fb91a9d0323bb4636bd725f0e85"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85">mdns_resp_announce</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:ga0f462fb91a9d0323bb4636bd725f0e85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gac388b2eab379a23dd1f46f2ac8d63725" id="r_gac388b2eab379a23dd1f46f2ac8d63725"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725">mdns_search_service</a> (const char *name, const char *service, enum mdns_sd_proto proto, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, search_result_fn_t result_fn, void *arg, u8_t *request_id)</td></tr>
+<tr class="separator:gac388b2eab379a23dd1f46f2ac8d63725"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0c5617b4d021353bbd0fb24ddcb8b3ac" id="r_ga0c5617b4d021353bbd0fb24ddcb8b3ac"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac">mdns_search_stop</a> (u8_t request_id)</td></tr>
+<tr class="separator:ga0c5617b4d021353bbd0fb24ddcb8b3ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>MDNS responder </p>
 </div><h2 class="groupheader">Typedef Documentation</h2>
-<a id="a19f12d7092de6fe90d5843e4ef8d4536" name="a19f12d7092de6fe90d5843e4ef8d4536"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a19f12d7092de6fe90d5843e4ef8d4536">&#9670;&#160;</a></span>mdns_name_result_cb_t</h2>
+<a id="a6d658e2c5228b224b89488663d2b72f7" name="a6d658e2c5228b224b89488663d2b72f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d658e2c5228b224b89488663d2b72f7">&#9670;&#160;</a></span>mdns_name_result_cb_t</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef void(* mdns_name_result_cb_t) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t result)</td>
+          <td class="memname">typedef void(* mdns_name_result_cb_t) (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u8_t result, s8_t slot)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -187,7 +203,7 @@
         <tr>
           <td class="memname">void mdns_resp_register_name_result_cb </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="#a19f12d7092de6fe90d5843e4ef8d4536">mdns_name_result_cb_t</a></td>          <td class="paramname"><span class="paramname"><em>cb</em></span></td><td>)</td>
+          <td class="paramtype"><a class="el" href="#a6d658e2c5228b224b89488663d2b72f7">mdns_name_result_cb_t</a></td>          <td class="paramname"><span class="paramname"><em>cb</em></span></td><td>)</td>
           <td></td>
         </tr>
       </table>
diff --git a/doc/doxygen/output/html/mdns_8h.js b/doc/doxygen/output/html/mdns_8h.js
index 55f98e0..0bd5318 100644
--- a/doc/doxygen/output/html/mdns_8h.js
+++ b/doc/doxygen/output/html/mdns_8h.js
@@ -1,17 +1,23 @@
 var mdns_8h =
 [
+    [ "mdns_rr_info", "structmdns__rr__info.html", null ],
     [ "mdns_resp_netif_settings_changed", "group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec", null ],
-    [ "mdns_name_result_cb_t", "mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536", null ],
+    [ "mdns_name_result_cb_t", "mdns_8h.html#a6d658e2c5228b224b89488663d2b72f7", null ],
     [ "service_get_txt_fn_t", "mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83", null ],
-    [ "mdns_resp_add_netif", "group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb", null ],
-    [ "mdns_resp_add_service", "group__mdns.html#ga824e992e94be216c8e059f48f49a59ce", null ],
+    [ "mdns_get_service_txt_userdata", "group__mdns.html#gaee5b489b77b74511517d41f7609ccd49", null ],
+    [ "mdns_resp_add_netif", "group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e", null ],
+    [ "mdns_resp_add_service", "group__mdns.html#ga2130111662d044b32970ce9c763bd409", null ],
     [ "mdns_resp_add_service_txtitem", "group__mdns.html#ga01c85202f4b85edc8b571f2f419db576", null ],
     [ "mdns_resp_announce", "group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85", null ],
-    [ "mdns_resp_del_service", "group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad", null ],
+    [ "mdns_resp_del_service", "group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a", null ],
     [ "mdns_resp_init", "group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3", null ],
+    [ "mdns_resp_netif_active", "group__mdns.html#ga09b7a259f497648d8ef734b080f997c1", null ],
     [ "mdns_resp_register_name_result_cb", "mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1", null ],
     [ "mdns_resp_remove_netif", "group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c", null ],
     [ "mdns_resp_rename_netif", "group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e", null ],
-    [ "mdns_resp_rename_service", "group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9", null ],
-    [ "mdns_resp_restart", "group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a", null ]
+    [ "mdns_resp_rename_service", "group__mdns.html#gab1e989a4c7305d754377c76052474beb", null ],
+    [ "mdns_resp_restart", "group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a", null ],
+    [ "mdns_resp_restart_delay", "group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737", null ],
+    [ "mdns_search_service", "group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725", null ],
+    [ "mdns_search_stop", "group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mdns__domain_8c.html b/doc/doxygen/output/html/mdns__domain_8c.html
new file mode 100644
index 0000000..2fe104c
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__domain_8c.html
@@ -0,0 +1,581 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/mdns/mdns_domain.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('mdns__domain_8c.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle"><div class="title">mdns_domain.c File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="mdns_8h.html">lwip/apps/mdns.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mdns__domain_8h.html">lwip/apps/mdns_domain.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mdns__priv_8h.html">lwip/apps/mdns_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2dns_8h.html">lwip/prot/dns.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="prot_2ip6_8h.html">lwip/prot/ip6.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a17db69fa887515374452b945e959bbf9" id="r_a17db69fa887515374452b945e959bbf9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a17db69fa887515374452b945e959bbf9">mdns_domain_add_label</a> (struct mdns_domain *domain, const char *label, u8_t len)</td></tr>
+<tr class="separator:a17db69fa887515374452b945e959bbf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a642449cbf0074f1a2504e72158e75859" id="r_a642449cbf0074f1a2504e72158e75859"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a642449cbf0074f1a2504e72158e75859">mdns_domain_add_domain</a> (struct mdns_domain *domain, struct mdns_domain *source)</td></tr>
+<tr class="separator:a642449cbf0074f1a2504e72158e75859"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af228d1cf8d779c714a016702db095db6" id="r_af228d1cf8d779c714a016702db095db6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af228d1cf8d779c714a016702db095db6">mdns_domain_add_string</a> (struct mdns_domain *domain, const char *source)</td></tr>
+<tr class="separator:af228d1cf8d779c714a016702db095db6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5f49d9356a76879e0e6a14eb0643b23" id="r_ab5f49d9356a76879e0e6a14eb0643b23"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab5f49d9356a76879e0e6a14eb0643b23">mdns_readname</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, struct mdns_domain *domain)</td></tr>
+<tr class="separator:ab5f49d9356a76879e0e6a14eb0643b23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0aff096695eebacb2668d2762722860c" id="r_a0aff096695eebacb2668d2762722860c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a0aff096695eebacb2668d2762722860c">mdns_domain_debug_print</a> (struct mdns_domain *domain)</td></tr>
+<tr class="separator:a0aff096695eebacb2668d2762722860c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52d8f70432ae998814f16b18431213cd" id="r_a52d8f70432ae998814f16b18431213cd"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a52d8f70432ae998814f16b18431213cd">mdns_domain_eq</a> (struct mdns_domain *a, struct mdns_domain *b)</td></tr>
+<tr class="separator:a52d8f70432ae998814f16b18431213cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2d8951e2435f93fdc889f6a71e0c8a6" id="r_ac2d8951e2435f93fdc889f6a71e0c8a6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac2d8951e2435f93fdc889f6a71e0c8a6">mdns_build_reverse_v4_domain</a> (struct mdns_domain *domain, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
+<tr class="separator:ac2d8951e2435f93fdc889f6a71e0c8a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cde39039e0e1e21b4851d840d733926" id="r_a9cde39039e0e1e21b4851d840d733926"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9cde39039e0e1e21b4851d840d733926">mdns_build_reverse_v6_domain</a> (struct mdns_domain *domain, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr)</td></tr>
+<tr class="separator:a9cde39039e0e1e21b4851d840d733926"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a191d9b70a66083f40aaa022c2ed88b12" id="r_a191d9b70a66083f40aaa022c2ed88b12"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a191d9b70a66083f40aaa022c2ed88b12">mdns_build_host_domain</a> (struct mdns_domain *domain, struct <a class="el" href="structmdns__host.html">mdns_host</a> *mdns)</td></tr>
+<tr class="separator:a191d9b70a66083f40aaa022c2ed88b12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7485d75976b73354668a5a54bc8658ed" id="r_a7485d75976b73354668a5a54bc8658ed"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7485d75976b73354668a5a54bc8658ed">mdns_build_dnssd_domain</a> (struct mdns_domain *domain)</td></tr>
+<tr class="separator:a7485d75976b73354668a5a54bc8658ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29ddb0a6ba0edcf34104ec1f6322968b" id="r_a29ddb0a6ba0edcf34104ec1f6322968b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a29ddb0a6ba0edcf34104ec1f6322968b">mdns_build_service_domain</a> (struct mdns_domain *domain, struct <a class="el" href="structmdns__service.html">mdns_service</a> *service, int include_name)</td></tr>
+<tr class="separator:a29ddb0a6ba0edcf34104ec1f6322968b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7221cb1a83ed6dcfb3a2b1365154b43d" id="r_a7221cb1a83ed6dcfb3a2b1365154b43d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7221cb1a83ed6dcfb3a2b1365154b43d">mdns_build_request_domain</a> (struct mdns_domain *domain, struct <a class="el" href="structmdns__request.html">mdns_request</a> *request, int include_name)</td></tr>
+<tr class="separator:a7221cb1a83ed6dcfb3a2b1365154b43d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab72e48cf076afd1e3a08030d1d0bff9e" id="r_ab72e48cf076afd1e3a08030d1d0bff9e"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_compress_domain</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *<a class="el" href="structpbuf.html">pbuf</a>, u16_t *offset, struct mdns_domain *domain)</td></tr>
+<tr class="separator:ab72e48cf076afd1e3a08030d1d0bff9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a92de54d2f384a4e4ffa85e529cc05411" id="r_a92de54d2f384a4e4ffa85e529cc05411"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a92de54d2f384a4e4ffa85e529cc05411">mdns_write_domain</a> (struct <a class="el" href="structmdns__outpacket.html">mdns_outpacket</a> *outpkt, struct mdns_domain *domain)</td></tr>
+<tr class="separator:a92de54d2f384a4e4ffa85e529cc05411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>MDNS responder implementation - domain related functionalities </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a7485d75976b73354668a5a54bc8658ed" name="a7485d75976b73354668a5a54bc8658ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7485d75976b73354668a5a54bc8658ed">&#9670;&#160;</a></span>mdns_build_dnssd_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_dnssd_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build the lookup-all-services special DNS-SD domain name </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain _services._dns-sd._udp.local. was written, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a191d9b70a66083f40aaa022c2ed88b12" name="a191d9b70a66083f40aaa022c2ed88b12"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a191d9b70a66083f40aaa022c2ed88b12">&#9670;&#160;</a></span>mdns_build_host_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_host_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__host.html">mdns_host</a> *</td>          <td class="paramname"><span class="paramname"><em>mdns</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build the &lt;hostname&gt;.local. domain name </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">mdns</td><td>TMDNS netif descriptor. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain &lt;hostname&gt;.local. was written, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a7221cb1a83ed6dcfb3a2b1365154b43d" name="a7221cb1a83ed6dcfb3a2b1365154b43d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7221cb1a83ed6dcfb3a2b1365154b43d">&#9670;&#160;</a></span>mdns_build_request_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_request_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__request.html">mdns_request</a> *</td>          <td class="paramname"><span class="paramname"><em>request</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int</td>          <td class="paramname"><span class="paramname"><em>include_name</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build domain name for a request </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">request</td><td>The request struct, containing service name, type and protocol </td></tr>
+    <tr><td class="paramname">include_name</td><td>Whether to include the service name in the domain </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain was written. If service name is included, &lt;name&gt;.&lt;type&gt;.&lt;proto&gt;.local. will be written, otherwise &lt;type&gt;.&lt;proto&gt;.local. An err_t is returned on error. </dd></dl>
+
+</div>
+</div>
+<a id="ac2d8951e2435f93fdc889f6a71e0c8a6" name="ac2d8951e2435f93fdc889f6a71e0c8a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2d8951e2435f93fdc889f6a71e0c8a6">&#9670;&#160;</a></span>mdns_build_reverse_v4_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_reverse_v4_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>addr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build domain for reverse lookup of IPv4 address like 12.0.168.192.in-addr.arpa. for 192.168.0.12 </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">addr</td><td>Pointer to an IPv4 address to encode </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain was written, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a9cde39039e0e1e21b4851d840d733926" name="a9cde39039e0e1e21b4851d840d733926"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9cde39039e0e1e21b4851d840d733926">&#9670;&#160;</a></span>mdns_build_reverse_v6_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_reverse_v6_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>addr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build domain for reverse lookup of IP address like b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. for 2001:db8::567:89ab </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">addr</td><td>Pointer to an IPv6 address to encode </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain was written, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a29ddb0a6ba0edcf34104ec1f6322968b" name="a29ddb0a6ba0edcf34104ec1f6322968b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a29ddb0a6ba0edcf34104ec1f6322968b">&#9670;&#160;</a></span>mdns_build_service_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_service_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__service.html">mdns_service</a> *</td>          <td class="paramname"><span class="paramname"><em>service</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int</td>          <td class="paramname"><span class="paramname"><em>include_name</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build domain name for a service </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">service</td><td>The service struct, containing service name, type and protocol </td></tr>
+    <tr><td class="paramname">include_name</td><td>Whether to include the service name in the domain </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain was written. If service name is included, &lt;name&gt;.&lt;type&gt;.&lt;proto&gt;.local. will be written, otherwise &lt;type&gt;.&lt;proto&gt;.local. An err_t is returned on error. </dd></dl>
+
+</div>
+</div>
+<a id="ab72e48cf076afd1e3a08030d1d0bff9e" name="ab72e48cf076afd1e3a08030d1d0bff9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab72e48cf076afd1e3a08030d1d0bff9e">&#9670;&#160;</a></span>mdns_compress_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_compress_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *</td>          <td class="paramname"><span class="paramname"><em>pbuf</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *</td>          <td class="paramname"><span class="paramname"><em>offset</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return bytes needed to write before jump for best result of compressing supplied domain against domain in outpacket starting at specified offset. If a match is found, offset is updated to where to jump to </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf</td><td>Pointer to pbuf with the partially constructed DNS packet </td></tr>
+    <tr><td class="paramname">offset</td><td>Start position of a domain written earlier. If this location is suitable for compression, the pointer is updated to where in the domain to jump to. </td></tr>
+    <tr><td class="paramname">domain</td><td>The domain to write </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Number of bytes to write of the new domain before writing a jump to the offset. If compression can not be done against this previous domain name, the full new domain length is returned. </dd></dl>
+
+</div>
+</div>
+<a id="a642449cbf0074f1a2504e72158e75859" name="a642449cbf0074f1a2504e72158e75859"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a642449cbf0074f1a2504e72158e75859">&#9670;&#160;</a></span>mdns_domain_add_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_domain_add_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>source</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a partial domain to a domain </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>The domain to add a label to </td></tr>
+    <tr><td class="paramname">source</td><td>The domain to add, like &lt;\x09_services\007_dns-sd\000&gt; </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise if label too long </dd></dl>
+
+</div>
+</div>
+<a id="a17db69fa887515374452b945e959bbf9" name="a17db69fa887515374452b945e959bbf9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17db69fa887515374452b945e959bbf9">&#9670;&#160;</a></span>mdns_domain_add_label()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_domain_add_label </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>label</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>len</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a label part to a domain </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>The domain to add a label to </td></tr>
+    <tr><td class="paramname">label</td><td>The label to add, like &lt;hostname&gt;, 'local', 'com' or '' </td></tr>
+    <tr><td class="paramname">len</td><td>The length of the label </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise if label too long </dd></dl>
+
+</div>
+</div>
+<a id="af228d1cf8d779c714a016702db095db6" name="af228d1cf8d779c714a016702db095db6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af228d1cf8d779c714a016702db095db6">&#9670;&#160;</a></span>mdns_domain_add_string()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_domain_add_string </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>source</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a string domain to a domain </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>The domain to add a label to </td></tr>
+    <tr><td class="paramname">source</td><td>The string to add, like &lt;_services._dns-sd&gt; </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise if label too long </dd></dl>
+
+</div>
+</div>
+<a id="a0aff096695eebacb2668d2762722860c" name="a0aff096695eebacb2668d2762722860c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0aff096695eebacb2668d2762722860c">&#9670;&#160;</a></span>mdns_domain_debug_print()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_domain_debug_print </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Print domain name to debug output </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>The domain name </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a52d8f70432ae998814f16b18431213cd" name="a52d8f70432ae998814f16b18431213cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a52d8f70432ae998814f16b18431213cd">&#9670;&#160;</a></span>mdns_domain_eq()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int mdns_domain_eq </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>b</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return 1 if contents of domains match (case-insensitive) </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">a</td><td>Domain name to compare 1 </td></tr>
+    <tr><td class="paramname">b</td><td>Domain name to compare 2 </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if domains are equal ignoring case, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ab5f49d9356a76879e0e6a14eb0643b23" name="ab5f49d9356a76879e0e6a14eb0643b23"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5f49d9356a76879e0e6a14eb0643b23">&#9670;&#160;</a></span>mdns_readname()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_readname </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *</td>          <td class="paramname"><span class="paramname"><em>p</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t</td>          <td class="paramname"><span class="paramname"><em>offset</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Read possibly compressed domain name from packet buffer </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>The packet </td></tr>
+    <tr><td class="paramname">offset</td><td>start position of domain name in packet </td></tr>
+    <tr><td class="paramname">domain</td><td>The domain name destination </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The new offset after the domain, or MDNS_READNAME_ERROR if reading failed </dd></dl>
+
+</div>
+</div>
+<a id="a92de54d2f384a4e4ffa85e529cc05411" name="a92de54d2f384a4e4ffa85e529cc05411"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a92de54d2f384a4e4ffa85e529cc05411">&#9670;&#160;</a></span>mdns_write_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_write_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structmdns__outpacket.html">mdns_outpacket</a> *</td>          <td class="paramname"><span class="paramname"><em>outpkt</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Write domain to outpacket. Compression will be attempted, unless domain-&gt;skip_compression is set. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">outpkt</td><td>The outpacket to write to </td></tr>
+    <tr><td class="paramname">domain</td><td>The domain name to write </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_febe3a637907666e8b25366ae60efc0b.html">mdns</a></li><li class="navelem"><a class="el" href="mdns__domain_8c.html">mdns_domain.c</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mdns__domain_8c.js b/doc/doxygen/output/html/mdns__domain_8c.js
new file mode 100644
index 0000000..4270745
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__domain_8c.js
@@ -0,0 +1,17 @@
+var mdns__domain_8c =
+[
+    [ "mdns_build_dnssd_domain", "mdns__domain_8c.html#a7485d75976b73354668a5a54bc8658ed", null ],
+    [ "mdns_build_host_domain", "mdns__domain_8c.html#a191d9b70a66083f40aaa022c2ed88b12", null ],
+    [ "mdns_build_request_domain", "mdns__domain_8c.html#a7221cb1a83ed6dcfb3a2b1365154b43d", null ],
+    [ "mdns_build_reverse_v4_domain", "mdns__domain_8c.html#ac2d8951e2435f93fdc889f6a71e0c8a6", null ],
+    [ "mdns_build_reverse_v6_domain", "mdns__domain_8c.html#a9cde39039e0e1e21b4851d840d733926", null ],
+    [ "mdns_build_service_domain", "mdns__domain_8c.html#a29ddb0a6ba0edcf34104ec1f6322968b", null ],
+    [ "mdns_compress_domain", "mdns__domain_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e", null ],
+    [ "mdns_domain_add_domain", "mdns__domain_8c.html#a642449cbf0074f1a2504e72158e75859", null ],
+    [ "mdns_domain_add_label", "mdns__domain_8c.html#a17db69fa887515374452b945e959bbf9", null ],
+    [ "mdns_domain_add_string", "mdns__domain_8c.html#af228d1cf8d779c714a016702db095db6", null ],
+    [ "mdns_domain_debug_print", "mdns__domain_8c.html#a0aff096695eebacb2668d2762722860c", null ],
+    [ "mdns_domain_eq", "mdns__domain_8c.html#a52d8f70432ae998814f16b18431213cd", null ],
+    [ "mdns_readname", "mdns__domain_8c.html#ab5f49d9356a76879e0e6a14eb0643b23", null ],
+    [ "mdns_write_domain", "mdns__domain_8c.html#a92de54d2f384a4e4ffa85e529cc05411", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mdns__domain_8h.html b/doc/doxygen/output/html/mdns__domain_8h.html
new file mode 100644
index 0000000..326a2be
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__domain_8h.html
@@ -0,0 +1,577 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/mdns_domain.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('mdns__domain_8h.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle"><div class="title">mdns_domain.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="mdns__opts_8h.html">lwip/apps/mdns_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mdns__priv_8h.html">lwip/apps/mdns_priv.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a17db69fa887515374452b945e959bbf9" id="r_a17db69fa887515374452b945e959bbf9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a17db69fa887515374452b945e959bbf9">mdns_domain_add_label</a> (struct mdns_domain *domain, const char *label, u8_t len)</td></tr>
+<tr class="separator:a17db69fa887515374452b945e959bbf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a642449cbf0074f1a2504e72158e75859" id="r_a642449cbf0074f1a2504e72158e75859"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a642449cbf0074f1a2504e72158e75859">mdns_domain_add_domain</a> (struct mdns_domain *domain, struct mdns_domain *source)</td></tr>
+<tr class="separator:a642449cbf0074f1a2504e72158e75859"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af228d1cf8d779c714a016702db095db6" id="r_af228d1cf8d779c714a016702db095db6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af228d1cf8d779c714a016702db095db6">mdns_domain_add_string</a> (struct mdns_domain *domain, const char *source)</td></tr>
+<tr class="separator:af228d1cf8d779c714a016702db095db6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5f49d9356a76879e0e6a14eb0643b23" id="r_ab5f49d9356a76879e0e6a14eb0643b23"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab5f49d9356a76879e0e6a14eb0643b23">mdns_readname</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, struct mdns_domain *domain)</td></tr>
+<tr class="separator:ab5f49d9356a76879e0e6a14eb0643b23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0aff096695eebacb2668d2762722860c" id="r_a0aff096695eebacb2668d2762722860c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a0aff096695eebacb2668d2762722860c">mdns_domain_debug_print</a> (struct mdns_domain *domain)</td></tr>
+<tr class="separator:a0aff096695eebacb2668d2762722860c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52d8f70432ae998814f16b18431213cd" id="r_a52d8f70432ae998814f16b18431213cd"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a52d8f70432ae998814f16b18431213cd">mdns_domain_eq</a> (struct mdns_domain *a, struct mdns_domain *b)</td></tr>
+<tr class="separator:a52d8f70432ae998814f16b18431213cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2d8951e2435f93fdc889f6a71e0c8a6" id="r_ac2d8951e2435f93fdc889f6a71e0c8a6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac2d8951e2435f93fdc889f6a71e0c8a6">mdns_build_reverse_v4_domain</a> (struct mdns_domain *domain, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *addr)</td></tr>
+<tr class="separator:ac2d8951e2435f93fdc889f6a71e0c8a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cde39039e0e1e21b4851d840d733926" id="r_a9cde39039e0e1e21b4851d840d733926"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9cde39039e0e1e21b4851d840d733926">mdns_build_reverse_v6_domain</a> (struct mdns_domain *domain, const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *addr)</td></tr>
+<tr class="separator:a9cde39039e0e1e21b4851d840d733926"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a191d9b70a66083f40aaa022c2ed88b12" id="r_a191d9b70a66083f40aaa022c2ed88b12"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a191d9b70a66083f40aaa022c2ed88b12">mdns_build_host_domain</a> (struct mdns_domain *domain, struct <a class="el" href="structmdns__host.html">mdns_host</a> *mdns)</td></tr>
+<tr class="separator:a191d9b70a66083f40aaa022c2ed88b12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7485d75976b73354668a5a54bc8658ed" id="r_a7485d75976b73354668a5a54bc8658ed"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7485d75976b73354668a5a54bc8658ed">mdns_build_dnssd_domain</a> (struct mdns_domain *domain)</td></tr>
+<tr class="separator:a7485d75976b73354668a5a54bc8658ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29ddb0a6ba0edcf34104ec1f6322968b" id="r_a29ddb0a6ba0edcf34104ec1f6322968b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a29ddb0a6ba0edcf34104ec1f6322968b">mdns_build_service_domain</a> (struct mdns_domain *domain, struct <a class="el" href="structmdns__service.html">mdns_service</a> *service, int include_name)</td></tr>
+<tr class="separator:a29ddb0a6ba0edcf34104ec1f6322968b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7221cb1a83ed6dcfb3a2b1365154b43d" id="r_a7221cb1a83ed6dcfb3a2b1365154b43d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7221cb1a83ed6dcfb3a2b1365154b43d">mdns_build_request_domain</a> (struct mdns_domain *domain, struct <a class="el" href="structmdns__request.html">mdns_request</a> *request, int include_name)</td></tr>
+<tr class="separator:a7221cb1a83ed6dcfb3a2b1365154b43d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab72e48cf076afd1e3a08030d1d0bff9e" id="r_ab72e48cf076afd1e3a08030d1d0bff9e"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_compress_domain</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *<a class="el" href="structpbuf.html">pbuf</a>, u16_t *offset, struct mdns_domain *domain)</td></tr>
+<tr class="separator:ab72e48cf076afd1e3a08030d1d0bff9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a92de54d2f384a4e4ffa85e529cc05411" id="r_a92de54d2f384a4e4ffa85e529cc05411"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a92de54d2f384a4e4ffa85e529cc05411">mdns_write_domain</a> (struct <a class="el" href="structmdns__outpacket.html">mdns_outpacket</a> *outpkt, struct mdns_domain *domain)</td></tr>
+<tr class="separator:a92de54d2f384a4e4ffa85e529cc05411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>MDNS responder - domain related functionalities </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a7485d75976b73354668a5a54bc8658ed" name="a7485d75976b73354668a5a54bc8658ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7485d75976b73354668a5a54bc8658ed">&#9670;&#160;</a></span>mdns_build_dnssd_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_dnssd_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build the lookup-all-services special DNS-SD domain name </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain _services._dns-sd._udp.local. was written, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a191d9b70a66083f40aaa022c2ed88b12" name="a191d9b70a66083f40aaa022c2ed88b12"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a191d9b70a66083f40aaa022c2ed88b12">&#9670;&#160;</a></span>mdns_build_host_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_host_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__host.html">mdns_host</a> *</td>          <td class="paramname"><span class="paramname"><em>mdns</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build the &lt;hostname&gt;.local. domain name </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">mdns</td><td>TMDNS netif descriptor. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain &lt;hostname&gt;.local. was written, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a7221cb1a83ed6dcfb3a2b1365154b43d" name="a7221cb1a83ed6dcfb3a2b1365154b43d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7221cb1a83ed6dcfb3a2b1365154b43d">&#9670;&#160;</a></span>mdns_build_request_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_request_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__request.html">mdns_request</a> *</td>          <td class="paramname"><span class="paramname"><em>request</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int</td>          <td class="paramname"><span class="paramname"><em>include_name</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build domain name for a request </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">request</td><td>The request struct, containing service name, type and protocol </td></tr>
+    <tr><td class="paramname">include_name</td><td>Whether to include the service name in the domain </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain was written. If service name is included, &lt;name&gt;.&lt;type&gt;.&lt;proto&gt;.local. will be written, otherwise &lt;type&gt;.&lt;proto&gt;.local. An err_t is returned on error. </dd></dl>
+
+</div>
+</div>
+<a id="ac2d8951e2435f93fdc889f6a71e0c8a6" name="ac2d8951e2435f93fdc889f6a71e0c8a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2d8951e2435f93fdc889f6a71e0c8a6">&#9670;&#160;</a></span>mdns_build_reverse_v4_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_reverse_v4_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>addr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build domain for reverse lookup of IPv4 address like 12.0.168.192.in-addr.arpa. for 192.168.0.12 </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">addr</td><td>Pointer to an IPv4 address to encode </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain was written, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a9cde39039e0e1e21b4851d840d733926" name="a9cde39039e0e1e21b4851d840d733926"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9cde39039e0e1e21b4851d840d733926">&#9670;&#160;</a></span>mdns_build_reverse_v6_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_reverse_v6_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762">ip6_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>addr</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build domain for reverse lookup of IP address like b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. for 2001:db8::567:89ab </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">addr</td><td>Pointer to an IPv6 address to encode </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain was written, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a29ddb0a6ba0edcf34104ec1f6322968b" name="a29ddb0a6ba0edcf34104ec1f6322968b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a29ddb0a6ba0edcf34104ec1f6322968b">&#9670;&#160;</a></span>mdns_build_service_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_build_service_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__service.html">mdns_service</a> *</td>          <td class="paramname"><span class="paramname"><em>service</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int</td>          <td class="paramname"><span class="paramname"><em>include_name</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Build domain name for a service </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>Where to write the domain name </td></tr>
+    <tr><td class="paramname">service</td><td>The service struct, containing service name, type and protocol </td></tr>
+    <tr><td class="paramname">include_name</td><td>Whether to include the service name in the domain </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if domain was written. If service name is included, &lt;name&gt;.&lt;type&gt;.&lt;proto&gt;.local. will be written, otherwise &lt;type&gt;.&lt;proto&gt;.local. An err_t is returned on error. </dd></dl>
+
+</div>
+</div>
+<a id="ab72e48cf076afd1e3a08030d1d0bff9e" name="ab72e48cf076afd1e3a08030d1d0bff9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab72e48cf076afd1e3a08030d1d0bff9e">&#9670;&#160;</a></span>mdns_compress_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_compress_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *</td>          <td class="paramname"><span class="paramname"><em>pbuf</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t *</td>          <td class="paramname"><span class="paramname"><em>offset</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return bytes needed to write before jump for best result of compressing supplied domain against domain in outpacket starting at specified offset. If a match is found, offset is updated to where to jump to </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pbuf</td><td>Pointer to pbuf with the partially constructed DNS packet </td></tr>
+    <tr><td class="paramname">offset</td><td>Start position of a domain written earlier. If this location is suitable for compression, the pointer is updated to where in the domain to jump to. </td></tr>
+    <tr><td class="paramname">domain</td><td>The domain to write </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Number of bytes to write of the new domain before writing a jump to the offset. If compression can not be done against this previous domain name, the full new domain length is returned. </dd></dl>
+
+</div>
+</div>
+<a id="a642449cbf0074f1a2504e72158e75859" name="a642449cbf0074f1a2504e72158e75859"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a642449cbf0074f1a2504e72158e75859">&#9670;&#160;</a></span>mdns_domain_add_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_domain_add_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>source</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a partial domain to a domain </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>The domain to add a label to </td></tr>
+    <tr><td class="paramname">source</td><td>The domain to add, like &lt;\x09_services\007_dns-sd\000&gt; </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise if label too long </dd></dl>
+
+</div>
+</div>
+<a id="a17db69fa887515374452b945e959bbf9" name="a17db69fa887515374452b945e959bbf9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17db69fa887515374452b945e959bbf9">&#9670;&#160;</a></span>mdns_domain_add_label()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_domain_add_label </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>label</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>len</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a label part to a domain </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>The domain to add a label to </td></tr>
+    <tr><td class="paramname">label</td><td>The label to add, like &lt;hostname&gt;, 'local', 'com' or '' </td></tr>
+    <tr><td class="paramname">len</td><td>The length of the label </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise if label too long </dd></dl>
+
+</div>
+</div>
+<a id="af228d1cf8d779c714a016702db095db6" name="af228d1cf8d779c714a016702db095db6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af228d1cf8d779c714a016702db095db6">&#9670;&#160;</a></span>mdns_domain_add_string()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_domain_add_string </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>source</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Add a string domain to a domain </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>The domain to add a label to </td></tr>
+    <tr><td class="paramname">source</td><td>The string to add, like &lt;_services._dns-sd&gt; </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise if label too long </dd></dl>
+
+</div>
+</div>
+<a id="a0aff096695eebacb2668d2762722860c" name="a0aff096695eebacb2668d2762722860c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0aff096695eebacb2668d2762722860c">&#9670;&#160;</a></span>mdns_domain_debug_print()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_domain_debug_print </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Print domain name to debug output </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">domain</td><td>The domain name </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a52d8f70432ae998814f16b18431213cd" name="a52d8f70432ae998814f16b18431213cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a52d8f70432ae998814f16b18431213cd">&#9670;&#160;</a></span>mdns_domain_eq()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int mdns_domain_eq </td>
+          <td>(</td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>b</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Return 1 if contents of domains match (case-insensitive) </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">a</td><td>Domain name to compare 1 </td></tr>
+    <tr><td class="paramname">b</td><td>Domain name to compare 2 </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 if domains are equal ignoring case, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ab5f49d9356a76879e0e6a14eb0643b23" name="ab5f49d9356a76879e0e6a14eb0643b23"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5f49d9356a76879e0e6a14eb0643b23">&#9670;&#160;</a></span>mdns_readname()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_readname </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *</td>          <td class="paramname"><span class="paramname"><em>p</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t</td>          <td class="paramname"><span class="paramname"><em>offset</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Read possibly compressed domain name from packet buffer </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">p</td><td>The packet </td></tr>
+    <tr><td class="paramname">offset</td><td>start position of domain name in packet </td></tr>
+    <tr><td class="paramname">domain</td><td>The domain name destination </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The new offset after the domain, or MDNS_READNAME_ERROR if reading failed </dd></dl>
+
+</div>
+</div>
+<a id="a92de54d2f384a4e4ffa85e529cc05411" name="a92de54d2f384a4e4ffa85e529cc05411"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a92de54d2f384a4e4ffa85e529cc05411">&#9670;&#160;</a></span>mdns_write_domain()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_write_domain </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structmdns__outpacket.html">mdns_outpacket</a> *</td>          <td class="paramname"><span class="paramname"><em>outpkt</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Write domain to outpacket. Compression will be attempted, unless domain-&gt;skip_compression is set. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">outpkt</td><td>The outpacket to write to </td></tr>
+    <tr><td class="paramname">domain</td><td>The domain name to write </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li><li class="navelem"><a class="el" href="dir_4e6b3cf33a61b6caac9c8ac30c866f37.html">lwip</a></li><li class="navelem"><a class="el" href="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="mdns__domain_8h.html">mdns_domain.h</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mdns__domain_8h.js b/doc/doxygen/output/html/mdns__domain_8h.js
new file mode 100644
index 0000000..76e57a7
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__domain_8h.js
@@ -0,0 +1,17 @@
+var mdns__domain_8h =
+[
+    [ "mdns_build_dnssd_domain", "mdns__domain_8h.html#a7485d75976b73354668a5a54bc8658ed", null ],
+    [ "mdns_build_host_domain", "mdns__domain_8h.html#a191d9b70a66083f40aaa022c2ed88b12", null ],
+    [ "mdns_build_request_domain", "mdns__domain_8h.html#a7221cb1a83ed6dcfb3a2b1365154b43d", null ],
+    [ "mdns_build_reverse_v4_domain", "mdns__domain_8h.html#ac2d8951e2435f93fdc889f6a71e0c8a6", null ],
+    [ "mdns_build_reverse_v6_domain", "mdns__domain_8h.html#a9cde39039e0e1e21b4851d840d733926", null ],
+    [ "mdns_build_service_domain", "mdns__domain_8h.html#a29ddb0a6ba0edcf34104ec1f6322968b", null ],
+    [ "mdns_compress_domain", "mdns__domain_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e", null ],
+    [ "mdns_domain_add_domain", "mdns__domain_8h.html#a642449cbf0074f1a2504e72158e75859", null ],
+    [ "mdns_domain_add_label", "mdns__domain_8h.html#a17db69fa887515374452b945e959bbf9", null ],
+    [ "mdns_domain_add_string", "mdns__domain_8h.html#af228d1cf8d779c714a016702db095db6", null ],
+    [ "mdns_domain_debug_print", "mdns__domain_8h.html#a0aff096695eebacb2668d2762722860c", null ],
+    [ "mdns_domain_eq", "mdns__domain_8h.html#a52d8f70432ae998814f16b18431213cd", null ],
+    [ "mdns_readname", "mdns__domain_8h.html#ab5f49d9356a76879e0e6a14eb0643b23", null ],
+    [ "mdns_write_domain", "mdns__domain_8h.html#a92de54d2f384a4e4ffa85e529cc05411", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mdns__opts_8h.html b/doc/doxygen/output/html/mdns__opts_8h.html
index f807df5..beef040 100644
--- a/doc/doxygen/output/html/mdns__opts_8h.html
+++ b/doc/doxygen/output/html/mdns__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -108,8 +108,18 @@
 Macros</h2></td></tr>
 <tr class="memitem:ga82749ee08be21967b6daf577b9710ac6" id="r_ga82749ee08be21967b6daf577b9710ac6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6">MDNS_MAX_SERVICES</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:ga82749ee08be21967b6daf577b9710ac6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7f6853d01ad32eb6ce99ae55307a37d9" id="r_ga7f6853d01ad32eb6ce99ae55307a37d9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns__opts.html#ga7f6853d01ad32eb6ce99ae55307a37d9">MDNS_PROBE_DELAY_MS</a>&#160;&#160;&#160;250</td></tr>
+<tr class="separator:ga7f6853d01ad32eb6ce99ae55307a37d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga827d1d2abd24a26638723cfd0a8b9efd" id="r_ga827d1d2abd24a26638723cfd0a8b9efd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns__opts.html#ga827d1d2abd24a26638723cfd0a8b9efd">MDNS_MAX_STORED_PKTS</a>&#160;&#160;&#160;4</td></tr>
+<tr class="separator:ga827d1d2abd24a26638723cfd0a8b9efd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga0f0adf7b1d742b4ea818c1b7f6b0c547" id="r_ga0f0adf7b1d742b4ea818c1b7f6b0c547"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns__opts.html#ga0f0adf7b1d742b4ea818c1b7f6b0c547">MDNS_OUTPUT_PACKET_SIZE</a>&#160;&#160;&#160;((<a class="el" href="group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6">MDNS_MAX_SERVICES</a> == 1) ? 512 : 1450)</td></tr>
+<tr class="separator:ga0f0adf7b1d742b4ea818c1b7f6b0c547"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga172e579cd09a1db51cf224319c012396" id="r_ga172e579cd09a1db51cf224319c012396"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396">MDNS_RESP_USENETIF_EXTCALLBACK</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e">LWIP_NETIF_EXT_STATUS_CALLBACK</a></td></tr>
 <tr class="separator:ga172e579cd09a1db51cf224319c012396"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaaf489604dcdf94d2adcd723f6c7d7163" id="r_gaaf489604dcdf94d2adcd723f6c7d7163"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns__opts.html#gaaf489604dcdf94d2adcd723f6c7d7163">LWIP_MDNS_SEARCH</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:gaaf489604dcdf94d2adcd723f6c7d7163"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga17a9884af8169cf19d57d8005fc3d95e" id="r_ga17a9884af8169cf19d57d8005fc3d95e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns__opts.html#ga17a9884af8169cf19d57d8005fc3d95e">MDNS_MAX_REQUESTS</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:ga17a9884af8169cf19d57d8005fc3d95e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga53a97502efdcf1214cab4078f93a6dc9" id="r_ga53a97502efdcf1214cab4078f93a6dc9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9">MDNS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
 <tr class="separator:ga53a97502efdcf1214cab4078f93a6dc9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
diff --git a/doc/doxygen/output/html/mdns__opts_8h.js b/doc/doxygen/output/html/mdns__opts_8h.js
index 2205be4..694132b 100644
--- a/doc/doxygen/output/html/mdns__opts_8h.js
+++ b/doc/doxygen/output/html/mdns__opts_8h.js
@@ -1,6 +1,11 @@
 var mdns__opts_8h =
 [
+    [ "LWIP_MDNS_SEARCH", "group__mdns__opts.html#gaaf489604dcdf94d2adcd723f6c7d7163", null ],
     [ "MDNS_DEBUG", "group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9", null ],
+    [ "MDNS_MAX_REQUESTS", "group__mdns__opts.html#ga17a9884af8169cf19d57d8005fc3d95e", null ],
     [ "MDNS_MAX_SERVICES", "group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6", null ],
+    [ "MDNS_MAX_STORED_PKTS", "group__mdns__opts.html#ga827d1d2abd24a26638723cfd0a8b9efd", null ],
+    [ "MDNS_OUTPUT_PACKET_SIZE", "group__mdns__opts.html#ga0f0adf7b1d742b4ea818c1b7f6b0c547", null ],
+    [ "MDNS_PROBE_DELAY_MS", "group__mdns__opts.html#ga7f6853d01ad32eb6ce99ae55307a37d9", null ],
     [ "MDNS_RESP_USENETIF_EXTCALLBACK", "group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mdns__out_8c.html b/doc/doxygen/output/html/mdns__out_8c.html
new file mode 100644
index 0000000..86c645b
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__out_8c.html
@@ -0,0 +1,609 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/apps/mdns/mdns_out.c File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('mdns__out_8c.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle"><div class="title">mdns_out.c File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="mdns__out_8h.html">lwip/apps/mdns_out.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mdns__priv_8h.html">lwip/apps/mdns_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mdns__domain_8h.html">lwip/apps/mdns_domain.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="prot_2dns_8h.html">lwip/prot/dns.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="iana_8h.html">lwip/prot/iana.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
+<code>#include &lt;string.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="prot_2ip6_8h.html">lwip/prot/ip6.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab8a8e5d5ba8cfbb18e7ff2588792ce5f" id="r_ab8a8e5d5ba8cfbb18e7ff2588792ce5f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab8a8e5d5ba8cfbb18e7ff2588792ce5f">mdns_prepare_txtdata</a> (struct <a class="el" href="structmdns__service.html">mdns_service</a> *service)</td></tr>
+<tr class="separator:ab8a8e5d5ba8cfbb18e7ff2588792ce5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a051eb81d6bd37365973d1215af23ba" id="r_a5a051eb81d6bd37365973d1215af23ba"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5a051eb81d6bd37365973d1215af23ba">mdns_create_outpacket</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> *msg, struct <a class="el" href="structmdns__outpacket.html">mdns_outpacket</a> *outpkt)</td></tr>
+<tr class="separator:a5a051eb81d6bd37365973d1215af23ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8c9d2bd89d6ca7e8668ba708925d2e8" id="r_ae8c9d2bd89d6ca7e8668ba708925d2e8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ae8c9d2bd89d6ca7e8668ba708925d2e8">mdns_send_outpacket</a> (struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> *msg, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ae8c9d2bd89d6ca7e8668ba708925d2e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b637b6f41976f35f7b48e7f2904829b" id="r_a7b637b6f41976f35f7b48e7f2904829b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7b637b6f41976f35f7b48e7f2904829b">mdns_multicast_timeout_reset_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:a7b637b6f41976f35f7b48e7f2904829b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add64c83f753842f2ceb40079217c66a1" id="r_add64c83f753842f2ceb40079217c66a1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#add64c83f753842f2ceb40079217c66a1">mdns_multicast_probe_timeout_reset_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:add64c83f753842f2ceb40079217c66a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4a0ae6a039210f60f666999f9b807f7" id="r_ae4a0ae6a039210f60f666999f9b807f7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ae4a0ae6a039210f60f666999f9b807f7">mdns_multicast_timeout_25ttl_reset_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:ae4a0ae6a039210f60f666999f9b807f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acbf59dca94f241c1b58c7df1ec4b85e1" id="r_acbf59dca94f241c1b58c7df1ec4b85e1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#acbf59dca94f241c1b58c7df1ec4b85e1">mdns_send_multicast_msg_delayed_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:acbf59dca94f241c1b58c7df1ec4b85e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b7a721b19fa33813133bc97f503c199" id="r_a2b7a721b19fa33813133bc97f503c199"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2b7a721b19fa33813133bc97f503c199">mdns_send_unicast_msg_delayed_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:a2b7a721b19fa33813133bc97f503c199"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2dd35cb1e1fae888c05c2b7f8bd717cc" id="r_a2dd35cb1e1fae888c05c2b7f8bd717cc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2dd35cb1e1fae888c05c2b7f8bd717cc">mdns_start_multicast_timeouts_ipv4</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a2dd35cb1e1fae888c05c2b7f8bd717cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a790ea0aba2d252f96c23748ea0c033a7" id="r_a790ea0aba2d252f96c23748ea0c033a7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a790ea0aba2d252f96c23748ea0c033a7">mdns_multicast_timeout_reset_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:a790ea0aba2d252f96c23748ea0c033a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e0aa6f6e3ba90c88e1bf1b83d05cd2f" id="r_a4e0aa6f6e3ba90c88e1bf1b83d05cd2f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f">mdns_multicast_probe_timeout_reset_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:a4e0aa6f6e3ba90c88e1bf1b83d05cd2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5de741fd85c3675e3d2161727dd9a220" id="r_a5de741fd85c3675e3d2161727dd9a220"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5de741fd85c3675e3d2161727dd9a220">mdns_multicast_timeout_25ttl_reset_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:a5de741fd85c3675e3d2161727dd9a220"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3e118eb80760a958265f6a4c59b2e49" id="r_af3e118eb80760a958265f6a4c59b2e49"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af3e118eb80760a958265f6a4c59b2e49">mdns_send_multicast_msg_delayed_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:af3e118eb80760a958265f6a4c59b2e49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2713348b1b314d5e880442f2c130e1dc" id="r_a2713348b1b314d5e880442f2c130e1dc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2713348b1b314d5e880442f2c130e1dc">mdns_send_unicast_msg_delayed_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:a2713348b1b314d5e880442f2c130e1dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a10f6f22640ac837a233bf43334dfb02a" id="r_a10f6f22640ac837a233bf43334dfb02a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a10f6f22640ac837a233bf43334dfb02a">mdns_start_multicast_timeouts_ipv6</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a10f6f22640ac837a233bf43334dfb02a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6195808be1840daa8a100b5954a30cfe" id="r_a6195808be1840daa8a100b5954a30cfe"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a6195808be1840daa8a100b5954a30cfe">mdns_set_timeout</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u32_t msecs, <a class="el" href="timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25">sys_timeout_handler</a> handler, u8_t *busy_flag)</td></tr>
+<tr class="separator:a6195808be1840daa8a100b5954a30cfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f7dc9536f124263573518e6e8e1a162" id="r_a1f7dc9536f124263573518e6e8e1a162"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1f7dc9536f124263573518e6e8e1a162">mdns_send_request</a> (struct <a class="el" href="structmdns__request.html">mdns_request</a> *req, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *destination)</td></tr>
+<tr class="separator:a1f7dc9536f124263573518e6e8e1a162"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>MDNS responder implementation - output related functionalities </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a5a051eb81d6bd37365973d1215af23ba" name="a5a051eb81d6bd37365973d1215af23ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a051eb81d6bd37365973d1215af23ba">&#9670;&#160;</a></span>mdns_create_outpacket()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_create_outpacket </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> *</td>          <td class="paramname"><span class="paramname"><em>msg</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__outpacket.html">mdns_outpacket</a> *</td>          <td class="paramname"><span class="paramname"><em>outpkt</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create packet with chosen answers as a reply</p>
+<p>Add all selected answers / questions Add additional answers based on the selected answers </p>
+
+</div>
+</div>
+<a id="add64c83f753842f2ceb40079217c66a1" name="add64c83f753842f2ceb40079217c66a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add64c83f753842f2ceb40079217c66a1">&#9670;&#160;</a></span>mdns_multicast_probe_timeout_reset_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_probe_timeout_reset_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows direct multicast IPv4 probe response traffic again and sends out probe response if one was pending</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4e0aa6f6e3ba90c88e1bf1b83d05cd2f" name="a4e0aa6f6e3ba90c88e1bf1b83d05cd2f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f">&#9670;&#160;</a></span>mdns_multicast_probe_timeout_reset_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_probe_timeout_reset_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows direct multicast IPv6 probe response traffic again and sends out probe response if one was pending</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae4a0ae6a039210f60f666999f9b807f7" name="ae4a0ae6a039210f60f666999f9b807f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae4a0ae6a039210f60f666999f9b807f7">&#9670;&#160;</a></span>mdns_multicast_timeout_25ttl_reset_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_timeout_25ttl_reset_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows to send an answer on a QU question via multicast.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5de741fd85c3675e3d2161727dd9a220" name="a5de741fd85c3675e3d2161727dd9a220"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5de741fd85c3675e3d2161727dd9a220">&#9670;&#160;</a></span>mdns_multicast_timeout_25ttl_reset_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_timeout_25ttl_reset_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows to send an answer on a QU question via multicast.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7b637b6f41976f35f7b48e7f2904829b" name="a7b637b6f41976f35f7b48e7f2904829b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b637b6f41976f35f7b48e7f2904829b">&#9670;&#160;</a></span>mdns_multicast_timeout_reset_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_timeout_reset_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows multicast IPv4 traffic again.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a790ea0aba2d252f96c23748ea0c033a7" name="a790ea0aba2d252f96c23748ea0c033a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a790ea0aba2d252f96c23748ea0c033a7">&#9670;&#160;</a></span>mdns_multicast_timeout_reset_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_timeout_reset_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows multicast IPv6 traffic again.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab8a8e5d5ba8cfbb18e7ff2588792ce5f" name="ab8a8e5d5ba8cfbb18e7ff2588792ce5f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab8a8e5d5ba8cfbb18e7ff2588792ce5f">&#9670;&#160;</a></span>mdns_prepare_txtdata()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_prepare_txtdata </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structmdns__service.html">mdns_service</a> *</td>          <td class="paramname"><span class="paramname"><em>service</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call user supplied function to setup TXT data </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">service</td><td>The service to build TXT record for </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="acbf59dca94f241c1b58c7df1ec4b85e1" name="acbf59dca94f241c1b58c7df1ec4b85e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acbf59dca94f241c1b58c7df1ec4b85e1">&#9670;&#160;</a></span>mdns_send_multicast_msg_delayed_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_send_multicast_msg_delayed_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, sends out delayed multicast IPv4 response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af3e118eb80760a958265f6a4c59b2e49" name="af3e118eb80760a958265f6a4c59b2e49"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af3e118eb80760a958265f6a4c59b2e49">&#9670;&#160;</a></span>mdns_send_multicast_msg_delayed_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_send_multicast_msg_delayed_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, sends out delayed multicast IPv6 response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae8c9d2bd89d6ca7e8668ba708925d2e8" name="ae8c9d2bd89d6ca7e8668ba708925d2e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae8c9d2bd89d6ca7e8668ba708925d2e8">&#9670;&#160;</a></span>mdns_send_outpacket()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_send_outpacket </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> *</td>          <td class="paramname"><span class="paramname"><em>msg</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send chosen answers as a reply</p>
+<p>Create the packet Send the packet </p>
+
+</div>
+</div>
+<a id="a1f7dc9536f124263573518e6e8e1a162" name="a1f7dc9536f124263573518e6e8e1a162"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f7dc9536f124263573518e6e8e1a162">&#9670;&#160;</a></span>mdns_send_request()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_send_request </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structmdns__request.html">mdns_request</a> *</td>          <td class="paramname"><span class="paramname"><em>req</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>destination</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send search request containing all our known data </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">req</td><td>The request to send </td></tr>
+    <tr><td class="paramname">netif</td><td>The network interface to send on </td></tr>
+    <tr><td class="paramname">destination</td><td>The target address to send to (usually multicast address) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2b7a721b19fa33813133bc97f503c199" name="a2b7a721b19fa33813133bc97f503c199"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b7a721b19fa33813133bc97f503c199">&#9670;&#160;</a></span>mdns_send_unicast_msg_delayed_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_send_unicast_msg_delayed_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, sends out delayed unicast IPv4 response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2713348b1b314d5e880442f2c130e1dc" name="a2713348b1b314d5e880442f2c130e1dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2713348b1b314d5e880442f2c130e1dc">&#9670;&#160;</a></span>mdns_send_unicast_msg_delayed_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_send_unicast_msg_delayed_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, sends out delayed unicast IPv6 response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6195808be1840daa8a100b5954a30cfe" name="a6195808be1840daa8a100b5954a30cfe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6195808be1840daa8a100b5954a30cfe">&#9670;&#160;</a></span>mdns_set_timeout()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_set_timeout </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t</td>          <td class="paramname"><span class="paramname"><em>msecs</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25">sys_timeout_handler</a></td>          <td class="paramname"><span class="paramname"><em>handler</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *</td>          <td class="paramname"><span class="paramname"><em>busy_flag</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets a timer that calls the handler when finished. Depending on the busy_flag the timer is restarted or started. The flag is set before return. Sys_timeout does not give us this functionality.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>Network interface info </td></tr>
+    <tr><td class="paramname">msecs</td><td>Time value to set </td></tr>
+    <tr><td class="paramname">handler</td><td>Callback function to call </td></tr>
+    <tr><td class="paramname">busy_flag</td><td>Pointer to flag that displays if the timer is running or not. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2dd35cb1e1fae888c05c2b7f8bd717cc" name="a2dd35cb1e1fae888c05c2b7f8bd717cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2dd35cb1e1fae888c05c2b7f8bd717cc">&#9670;&#160;</a></span>mdns_start_multicast_timeouts_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_start_multicast_timeouts_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start all multicast timeouts for IPv4 Timeouts started:</p><ul>
+<li>do not multicast within one second</li>
+<li>do not multicast a probe response within 250ms</li>
+<li>send a multicast answer on a QU question if not send recently.</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface to start timeouts on </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a10f6f22640ac837a233bf43334dfb02a" name="a10f6f22640ac837a233bf43334dfb02a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a10f6f22640ac837a233bf43334dfb02a">&#9670;&#160;</a></span>mdns_start_multicast_timeouts_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_start_multicast_timeouts_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start all multicast timeouts for IPv6 Timeouts started:</p><ul>
+<li>do not multicast within one second</li>
+<li>do not multicast a probe response within 250ms</li>
+<li>send a multicast answer on a QU question if not send recently.</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface to start timeouts on </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_febe3a637907666e8b25366ae60efc0b.html">mdns</a></li><li class="navelem"><a class="el" href="mdns__out_8c.html">mdns_out.c</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mdns__out_8c.js b/doc/doxygen/output/html/mdns__out_8c.js
new file mode 100644
index 0000000..4af7d85
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__out_8c.js
@@ -0,0 +1,20 @@
+var mdns__out_8c =
+[
+    [ "mdns_create_outpacket", "mdns__out_8c.html#a5a051eb81d6bd37365973d1215af23ba", null ],
+    [ "mdns_multicast_probe_timeout_reset_ipv4", "mdns__out_8c.html#add64c83f753842f2ceb40079217c66a1", null ],
+    [ "mdns_multicast_probe_timeout_reset_ipv6", "mdns__out_8c.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f", null ],
+    [ "mdns_multicast_timeout_25ttl_reset_ipv4", "mdns__out_8c.html#ae4a0ae6a039210f60f666999f9b807f7", null ],
+    [ "mdns_multicast_timeout_25ttl_reset_ipv6", "mdns__out_8c.html#a5de741fd85c3675e3d2161727dd9a220", null ],
+    [ "mdns_multicast_timeout_reset_ipv4", "mdns__out_8c.html#a7b637b6f41976f35f7b48e7f2904829b", null ],
+    [ "mdns_multicast_timeout_reset_ipv6", "mdns__out_8c.html#a790ea0aba2d252f96c23748ea0c033a7", null ],
+    [ "mdns_prepare_txtdata", "mdns__out_8c.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f", null ],
+    [ "mdns_send_multicast_msg_delayed_ipv4", "mdns__out_8c.html#acbf59dca94f241c1b58c7df1ec4b85e1", null ],
+    [ "mdns_send_multicast_msg_delayed_ipv6", "mdns__out_8c.html#af3e118eb80760a958265f6a4c59b2e49", null ],
+    [ "mdns_send_outpacket", "mdns__out_8c.html#ae8c9d2bd89d6ca7e8668ba708925d2e8", null ],
+    [ "mdns_send_request", "mdns__out_8c.html#a1f7dc9536f124263573518e6e8e1a162", null ],
+    [ "mdns_send_unicast_msg_delayed_ipv4", "mdns__out_8c.html#a2b7a721b19fa33813133bc97f503c199", null ],
+    [ "mdns_send_unicast_msg_delayed_ipv6", "mdns__out_8c.html#a2713348b1b314d5e880442f2c130e1dc", null ],
+    [ "mdns_set_timeout", "mdns__out_8c.html#a6195808be1840daa8a100b5954a30cfe", null ],
+    [ "mdns_start_multicast_timeouts_ipv4", "mdns__out_8c.html#a2dd35cb1e1fae888c05c2b7f8bd717cc", null ],
+    [ "mdns_start_multicast_timeouts_ipv6", "mdns__out_8c.html#a10f6f22640ac837a233bf43334dfb02a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mdns__out_8h.html b/doc/doxygen/output/html/mdns__out_8h.html
new file mode 100644
index 0000000..e3a8b4a
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__out_8h.html
@@ -0,0 +1,627 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/apps/mdns_out.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('mdns__out_8h.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle"><div class="title">mdns_out.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="mdns__opts_8h.html">lwip/apps/mdns_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mdns__priv_8h.html">lwip/apps/mdns_priv.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="netif_8h.html">lwip/netif.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="timeouts_8h.html">lwip/timeouts.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ab3297d69b0effb5eb01a9b8c5a708ea9" id="r_ab3297d69b0effb5eb01a9b8c5a708ea9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab3297d69b0effb5eb01a9b8c5a708ea9">QUESTION_PROBE_HOST_ANY</a>&#160;&#160;&#160;0x10</td></tr>
+<tr class="separator:ab3297d69b0effb5eb01a9b8c5a708ea9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5a051eb81d6bd37365973d1215af23ba" id="r_a5a051eb81d6bd37365973d1215af23ba"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5a051eb81d6bd37365973d1215af23ba">mdns_create_outpacket</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> *msg, struct <a class="el" href="structmdns__outpacket.html">mdns_outpacket</a> *outpkt)</td></tr>
+<tr class="separator:a5a051eb81d6bd37365973d1215af23ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8c9d2bd89d6ca7e8668ba708925d2e8" id="r_ae8c9d2bd89d6ca7e8668ba708925d2e8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ae8c9d2bd89d6ca7e8668ba708925d2e8">mdns_send_outpacket</a> (struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> *msg, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:ae8c9d2bd89d6ca7e8668ba708925d2e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6195808be1840daa8a100b5954a30cfe" id="r_a6195808be1840daa8a100b5954a30cfe"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a6195808be1840daa8a100b5954a30cfe">mdns_set_timeout</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u32_t msecs, <a class="el" href="timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25">sys_timeout_handler</a> handler, u8_t *busy_flag)</td></tr>
+<tr class="separator:a6195808be1840daa8a100b5954a30cfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b637b6f41976f35f7b48e7f2904829b" id="r_a7b637b6f41976f35f7b48e7f2904829b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7b637b6f41976f35f7b48e7f2904829b">mdns_multicast_timeout_reset_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:a7b637b6f41976f35f7b48e7f2904829b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add64c83f753842f2ceb40079217c66a1" id="r_add64c83f753842f2ceb40079217c66a1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#add64c83f753842f2ceb40079217c66a1">mdns_multicast_probe_timeout_reset_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:add64c83f753842f2ceb40079217c66a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4a0ae6a039210f60f666999f9b807f7" id="r_ae4a0ae6a039210f60f666999f9b807f7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ae4a0ae6a039210f60f666999f9b807f7">mdns_multicast_timeout_25ttl_reset_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:ae4a0ae6a039210f60f666999f9b807f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acbf59dca94f241c1b58c7df1ec4b85e1" id="r_acbf59dca94f241c1b58c7df1ec4b85e1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#acbf59dca94f241c1b58c7df1ec4b85e1">mdns_send_multicast_msg_delayed_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:acbf59dca94f241c1b58c7df1ec4b85e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b7a721b19fa33813133bc97f503c199" id="r_a2b7a721b19fa33813133bc97f503c199"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2b7a721b19fa33813133bc97f503c199">mdns_send_unicast_msg_delayed_ipv4</a> (void *arg)</td></tr>
+<tr class="separator:a2b7a721b19fa33813133bc97f503c199"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2dd35cb1e1fae888c05c2b7f8bd717cc" id="r_a2dd35cb1e1fae888c05c2b7f8bd717cc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2dd35cb1e1fae888c05c2b7f8bd717cc">mdns_start_multicast_timeouts_ipv4</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a2dd35cb1e1fae888c05c2b7f8bd717cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a790ea0aba2d252f96c23748ea0c033a7" id="r_a790ea0aba2d252f96c23748ea0c033a7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a790ea0aba2d252f96c23748ea0c033a7">mdns_multicast_timeout_reset_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:a790ea0aba2d252f96c23748ea0c033a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e0aa6f6e3ba90c88e1bf1b83d05cd2f" id="r_a4e0aa6f6e3ba90c88e1bf1b83d05cd2f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f">mdns_multicast_probe_timeout_reset_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:a4e0aa6f6e3ba90c88e1bf1b83d05cd2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5de741fd85c3675e3d2161727dd9a220" id="r_a5de741fd85c3675e3d2161727dd9a220"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5de741fd85c3675e3d2161727dd9a220">mdns_multicast_timeout_25ttl_reset_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:a5de741fd85c3675e3d2161727dd9a220"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3e118eb80760a958265f6a4c59b2e49" id="r_af3e118eb80760a958265f6a4c59b2e49"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af3e118eb80760a958265f6a4c59b2e49">mdns_send_multicast_msg_delayed_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:af3e118eb80760a958265f6a4c59b2e49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2713348b1b314d5e880442f2c130e1dc" id="r_a2713348b1b314d5e880442f2c130e1dc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2713348b1b314d5e880442f2c130e1dc">mdns_send_unicast_msg_delayed_ipv6</a> (void *arg)</td></tr>
+<tr class="separator:a2713348b1b314d5e880442f2c130e1dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a10f6f22640ac837a233bf43334dfb02a" id="r_a10f6f22640ac837a233bf43334dfb02a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a10f6f22640ac837a233bf43334dfb02a">mdns_start_multicast_timeouts_ipv6</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a10f6f22640ac837a233bf43334dfb02a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab8a8e5d5ba8cfbb18e7ff2588792ce5f" id="r_ab8a8e5d5ba8cfbb18e7ff2588792ce5f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab8a8e5d5ba8cfbb18e7ff2588792ce5f">mdns_prepare_txtdata</a> (struct <a class="el" href="structmdns__service.html">mdns_service</a> *service)</td></tr>
+<tr class="separator:ab8a8e5d5ba8cfbb18e7ff2588792ce5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f7dc9536f124263573518e6e8e1a162" id="r_a1f7dc9536f124263573518e6e8e1a162"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1f7dc9536f124263573518e6e8e1a162">mdns_send_request</a> (struct <a class="el" href="structmdns__request.html">mdns_request</a> *req, struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *destination)</td></tr>
+<tr class="separator:a1f7dc9536f124263573518e6e8e1a162"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>MDNS responder - output related functionalities </p>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ab3297d69b0effb5eb01a9b8c5a708ea9" name="ab3297d69b0effb5eb01a9b8c5a708ea9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3297d69b0effb5eb01a9b8c5a708ea9">&#9670;&#160;</a></span>QUESTION_PROBE_HOST_ANY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define QUESTION_PROBE_HOST_ANY&#160;&#160;&#160;0x10</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Bitmasks outmsg generation </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a5a051eb81d6bd37365973d1215af23ba" name="a5a051eb81d6bd37365973d1215af23ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a051eb81d6bd37365973d1215af23ba">&#9670;&#160;</a></span>mdns_create_outpacket()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_create_outpacket </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> *</td>          <td class="paramname"><span class="paramname"><em>msg</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structmdns__outpacket.html">mdns_outpacket</a> *</td>          <td class="paramname"><span class="paramname"><em>outpkt</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Create packet with chosen answers as a reply</p>
+<p>Add all selected answers / questions Add additional answers based on the selected answers </p>
+
+</div>
+</div>
+<a id="add64c83f753842f2ceb40079217c66a1" name="add64c83f753842f2ceb40079217c66a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add64c83f753842f2ceb40079217c66a1">&#9670;&#160;</a></span>mdns_multicast_probe_timeout_reset_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_probe_timeout_reset_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows direct multicast IPv4 probe response traffic again and sends out probe response if one was pending</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4e0aa6f6e3ba90c88e1bf1b83d05cd2f" name="a4e0aa6f6e3ba90c88e1bf1b83d05cd2f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f">&#9670;&#160;</a></span>mdns_multicast_probe_timeout_reset_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_probe_timeout_reset_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows direct multicast IPv6 probe response traffic again and sends out probe response if one was pending</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae4a0ae6a039210f60f666999f9b807f7" name="ae4a0ae6a039210f60f666999f9b807f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae4a0ae6a039210f60f666999f9b807f7">&#9670;&#160;</a></span>mdns_multicast_timeout_25ttl_reset_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_timeout_25ttl_reset_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows to send an answer on a QU question via multicast.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5de741fd85c3675e3d2161727dd9a220" name="a5de741fd85c3675e3d2161727dd9a220"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5de741fd85c3675e3d2161727dd9a220">&#9670;&#160;</a></span>mdns_multicast_timeout_25ttl_reset_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_timeout_25ttl_reset_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows to send an answer on a QU question via multicast.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7b637b6f41976f35f7b48e7f2904829b" name="a7b637b6f41976f35f7b48e7f2904829b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b637b6f41976f35f7b48e7f2904829b">&#9670;&#160;</a></span>mdns_multicast_timeout_reset_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_timeout_reset_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows multicast IPv4 traffic again.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a790ea0aba2d252f96c23748ea0c033a7" name="a790ea0aba2d252f96c23748ea0c033a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a790ea0aba2d252f96c23748ea0c033a7">&#9670;&#160;</a></span>mdns_multicast_timeout_reset_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_multicast_timeout_reset_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, allows multicast IPv6 traffic again.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab8a8e5d5ba8cfbb18e7ff2588792ce5f" name="ab8a8e5d5ba8cfbb18e7ff2588792ce5f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab8a8e5d5ba8cfbb18e7ff2588792ce5f">&#9670;&#160;</a></span>mdns_prepare_txtdata()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_prepare_txtdata </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structmdns__service.html">mdns_service</a> *</td>          <td class="paramname"><span class="paramname"><em>service</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Call user supplied function to setup TXT data </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">service</td><td>The service to build TXT record for </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="acbf59dca94f241c1b58c7df1ec4b85e1" name="acbf59dca94f241c1b58c7df1ec4b85e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acbf59dca94f241c1b58c7df1ec4b85e1">&#9670;&#160;</a></span>mdns_send_multicast_msg_delayed_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_send_multicast_msg_delayed_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, sends out delayed multicast IPv4 response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="af3e118eb80760a958265f6a4c59b2e49" name="af3e118eb80760a958265f6a4c59b2e49"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af3e118eb80760a958265f6a4c59b2e49">&#9670;&#160;</a></span>mdns_send_multicast_msg_delayed_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_send_multicast_msg_delayed_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, sends out delayed multicast IPv6 response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae8c9d2bd89d6ca7e8668ba708925d2e8" name="ae8c9d2bd89d6ca7e8668ba708925d2e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae8c9d2bd89d6ca7e8668ba708925d2e8">&#9670;&#160;</a></span>mdns_send_outpacket()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_send_outpacket </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> *</td>          <td class="paramname"><span class="paramname"><em>msg</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send chosen answers as a reply</p>
+<p>Create the packet Send the packet </p>
+
+</div>
+</div>
+<a id="a1f7dc9536f124263573518e6e8e1a162" name="a1f7dc9536f124263573518e6e8e1a162"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f7dc9536f124263573518e6e8e1a162">&#9670;&#160;</a></span>mdns_send_request()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_send_request </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structmdns__request.html">mdns_request</a> *</td>          <td class="paramname"><span class="paramname"><em>req</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>destination</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send search request containing all our known data </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">req</td><td>The request to send </td></tr>
+    <tr><td class="paramname">netif</td><td>The network interface to send on </td></tr>
+    <tr><td class="paramname">destination</td><td>The target address to send to (usually multicast address) </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2b7a721b19fa33813133bc97f503c199" name="a2b7a721b19fa33813133bc97f503c199"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b7a721b19fa33813133bc97f503c199">&#9670;&#160;</a></span>mdns_send_unicast_msg_delayed_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_send_unicast_msg_delayed_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, sends out delayed unicast IPv4 response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2713348b1b314d5e880442f2c130e1dc" name="a2713348b1b314d5e880442f2c130e1dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2713348b1b314d5e880442f2c130e1dc">&#9670;&#160;</a></span>mdns_send_unicast_msg_delayed_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_send_unicast_msg_delayed_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>arg</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Called by timeouts when timer is passed, sends out delayed unicast IPv6 response.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">arg</td><td>pointer to netif of timeout. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a6195808be1840daa8a100b5954a30cfe" name="a6195808be1840daa8a100b5954a30cfe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6195808be1840daa8a100b5954a30cfe">&#9670;&#160;</a></span>mdns_set_timeout()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_set_timeout </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t</td>          <td class="paramname"><span class="paramname"><em>msecs</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25">sys_timeout_handler</a></td>          <td class="paramname"><span class="paramname"><em>handler</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u8_t *</td>          <td class="paramname"><span class="paramname"><em>busy_flag</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sets a timer that calls the handler when finished. Depending on the busy_flag the timer is restarted or started. The flag is set before return. Sys_timeout does not give us this functionality.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>Network interface info </td></tr>
+    <tr><td class="paramname">msecs</td><td>Time value to set </td></tr>
+    <tr><td class="paramname">handler</td><td>Callback function to call </td></tr>
+    <tr><td class="paramname">busy_flag</td><td>Pointer to flag that displays if the timer is running or not. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2dd35cb1e1fae888c05c2b7f8bd717cc" name="a2dd35cb1e1fae888c05c2b7f8bd717cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2dd35cb1e1fae888c05c2b7f8bd717cc">&#9670;&#160;</a></span>mdns_start_multicast_timeouts_ipv4()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_start_multicast_timeouts_ipv4 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start all multicast timeouts for IPv4 Timeouts started:</p><ul>
+<li>do not multicast within one second</li>
+<li>do not multicast a probe response within 250ms</li>
+<li>send a multicast answer on a QU question if not send recently.</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface to start timeouts on </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a10f6f22640ac837a233bf43334dfb02a" name="a10f6f22640ac837a233bf43334dfb02a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a10f6f22640ac837a233bf43334dfb02a">&#9670;&#160;</a></span>mdns_start_multicast_timeouts_ipv6()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void mdns_start_multicast_timeouts_ipv6 </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Start all multicast timeouts for IPv6 Timeouts started:</p><ul>
+<li>do not multicast within one second</li>
+<li>do not multicast a probe response within 250ms</li>
+<li>send a multicast answer on a QU question if not send recently.</li>
+</ul>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>network interface to start timeouts on </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li><li class="navelem"><a class="el" href="dir_4e6b3cf33a61b6caac9c8ac30c866f37.html">lwip</a></li><li class="navelem"><a class="el" href="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="mdns__out_8h.html">mdns_out.h</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/mdns__out_8h.js b/doc/doxygen/output/html/mdns__out_8h.js
new file mode 100644
index 0000000..c52def7
--- /dev/null
+++ b/doc/doxygen/output/html/mdns__out_8h.js
@@ -0,0 +1,21 @@
+var mdns__out_8h =
+[
+    [ "QUESTION_PROBE_HOST_ANY", "mdns__out_8h.html#ab3297d69b0effb5eb01a9b8c5a708ea9", null ],
+    [ "mdns_create_outpacket", "mdns__out_8h.html#a5a051eb81d6bd37365973d1215af23ba", null ],
+    [ "mdns_multicast_probe_timeout_reset_ipv4", "mdns__out_8h.html#add64c83f753842f2ceb40079217c66a1", null ],
+    [ "mdns_multicast_probe_timeout_reset_ipv6", "mdns__out_8h.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f", null ],
+    [ "mdns_multicast_timeout_25ttl_reset_ipv4", "mdns__out_8h.html#ae4a0ae6a039210f60f666999f9b807f7", null ],
+    [ "mdns_multicast_timeout_25ttl_reset_ipv6", "mdns__out_8h.html#a5de741fd85c3675e3d2161727dd9a220", null ],
+    [ "mdns_multicast_timeout_reset_ipv4", "mdns__out_8h.html#a7b637b6f41976f35f7b48e7f2904829b", null ],
+    [ "mdns_multicast_timeout_reset_ipv6", "mdns__out_8h.html#a790ea0aba2d252f96c23748ea0c033a7", null ],
+    [ "mdns_prepare_txtdata", "mdns__out_8h.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f", null ],
+    [ "mdns_send_multicast_msg_delayed_ipv4", "mdns__out_8h.html#acbf59dca94f241c1b58c7df1ec4b85e1", null ],
+    [ "mdns_send_multicast_msg_delayed_ipv6", "mdns__out_8h.html#af3e118eb80760a958265f6a4c59b2e49", null ],
+    [ "mdns_send_outpacket", "mdns__out_8h.html#ae8c9d2bd89d6ca7e8668ba708925d2e8", null ],
+    [ "mdns_send_request", "mdns__out_8h.html#a1f7dc9536f124263573518e6e8e1a162", null ],
+    [ "mdns_send_unicast_msg_delayed_ipv4", "mdns__out_8h.html#a2b7a721b19fa33813133bc97f503c199", null ],
+    [ "mdns_send_unicast_msg_delayed_ipv6", "mdns__out_8h.html#a2713348b1b314d5e880442f2c130e1dc", null ],
+    [ "mdns_set_timeout", "mdns__out_8h.html#a6195808be1840daa8a100b5954a30cfe", null ],
+    [ "mdns_start_multicast_timeouts_ipv4", "mdns__out_8h.html#a2dd35cb1e1fae888c05c2b7f8bd717cc", null ],
+    [ "mdns_start_multicast_timeouts_ipv6", "mdns__out_8h.html#a10f6f22640ac837a233bf43334dfb02a", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mdns__priv_8h.html b/doc/doxygen/output/html/mdns__priv_8h.html
index 43cf240..790fc80 100644
--- a/doc/doxygen/output/html/mdns__priv_8h.html
+++ b/doc/doxygen/output/html/mdns__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -98,158 +98,81 @@
 
 <div class="header">
   <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle"><div class="title">mdns_priv.h File Reference</div></div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><code>#include &quot;<a class="el" href="mdns__opts_8h.html">lwip/apps/mdns_opts.h</a>&quot;</code><br />
+<div class="textblock"><code>#include &quot;<a class="el" href="mdns_8h.html">lwip/apps/mdns.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="mdns__opts_8h.html">lwip/apps/mdns_opts.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
 </div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__request.html">mdns_request</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__service.html">mdns_service</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outpacket.html">mdns_outpacket</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__outmsg.html">mdns_outmsg</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__delayed__msg.html">mdns_delayed_msg</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structmdns__host.html">mdns_host</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:a17db69fa887515374452b945e959bbf9" id="r_a17db69fa887515374452b945e959bbf9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a17db69fa887515374452b945e959bbf9">mdns_domain_add_label</a> (struct mdns_domain *domain, const char *label, u8_t len)</td></tr>
-<tr class="separator:a17db69fa887515374452b945e959bbf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab5f49d9356a76879e0e6a14eb0643b23" id="r_ab5f49d9356a76879e0e6a14eb0643b23"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab5f49d9356a76879e0e6a14eb0643b23">mdns_readname</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p, u16_t offset, struct mdns_domain *domain)</td></tr>
-<tr class="separator:ab5f49d9356a76879e0e6a14eb0643b23"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a52d8f70432ae998814f16b18431213cd" id="r_a52d8f70432ae998814f16b18431213cd"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a52d8f70432ae998814f16b18431213cd">mdns_domain_eq</a> (struct mdns_domain *a, struct mdns_domain *b)</td></tr>
-<tr class="separator:a52d8f70432ae998814f16b18431213cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab72e48cf076afd1e3a08030d1d0bff9e" id="r_ab72e48cf076afd1e3a08030d1d0bff9e"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab72e48cf076afd1e3a08030d1d0bff9e">mdns_compress_domain</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *<a class="el" href="structpbuf.html">pbuf</a>, u16_t *offset, struct mdns_domain *domain)</td></tr>
-<tr class="separator:ab72e48cf076afd1e3a08030d1d0bff9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af15fa5b6331bec605f68f53cb87f58fa" id="r_af15fa5b6331bec605f68f53cb87f58fa"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__host.html">mdns_host</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af15fa5b6331bec605f68f53cb87f58fa">netif_mdns_data</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:af15fa5b6331bec605f68f53cb87f58fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa31b798a5fb96b6ef0dde5d4f32371af" id="r_aa31b798a5fb96b6ef0dde5d4f32371af"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa31b798a5fb96b6ef0dde5d4f32371af">get_mdns_pcb</a> (void)</td></tr>
+<tr class="separator:aa31b798a5fb96b6ef0dde5d4f32371af"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>MDNS responder private definitions </p>
 </div><h2 class="groupheader">Function Documentation</h2>
-<a id="ab72e48cf076afd1e3a08030d1d0bff9e" name="ab72e48cf076afd1e3a08030d1d0bff9e"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ab72e48cf076afd1e3a08030d1d0bff9e">&#9670;&#160;</a></span>mdns_compress_domain()</h2>
+<a id="aa31b798a5fb96b6ef0dde5d4f32371af" name="aa31b798a5fb96b6ef0dde5d4f32371af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa31b798a5fb96b6ef0dde5d4f32371af">&#9670;&#160;</a></span>get_mdns_pcb()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">u16_t mdns_compress_domain </td>
+          <td class="memname">struct <a class="el" href="structudp__pcb.html">udp_pcb</a> * get_mdns_pcb </td>
           <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *</td>          <td class="paramname"><span class="paramname"><em>pbuf</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
+          <td class="paramtype">void</td>          <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
           <td></td>
-          <td class="paramtype">u16_t *</td>          <td class="paramname"><span class="paramname"><em>offset</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Return bytes needed to write before jump for best result of compressing supplied domain against domain in outpacket starting at specified offset. If a match is found, offset is updated to where to jump to </p><dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">pbuf</td><td>Pointer to pbuf with the partially constructed DNS packet </td></tr>
-    <tr><td class="paramname">offset</td><td>Start position of a domain written earlier. If this location is suitable for compression, the pointer is updated to where in the domain to jump to. </td></tr>
-    <tr><td class="paramname">domain</td><td>The domain to write </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>Number of bytes to write of the new domain before writing a jump to the offset. If compression can not be done against this previous domain name, the full new domain length is returned. </dd></dl>
+<p>Construction to access the mdns udp pcb.</p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="structudp__pcb.html">udp_pcb</a> struct of mdns </dd></dl>
 
 </div>
 </div>
-<a id="a17db69fa887515374452b945e959bbf9" name="a17db69fa887515374452b945e959bbf9"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a17db69fa887515374452b945e959bbf9">&#9670;&#160;</a></span>mdns_domain_add_label()</h2>
+<a id="af15fa5b6331bec605f68f53cb87f58fa" name="af15fa5b6331bec605f68f53cb87f58fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af15fa5b6331bec605f68f53cb87f58fa">&#9670;&#160;</a></span>netif_mdns_data()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> mdns_domain_add_label </td>
+          <td class="memname">struct <a class="el" href="structmdns__host.html">mdns_host</a> * netif_mdns_data </td>
           <td>(</td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span></td><td>)</td>
           <td></td>
-          <td class="paramtype">const char *</td>          <td class="paramname"><span class="paramname"><em>label</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>len</em></span>&#160;)</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Add a label part to a domain </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Construction to make mdns struct accessible from <a class="el" href="mdns__out_8c.html">mdns_out.c</a> TODO: can we add the mdns struct to the netif like we do for dhcp, autoip,...? Then this is not needed any more.</p>
+<dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">domain</td><td>The domain to add a label to </td></tr>
-    <tr><td class="paramname">label</td><td>The label to add, like &lt;hostname&gt;, 'local', 'com' or '' </td></tr>
-    <tr><td class="paramname">len</td><td>The length of the label </td></tr>
+    <tr><td class="paramname">netif</td><td>The network interface </td></tr>
   </table>
   </dd>
 </dl>
-<dl class="section return"><dt>Returns</dt><dd>ERR_OK on success, an err_t otherwise if label too long </dd></dl>
-
-</div>
-</div>
-<a id="a52d8f70432ae998814f16b18431213cd" name="a52d8f70432ae998814f16b18431213cd"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a52d8f70432ae998814f16b18431213cd">&#9670;&#160;</a></span>mdns_domain_eq()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">int mdns_domain_eq </td>
-          <td>(</td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>b</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Return 1 if contents of domains match (case-insensitive) </p><dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">a</td><td>Domain name to compare 1 </td></tr>
-    <tr><td class="paramname">b</td><td>Domain name to compare 2 </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>1 if domains are equal ignoring case, 0 otherwise </dd></dl>
-
-</div>
-</div>
-<a id="ab5f49d9356a76879e0e6a14eb0643b23" name="ab5f49d9356a76879e0e6a14eb0643b23"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ab5f49d9356a76879e0e6a14eb0643b23">&#9670;&#160;</a></span>mdns_readname()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u16_t mdns_readname </td>
-          <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structpbuf.html">pbuf</a> *</td>          <td class="paramname"><span class="paramname"><em>p</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">u16_t</td>          <td class="paramname"><span class="paramname"><em>offset</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">struct mdns_domain *</td>          <td class="paramname"><span class="paramname"><em>domain</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Read possibly compressed domain name from packet buffer </p><dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">p</td><td>The packet </td></tr>
-    <tr><td class="paramname">offset</td><td>start position of domain name in packet </td></tr>
-    <tr><td class="paramname">domain</td><td>The domain name destination </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>The new offset after the domain, or MDNS_READNAME_ERROR if reading failed </dd></dl>
+<dl class="section return"><dt>Returns</dt><dd>mdns struct </dd></dl>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/mdns__priv_8h.js b/doc/doxygen/output/html/mdns__priv_8h.js
index 0b24da8..380ba59 100644
--- a/doc/doxygen/output/html/mdns__priv_8h.js
+++ b/doc/doxygen/output/html/mdns__priv_8h.js
@@ -1,7 +1,11 @@
 var mdns__priv_8h =
 [
-    [ "mdns_compress_domain", "mdns__priv_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e", null ],
-    [ "mdns_domain_add_label", "mdns__priv_8h.html#a17db69fa887515374452b945e959bbf9", null ],
-    [ "mdns_domain_eq", "mdns__priv_8h.html#a52d8f70432ae998814f16b18431213cd", null ],
-    [ "mdns_readname", "mdns__priv_8h.html#ab5f49d9356a76879e0e6a14eb0643b23", null ]
+    [ "mdns_request", "structmdns__request.html", "structmdns__request" ],
+    [ "mdns_service", "structmdns__service.html", "structmdns__service" ],
+    [ "mdns_outpacket", "structmdns__outpacket.html", "structmdns__outpacket" ],
+    [ "mdns_outmsg", "structmdns__outmsg.html", "structmdns__outmsg" ],
+    [ "mdns_delayed_msg", "structmdns__delayed__msg.html", "structmdns__delayed__msg" ],
+    [ "mdns_host", "structmdns__host.html", "structmdns__host" ],
+    [ "get_mdns_pcb", "mdns__priv_8h.html#aa31b798a5fb96b6ef0dde5d4f32371af", null ],
+    [ "netif_mdns_data", "mdns__priv_8h.html#af15fa5b6331bec605f68f53cb87f58fa", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/mem_8c.html b/doc/doxygen/output/html/mem_8c.html
index 60e5841..b767bc0 100644
--- a/doc/doxygen/output/html/mem_8c.html
+++ b/doc/doxygen/output/html/mem_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -284,7 +284,7 @@
 <p>Shrink memory returned by <a class="el" href="#ae2190f95ae9c46bb99ec0be4f4e4e5e4">mem_malloc()</a>.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">rmem</td><td>pointer to memory allocated by mem_malloc the is to be shrinked </td></tr>
+    <tr><td class="paramname">rmem</td><td>pointer to memory allocated by mem_malloc the is to be shrunk </td></tr>
     <tr><td class="paramname">new_size</td><td>required size after shrinking (needs to be smaller than or equal to the previous size) </td></tr>
   </table>
   </dd>
diff --git a/doc/doxygen/output/html/mem_8h.html b/doc/doxygen/output/html/mem_8h.html
index 845d658..10e7184 100644
--- a/doc/doxygen/output/html/mem_8h.html
+++ b/doc/doxygen/output/html/mem_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -240,7 +240,7 @@
 <p>Shrink memory returned by <a class="el" href="mem_8c.html#ae2190f95ae9c46bb99ec0be4f4e4e5e4">mem_malloc()</a>.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">rmem</td><td>pointer to memory allocated by mem_malloc the is to be shrinked </td></tr>
+    <tr><td class="paramname">rmem</td><td>pointer to memory allocated by mem_malloc the is to be shrunk </td></tr>
     <tr><td class="paramname">new_size</td><td>required size after shrinking (needs to be smaller than or equal to the previous size) </td></tr>
   </table>
   </dd>
diff --git a/doc/doxygen/output/html/mem__priv_8h.html b/doc/doxygen/output/html/mem__priv_8h.html
index 84661c5..47bb5eb 100644
--- a/doc/doxygen/output/html/mem__priv_8h.html
+++ b/doc/doxygen/output/html/mem__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/mem_err.html b/doc/doxygen/output/html/mem_err.html
index a7c9a90..bceb792 100644
--- a/doc/doxygen/output/html/mem_err.html
+++ b/doc/doxygen/output/html/mem_err.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -101,7 +101,7 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><p>If you have issues with lwIP and you are using memory pools, check that your pools are correctly sized.<br  />
-To debug pool sizes, #define LWIP_STATS and MEMP_STATS to 1. Check the global variable lwip_stats.memp[] using a debugger. If the "err" member of a pool is &gt; 0, the pool may be too small for your application and you need to increase its size. </p>
+ To debug pool sizes, #define LWIP_STATS and MEMP_STATS to 1. Check the global variable lwip_stats.memp[] using a debugger. If the "err" member of a pool is &gt; 0, the pool may be too small for your application and you need to increase its size. </p>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/memp_8c.html b/doc/doxygen/output/html/memp_8c.html
index 0cc1683..12f8528 100644
--- a/doc/doxygen/output/html/memp_8c.html
+++ b/doc/doxygen/output/html/memp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/memp_8h.html b/doc/doxygen/output/html/memp_8h.html
index 4fe52ec..222ff48 100644
--- a/doc/doxygen/output/html/memp_8h.html
+++ b/doc/doxygen/output/html/memp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/memp__priv_8h.html b/doc/doxygen/output/html/memp__priv_8h.html
index f060b3b..165b61e 100644
--- a/doc/doxygen/output/html/memp__priv_8h.html
+++ b/doc/doxygen/output/html/memp__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/memp__std_8h.html b/doc/doxygen/output/html/memp__std_8h.html
index 4187754..944d476 100644
--- a/doc/doxygen/output/html/memp__std_8h.html
+++ b/doc/doxygen/output/html/memp__std_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/menudata.js b/doc/doxygen/output/html/menudata.js
index 12b5d48..aeb20ad 100644
--- a/doc/doxygen/output/html/menudata.js
+++ b/doc/doxygen/output/html/menudata.js
@@ -91,12 +91,14 @@
 {text:"d",url:"globals_d.html#index_d"},
 {text:"e",url:"globals_e.html#index_e"},
 {text:"f",url:"globals_f.html#index_f"},
+{text:"g",url:"globals_g.html#index_g"},
 {text:"h",url:"globals_h.html#index_h"},
 {text:"i",url:"globals_i.html#index_i"},
 {text:"l",url:"globals_l.html#index_l"},
 {text:"m",url:"globals_m.html#index_m"},
 {text:"n",url:"globals_n.html#index_n"},
 {text:"p",url:"globals_p.html#index_p"},
+{text:"q",url:"globals_q.html#index_q"},
 {text:"r",url:"globals_r.html#index_r"},
 {text:"s",url:"globals_s.html#index_s"},
 {text:"t",url:"globals_t.html#index_t"},
@@ -107,6 +109,7 @@
 {text:"b",url:"globals_func_b.html#index_b"},
 {text:"d",url:"globals_func_d.html#index_d"},
 {text:"e",url:"globals_func_e.html#index_e"},
+{text:"g",url:"globals_func_g.html#index_g"},
 {text:"h",url:"globals_func_h.html#index_h"},
 {text:"i",url:"globals_func_i.html#index_i"},
 {text:"l",url:"globals_func_l.html#index_l"},
@@ -128,6 +131,7 @@
 {text:"s",url:"globals_vars.html#index_s"},
 {text:"t",url:"globals_vars.html#index_t"}]},
 {text:"Typedefs",url:"globals_type.html",children:[
+{text:"a",url:"globals_type.html#index_a"},
 {text:"b",url:"globals_type.html#index_b"},
 {text:"d",url:"globals_type.html#index_d"},
 {text:"e",url:"globals_type.html#index_e"},
@@ -172,6 +176,7 @@
 {text:"m",url:"globals_defs_m.html#index_m"},
 {text:"n",url:"globals_defs_n.html#index_n"},
 {text:"p",url:"globals_defs_p.html#index_p"},
+{text:"q",url:"globals_defs_q.html#index_q"},
 {text:"r",url:"globals_defs_r.html#index_r"},
 {text:"s",url:"globals_defs_s.html#index_s"},
 {text:"t",url:"globals_defs_t.html#index_t"},
diff --git a/doc/doxygen/output/html/mld6_8c.html b/doc/doxygen/output/html/mld6_8c.html
index 689294c..e8f8c8c 100644
--- a/doc/doxygen/output/html/mld6_8c.html
+++ b/doc/doxygen/output/html/mld6_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/mld6_8h.html b/doc/doxygen/output/html/mld6_8h.html
index 57812c1..b651eba 100644
--- a/doc/doxygen/output/html/mld6_8h.html
+++ b/doc/doxygen/output/html/mld6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/mqtt_8c.html b/doc/doxygen/output/html/mqtt_8c.html
index 5de8daa..9de1119 100644
--- a/doc/doxygen/output/html/mqtt_8c.html
+++ b/doc/doxygen/output/html/mqtt_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/mqtt_8h.html b/doc/doxygen/output/html/mqtt_8h.html
index 79ef35f..2dd1da5 100644
--- a/doc/doxygen/output/html/mqtt_8h.html
+++ b/doc/doxygen/output/html/mqtt_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -153,9 +153,9 @@
 <br />
  }</td></tr>
 <tr class="separator:ga8cf0f360ab20343af37e1d124395a77d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga99fb83031ce9923c84392b4e92f956b5" id="r_ga99fb83031ce9923c84392b4e92f956b5"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f">MQTT_DATA_FLAG_LAST</a> = 1
+<tr class="memitem:gabc6126af1d45847bc59afa0aa3216b04" id="r_gabc6126af1d45847bc59afa0aa3216b04"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="group__mqtt.html#ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f">MQTT_DATA_FLAG_LAST</a> = 1
  }</td></tr>
-<tr class="separator:ga99fb83031ce9923c84392b4e92f956b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="separator:gabc6126af1d45847bc59afa0aa3216b04"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
@@ -169,7 +169,7 @@
 <tr class="separator:gaa0fa1d985c322a9c91a51322db254882"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga98f0fd168112b8b7db59bcd7a325a5c5" id="r_ga98f0fd168112b8b7db59bcd7a325a5c5"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5">mqtt_client_is_connected</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client)</td></tr>
 <tr class="separator:ga98f0fd168112b8b7db59bcd7a325a5c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gafdfa0e65b217e92835d35858924565cf" id="r_gafdfa0e65b217e92835d35858924565cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gafdfa0e65b217e92835d35858924565cf">mqtt_set_inpub_callback</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, <a class="el" href="group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29">mqtt_incoming_publish_cb_t</a>, <a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt_incoming_data_cb_t</a> data_cb, void *arg)</td></tr>
+<tr class="memitem:gafdfa0e65b217e92835d35858924565cf" id="r_gafdfa0e65b217e92835d35858924565cf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gafdfa0e65b217e92835d35858924565cf">mqtt_set_inpub_callback</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, <a class="el" href="group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29">mqtt_incoming_publish_cb_t</a> pub_cb, <a class="el" href="group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81">mqtt_incoming_data_cb_t</a> data_cb, void *arg)</td></tr>
 <tr class="separator:gafdfa0e65b217e92835d35858924565cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gafdb39d4a9758f98c02451aaa9a9b3103" id="r_gafdb39d4a9758f98c02451aaa9a9b3103"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103">mqtt_sub_unsub</a> (<a class="el" href="structmqtt__client__s.html">mqtt_client_t</a> *client, const char *topic, u8_t qos, <a class="el" href="group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd">mqtt_request_cb_t</a> cb, void *arg, u8_t sub)</td></tr>
 <tr class="separator:gafdb39d4a9758f98c02451aaa9a9b3103"><td class="memSeparator" colspan="2">&#160;</td></tr>
diff --git a/doc/doxygen/output/html/mqtt__opts_8h.html b/doc/doxygen/output/html/mqtt__opts_8h.html
index c0978e7..aeb2fcd 100644
--- a/doc/doxygen/output/html/mqtt__opts_8h.html
+++ b/doc/doxygen/output/html/mqtt__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/mqtt__priv_8h.html b/doc/doxygen/output/html/mqtt__priv_8h.html
index 5cd77d3..08a5aab 100644
--- a/doc/doxygen/output/html/mqtt__priv_8h.html
+++ b/doc/doxygen/output/html/mqtt__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/multithreading.html b/doc/doxygen/output/html/multithreading.html
index 4f8406b..b02f0c6 100644
--- a/doc/doxygen/output/html/multithreading.html
+++ b/doc/doxygen/output/html/multithreading.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -110,11 +110,11 @@
 <li><a class="el" href="sockets_8h.html">sockets.h</a></li>
 <li><a class="el" href="sys_8h.html">sys.h</a></li>
 </ul>
-<p>Additionaly, memory (de-)allocation functions may be called from multiple threads (not ISR!) with NO_SYS=0 since they are protected by <a class="el" href="group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959">SYS_LIGHTWEIGHT_PROT</a> and/or semaphores.</p>
+<p>Additionally, memory (de-)allocation functions may be called from multiple threads (not ISR!) with NO_SYS=0 since they are protected by <a class="el" href="group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959">SYS_LIGHTWEIGHT_PROT</a> and/or semaphores.</p>
 <p>Netconn or Socket API functions are thread safe against the core thread but they are not reentrant at the control block granularity level. That is, a UDP or TCP control block must not be shared among multiple threads without proper locking.</p>
 <p>If <a class="el" href="group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959">SYS_LIGHTWEIGHT_PROT</a> is set to 1 and <a class="el" href="group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2">LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT</a> is set to 1, <a class="el" href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free()</a> may also be called from another thread or an ISR (since only then, mem_free - for PBUF_RAM - may be called from an ISR: otherwise, the HEAP is only protected by semaphores).</p>
 <h2>How to get threading done right </h2>
-<p>It is strongly recommended to implement the <a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">LWIP_ASSERT_CORE_LOCKED()</a> macro in an application that uses multithreading. lwIP code has several places where a check for a correct thread context is implemented which greatly helps the user to get threading done right. See the example sys_arch.c files in unix and Win32 port in the contrib repository.</p>
+<p>It is strongly recommended to implement the <a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">LWIP_ASSERT_CORE_LOCKED()</a> macro in an application that uses multithreading. lwIP code has several places where a check for a correct thread context is implemented which greatly helps the user to get threading done right. See the example sys_arch.c files in unix and Win32 port in the lwIP/contrib subdirectory.</p>
 <p>In short: Copy the functions sys_mark_tcpip_thread() and sys_check_core_locking() to your port and modify them to work with your OS. Then let <a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">LWIP_ASSERT_CORE_LOCKED()</a> and <a class="el" href="group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e">LWIP_MARK_TCPIP_THREAD()</a> point to these functions.</p>
 <p>If you use <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a>, you also need to copy and adapt the functions sys_lock_tcpip_core() and sys_unlock_tcpip_core(). Let <a class="el" href="tcpip_8h.html#a4700525e737fc025fea4887b172e0c95">LOCK_TCPIP_CORE()</a> and <a class="el" href="tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d">UNLOCK_TCPIP_CORE()</a> point to these functions. </p>
 </div></div><!-- contents -->
diff --git a/doc/doxygen/output/html/navtreedata.js b/doc/doxygen/output/html/navtreedata.js
index 97fe165..1b6ad8d 100644
--- a/doc/doxygen/output/html/navtreedata.js
+++ b/doc/doxygen/output/html/navtreedata.js
@@ -29,11 +29,12 @@
     [ "Upgrading", "upgrading.html", null ],
     [ "Changelog", "changelog.html", null ],
     [ "How to contribute to lwIP", "contrib.html", null ],
+    [ "CMake build system", "cmake.html", null ],
     [ "Common pitfalls", "pitfalls.html", null ],
     [ "Debugging memory pool sizes", "mem_err.html", null ],
     [ "Reporting bugs", "bugs.html", null ],
     [ "Zero-copy RX", "zerocopyrx.html", null ],
-    [ "System initalization", "sys_init.html", null ],
+    [ "System initialization", "sys_init.html", null ],
     [ "Multithreading", "multithreading.html", null ],
     [ "Optimization hints", "optimization.html", null ],
     [ "Deprecated List", "deprecated.html", null ],
@@ -62,18 +63,19 @@
 
 var NAVTREEINDEX =
 [
-"altcp_8c.html",
-"functions_c.html",
-"group__httpd.html#gac364305cee969a0be43c071722b136e6",
-"group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77",
-"group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f",
-"group__pbuf.html#gaba88511dee3df4b631fde691f421320d",
-"group__zepif.html",
-"lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a",
-"pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f",
-"sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1",
-"structnetbios__hdr.html",
-"tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c"
+"acd_8c.html",
+"ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd",
+"group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd",
+"group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642",
+"group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218",
+"group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e",
+"group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a",
+"ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b",
+"memp_8c.html#ab6bfb9562c3a77e329a888e59ef0ace3",
+"slipif_8h.html#a198967c11f79cffc32192710294e8826",
+"structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a",
+"structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341",
+"tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249"
 ];
 
 var SYNCONMSG = 'click to disable panel synchronisation';
diff --git a/doc/doxygen/output/html/navtreeindex0.js b/doc/doxygen/output/html/navtreeindex0.js
index df02796..0729b29 100644
--- a/doc/doxygen/output/html/navtreeindex0.js
+++ b/doc/doxygen/output/html/navtreeindex0.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX0 =
 {
-"altcp_8c.html":[14,0,0,2,2],
-"altcp_8c.html#aa74c9fc358cffeeb7311b4212b0d6fc7":[14,0,0,2,2,2],
-"altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d":[14,0,0,2,2,8],
-"altcp_8h.html":[14,0,0,3,1,3],
-"altcp__alloc_8c.html":[14,0,0,2,3],
-"altcp__priv_8h.html":[14,0,0,3,1,1,0],
-"altcp__priv_8h.html#aa74c9fc358cffeeb7311b4212b0d6fc7":[14,0,0,3,1,1,0,0],
-"altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d":[14,0,0,3,1,1,0,1],
-"altcp__proxyconnect_8c.html":[14,0,0,1,1,0],
-"altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f":[14,0,0,1,1,0,0],
-"altcp__proxyconnect_8c.html#a371cd4386fcbc5f0a0ff6e2fa0408e68":[14,0,0,1,1,0,1],
-"altcp__proxyconnect_8c.html#a389937c9441d4e3f67412603b3d1d236":[14,0,0,1,1,0,2],
-"altcp__proxyconnect_8c.html#aa807e0476719f0ec41b2344d4a0df2f4":[14,0,0,1,1,0,4],
-"altcp__proxyconnect_8c.html#ab0072ee857af8a28b555f14c0f2c9183":[14,0,0,1,1,0,3],
-"altcp__proxyconnect_8h.html":[14,0,0,3,1,0,0],
-"altcp__proxyconnect_8h.html#a371cd4386fcbc5f0a0ff6e2fa0408e68":[14,0,0,3,1,0,0,0],
-"altcp__proxyconnect_8h.html#a389937c9441d4e3f67412603b3d1d236":[14,0,0,3,1,0,0,1],
-"altcp__proxyconnect_8h.html#aa807e0476719f0ec41b2344d4a0df2f4":[14,0,0,3,1,0,0,3],
-"altcp__proxyconnect_8h.html#ab0072ee857af8a28b555f14c0f2c9183":[14,0,0,3,1,0,0,2],
-"altcp__tcp_8c.html":[14,0,0,2,4],
-"altcp__tcp_8c.html#a77582c93bb8a0aa2719e86b8c8505e8a":[14,0,0,2,4,0],
-"altcp__tcp_8h.html":[14,0,0,3,1,4],
-"altcp__tcp_8h.html#a77582c93bb8a0aa2719e86b8c8505e8a":[14,0,0,3,1,4,0],
-"altcp__tls_8h.html":[14,0,0,3,1,5],
-"altcp__tls__mbedtls_8c.html":[14,0,0,1,0,0],
-"altcp__tls__mbedtls__mem_8c.html":[14,0,0,1,0,1],
-"altcp__tls__mbedtls__mem_8h.html":[14,0,0,1,0,2],
-"altcp__tls__mbedtls__opts_8h.html":[14,0,0,3,1,0,1],
-"altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308":[14,0,0,3,1,0,1,1],
-"altcp__tls__mbedtls__opts_8h.html#a1c8a3f37f8ede74835b03eedcdc41973":[14,0,0,3,1,0,1,3],
-"altcp__tls__mbedtls__opts_8h.html#a4917dbc00f43f88eb703c8ba89bd37f6":[14,0,0,3,1,0,1,5],
-"altcp__tls__mbedtls__opts_8h.html#a66eff71890153166578b0b78d780ac50":[14,0,0,3,1,0,1,6],
-"altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6":[14,0,0,3,1,0,1,4],
-"altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989":[14,0,0,3,1,0,1,0],
-"altcp__tls__mbedtls__opts_8h.html#abd6b53a101f046337a4d77c749dbab66":[14,0,0,3,1,0,1,7],
-"altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639":[14,0,0,3,1,0,1,9],
-"altcp__tls__mbedtls__opts_8h.html#ad8561bbfabb4ec81ad1c4d7304d16bb5":[14,0,0,3,1,0,1,2],
-"altcp__tls__mbedtls__opts_8h.html#ae3dbc4de0fc53bcda746c9dfd5618d3b":[14,0,0,3,1,0,1,8],
-"altcp__tls__mbedtls__structs_8h.html":[14,0,0,1,0,3],
-"annotated.html":[13,0],
-"api_8h.html":[14,0,0,3,1,6],
-"api_8h.html#a04785274634a5b504c760731c2e70725":[14,0,0,3,1,6,16],
-"api_8h.html#a24d62a2a03ba421fcf2bdce1ea89b949":[14,0,0,3,1,6,3],
-"api_8h.html#a28430d1d86733f1bf98dc31305c42104":[14,0,0,3,1,6,32],
-"api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada":[14,0,0,3,1,6,22],
-"api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016":[14,0,0,3,1,6,17],
-"api_8h.html#a3ce590f58be8f60dbde361920863b26d":[14,0,0,3,1,6,2],
-"api_8h.html#a42711660e5030bc0dff779f3cea4178e":[14,0,0,3,1,6,37],
-"api_8h.html#a505c3b8e400babf9681e09c945b7f421":[14,0,0,3,1,6,43],
-"api_8h.html#a5789f0030b895b40625a74deb5a1092f":[14,0,0,3,1,6,12],
-"api_8h.html#a5c6ded2c082de1536019b197a0a912db":[14,0,0,3,1,6,21],
-"api_8h.html#a60892e4eb139f10157847fea4266bf5b":[14,0,0,3,1,6,6],
-"api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1":[14,0,0,3,1,6,18],
-"api_8h.html#a6a578dd5b55e4457e0d23574ec9c55bb":[14,0,0,3,1,6,15],
-"api_8h.html#a70bb861ee643b60ee402fd48f581f58d":[14,0,0,3,1,6,5],
-"api_8h.html#a7d6e84458eec796b0b0ce1bb247f323f":[14,0,0,3,1,6,11],
-"api_8h.html#a805a90b546c5a149f04782351633979b":[14,0,0,3,1,6,42],
-"api_8h.html#a992b4fe8a855fd94861738f7260d0a32":[14,0,0,3,1,6,48],
-"api_8h.html#a9d791955a4256a0589a3844e4e6f0f9c":[14,0,0,3,1,6,4],
-"api_8h.html#abee57aa0ba63e35742d411bc5224900a":[14,0,0,3,1,6,8],
-"api_8h.html#ac0298c287dc3823047c378c014ff1eb0":[14,0,0,3,1,6,10],
-"api_8h.html#ae9307baa49245990c8c4517bb4e8d47b":[14,0,0,3,1,6,19],
-"api_8h.html#af722260882d14c49afb765293ffb0155":[14,0,0,3,1,6,20],
-"api_8h.html#af77be7590d3712259e78103c1dddf63f":[14,0,0,3,1,6,7],
-"api__lib_8c.html":[14,0,0,0,0],
-"api__lib_8c.html#a28430d1d86733f1bf98dc31305c42104":[14,0,0,0,0,8],
-"api__lib_8c.html#a42711660e5030bc0dff779f3cea4178e":[14,0,0,0,0,13],
-"api__lib_8c.html#a505c3b8e400babf9681e09c945b7f421":[14,0,0,0,0,19],
-"api__lib_8c.html#a805a90b546c5a149f04782351633979b":[14,0,0,0,0,18],
-"api__lib_8c.html#a992b4fe8a855fd94861738f7260d0a32":[14,0,0,0,0,24],
-"api__msg_8c.html":[14,0,0,0,1],
-"api__msg_8c.html#a126d82a17c302d883f4131379abd1430":[14,0,0,0,1,16],
-"api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902":[14,0,0,0,1,4],
-"api__msg_8c.html#a7402b52416828906a5679828cce37546":[14,0,0,0,1,9],
-"api__msg_8c.html#a875b82ad129bdec1c6f2c21cbeedc48b":[14,0,0,0,1,17],
-"api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59":[14,0,0,0,1,5],
-"api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f":[14,0,0,0,1,11],
-"api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768":[14,0,0,0,1,1],
-"api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722":[14,0,0,0,1,10],
-"api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f":[14,0,0,0,1,13],
-"api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236":[14,0,0,0,1,12],
-"api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c":[14,0,0,0,1,14],
-"api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c":[14,0,0,0,1,15],
-"api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a":[14,0,0,0,1,6],
-"api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163":[14,0,0,0,1,7],
-"api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605":[14,0,0,0,1,2],
-"api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5":[14,0,0,0,1,0],
-"api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61":[14,0,0,0,1,8],
-"api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d":[14,0,0,0,1,3],
-"api__msg_8h.html":[14,0,0,3,1,1,1],
-"api__msg_8h.html#a126d82a17c302d883f4131379abd1430":[14,0,0,3,1,1,1,18],
-"api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902":[14,0,0,3,1,1,1,6],
-"api__msg_8h.html#a7402b52416828906a5679828cce37546":[14,0,0,3,1,1,1,11],
-"api__msg_8h.html#a875b82ad129bdec1c6f2c21cbeedc48b":[14,0,0,3,1,1,1,19],
-"api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59":[14,0,0,3,1,1,1,7],
-"api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f":[14,0,0,3,1,1,1,13],
-"api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768":[14,0,0,3,1,1,1,3],
-"api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722":[14,0,0,3,1,1,1,12],
-"api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f":[14,0,0,3,1,1,1,15],
-"api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236":[14,0,0,3,1,1,1,14],
-"api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c":[14,0,0,3,1,1,1,16],
-"api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c":[14,0,0,3,1,1,1,17],
-"api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a":[14,0,0,3,1,1,1,8],
-"api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163":[14,0,0,3,1,1,1,9],
-"api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605":[14,0,0,3,1,1,1,4],
-"api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5":[14,0,0,3,1,1,1,2],
-"api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61":[14,0,0,3,1,1,1,10],
-"api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d":[14,0,0,3,1,1,1,5],
-"apps_2snmp_8h.html":[14,0,0,3,1,0,14],
-"apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16":[14,0,0,3,1,0,14,5],
-"apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926":[14,0,0,3,1,0,14,7],
-"apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f":[14,0,0,3,1,0,14,1],
-"apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43":[14,0,0,3,1,0,14,4],
-"apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee":[14,0,0,3,1,0,14,3],
-"apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019":[14,0,0,3,1,0,14,2],
-"apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186":[14,0,0,3,1,0,14,6],
-"arch_8h.html":[14,0,0,3,1,7],
-"autoip_8c.html":[14,0,0,2,0,0],
-"autoip_8c.html#a11df7a20d52680cd8c1c18fba2b91e9e":[14,0,0,2,0,0,3],
-"autoip_8c.html#a1b4f0c53da17395d9de92a85708a1bb9":[14,0,0,2,0,0,7],
-"autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59":[14,0,0,2,0,0,1],
-"autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d":[14,0,0,2,0,0,8],
-"autoip_8c.html#acaf2793325c60dc4531c21a3fd55c16e":[14,0,0,2,0,0,2],
-"autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43":[14,0,0,2,0,0,0],
-"autoip_8h.html":[14,0,0,3,1,8],
-"autoip_8h.html#a11df7a20d52680cd8c1c18fba2b91e9e":[14,0,0,3,1,8,4],
-"autoip_8h.html#a1b4f0c53da17395d9de92a85708a1bb9":[14,0,0,3,1,8,8],
-"autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d":[14,0,0,3,1,8,9],
-"autoip_8h.html#a8986919a452ab77eec9a199ff6668e92":[14,0,0,3,1,8,2],
-"autoip_8h.html#aaeb4b778fce078bee84144ab50916b15":[14,0,0,3,1,8,1],
-"autoip_8h.html#acaf2793325c60dc4531c21a3fd55c16e":[14,0,0,3,1,8,3],
-"bridgeif_8c.html":[14,0,0,4,1],
-"bridgeif_8h.html":[14,0,0,3,2,1],
-"bridgeif__fdb_8c.html":[14,0,0,4,2],
-"bridgeif__opts_8h.html":[14,0,0,3,2,2],
-"bugs.html":[6],
+"acd_8c.html":[15,0,0,2,0,0],
+"acd_8c.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e":[15,0,0,2,0,0,7],
+"acd_8c.html#aa92e21410d0f0d357ab9166cda24937a":[15,0,0,2,0,0,1],
+"acd_8h.html":[15,0,0,3,1,3],
+"acd_8h.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e":[15,0,0,3,1,3,10],
+"acd_8h.html#aa92e21410d0f0d357ab9166cda24937a":[15,0,0,3,1,3,4],
+"acd_8h.html#aace6da0b0dacd77a9d6bd11f424ffa82":[15,0,0,3,1,3,1],
+"acd_8h.html#abb446404752f56b028eafa8302db955f":[15,0,0,3,1,3,2],
+"altcp_8c.html":[15,0,0,2,2],
+"altcp_8c.html#aa74c9fc358cffeeb7311b4212b0d6fc7":[15,0,0,2,2,2],
+"altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d":[15,0,0,2,2,8],
+"altcp_8h.html":[15,0,0,3,1,4],
+"altcp__alloc_8c.html":[15,0,0,2,3],
+"altcp__priv_8h.html":[15,0,0,3,1,1,0],
+"altcp__priv_8h.html#aa74c9fc358cffeeb7311b4212b0d6fc7":[15,0,0,3,1,1,0,0],
+"altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d":[15,0,0,3,1,1,0,1],
+"altcp__proxyconnect_8c.html":[15,0,0,1,1,0],
+"altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f":[15,0,0,1,1,0,0],
+"altcp__proxyconnect_8c.html#a371cd4386fcbc5f0a0ff6e2fa0408e68":[15,0,0,1,1,0,1],
+"altcp__proxyconnect_8c.html#a389937c9441d4e3f67412603b3d1d236":[15,0,0,1,1,0,2],
+"altcp__proxyconnect_8c.html#aa807e0476719f0ec41b2344d4a0df2f4":[15,0,0,1,1,0,4],
+"altcp__proxyconnect_8c.html#ab0072ee857af8a28b555f14c0f2c9183":[15,0,0,1,1,0,3],
+"altcp__proxyconnect_8h.html":[15,0,0,3,1,0,0],
+"altcp__proxyconnect_8h.html#a371cd4386fcbc5f0a0ff6e2fa0408e68":[15,0,0,3,1,0,0,0],
+"altcp__proxyconnect_8h.html#a389937c9441d4e3f67412603b3d1d236":[15,0,0,3,1,0,0,1],
+"altcp__proxyconnect_8h.html#aa807e0476719f0ec41b2344d4a0df2f4":[15,0,0,3,1,0,0,3],
+"altcp__proxyconnect_8h.html#ab0072ee857af8a28b555f14c0f2c9183":[15,0,0,3,1,0,0,2],
+"altcp__tcp_8c.html":[15,0,0,2,4],
+"altcp__tcp_8c.html#a77582c93bb8a0aa2719e86b8c8505e8a":[15,0,0,2,4,0],
+"altcp__tcp_8h.html":[15,0,0,3,1,5],
+"altcp__tcp_8h.html#a77582c93bb8a0aa2719e86b8c8505e8a":[15,0,0,3,1,5,0],
+"altcp__tls_8h.html":[15,0,0,3,1,6],
+"altcp__tls__mbedtls_8c.html":[15,0,0,1,0,0],
+"altcp__tls__mbedtls__mem_8c.html":[15,0,0,1,0,1],
+"altcp__tls__mbedtls__mem_8h.html":[15,0,0,1,0,2],
+"altcp__tls__mbedtls__opts_8h.html":[15,0,0,3,1,0,1],
+"altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308":[15,0,0,3,1,0,1,2],
+"altcp__tls__mbedtls__opts_8h.html#a12aba61586bd71cb42b0925b9211b366":[15,0,0,3,1,0,1,0],
+"altcp__tls__mbedtls__opts_8h.html#a1c8a3f37f8ede74835b03eedcdc41973":[15,0,0,3,1,0,1,4],
+"altcp__tls__mbedtls__opts_8h.html#a4917dbc00f43f88eb703c8ba89bd37f6":[15,0,0,3,1,0,1,6],
+"altcp__tls__mbedtls__opts_8h.html#a66eff71890153166578b0b78d780ac50":[15,0,0,3,1,0,1,7],
+"altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6":[15,0,0,3,1,0,1,5],
+"altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989":[15,0,0,3,1,0,1,1],
+"altcp__tls__mbedtls__opts_8h.html#abd6b53a101f046337a4d77c749dbab66":[15,0,0,3,1,0,1,8],
+"altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639":[15,0,0,3,1,0,1,10],
+"altcp__tls__mbedtls__opts_8h.html#ad8561bbfabb4ec81ad1c4d7304d16bb5":[15,0,0,3,1,0,1,3],
+"altcp__tls__mbedtls__opts_8h.html#ae3dbc4de0fc53bcda746c9dfd5618d3b":[15,0,0,3,1,0,1,9],
+"altcp__tls__mbedtls__structs_8h.html":[15,0,0,1,0,3],
+"annotated.html":[14,0],
+"api_8h.html":[15,0,0,3,1,7],
+"api_8h.html#a04785274634a5b504c760731c2e70725":[15,0,0,3,1,7,16],
+"api_8h.html#a24d62a2a03ba421fcf2bdce1ea89b949":[15,0,0,3,1,7,3],
+"api_8h.html#a28430d1d86733f1bf98dc31305c42104":[15,0,0,3,1,7,32],
+"api_8h.html#a2c6c9c1869f443c5ec7b31180a44fada":[15,0,0,3,1,7,22],
+"api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016":[15,0,0,3,1,7,17],
+"api_8h.html#a3ce590f58be8f60dbde361920863b26d":[15,0,0,3,1,7,2],
+"api_8h.html#a42711660e5030bc0dff779f3cea4178e":[15,0,0,3,1,7,37],
+"api_8h.html#a505c3b8e400babf9681e09c945b7f421":[15,0,0,3,1,7,43],
+"api_8h.html#a5789f0030b895b40625a74deb5a1092f":[15,0,0,3,1,7,12],
+"api_8h.html#a5c6ded2c082de1536019b197a0a912db":[15,0,0,3,1,7,21],
+"api_8h.html#a60892e4eb139f10157847fea4266bf5b":[15,0,0,3,1,7,6],
+"api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1":[15,0,0,3,1,7,18],
+"api_8h.html#a6a578dd5b55e4457e0d23574ec9c55bb":[15,0,0,3,1,7,15],
+"api_8h.html#a70bb861ee643b60ee402fd48f581f58d":[15,0,0,3,1,7,5],
+"api_8h.html#a7d6e84458eec796b0b0ce1bb247f323f":[15,0,0,3,1,7,11],
+"api_8h.html#a805a90b546c5a149f04782351633979b":[15,0,0,3,1,7,42],
+"api_8h.html#a992b4fe8a855fd94861738f7260d0a32":[15,0,0,3,1,7,48],
+"api_8h.html#a9d791955a4256a0589a3844e4e6f0f9c":[15,0,0,3,1,7,4],
+"api_8h.html#abee57aa0ba63e35742d411bc5224900a":[15,0,0,3,1,7,8],
+"api_8h.html#ac0298c287dc3823047c378c014ff1eb0":[15,0,0,3,1,7,10],
+"api_8h.html#ae9307baa49245990c8c4517bb4e8d47b":[15,0,0,3,1,7,19],
+"api_8h.html#af722260882d14c49afb765293ffb0155":[15,0,0,3,1,7,20],
+"api_8h.html#af77be7590d3712259e78103c1dddf63f":[15,0,0,3,1,7,7],
+"api__lib_8c.html":[15,0,0,0,0],
+"api__lib_8c.html#a28430d1d86733f1bf98dc31305c42104":[15,0,0,0,0,8],
+"api__lib_8c.html#a42711660e5030bc0dff779f3cea4178e":[15,0,0,0,0,13],
+"api__lib_8c.html#a505c3b8e400babf9681e09c945b7f421":[15,0,0,0,0,19],
+"api__lib_8c.html#a805a90b546c5a149f04782351633979b":[15,0,0,0,0,18],
+"api__lib_8c.html#a992b4fe8a855fd94861738f7260d0a32":[15,0,0,0,0,24],
+"api__msg_8c.html":[15,0,0,0,1],
+"api__msg_8c.html#a126d82a17c302d883f4131379abd1430":[15,0,0,0,1,16],
+"api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902":[15,0,0,0,1,4],
+"api__msg_8c.html#a7402b52416828906a5679828cce37546":[15,0,0,0,1,9],
+"api__msg_8c.html#a875b82ad129bdec1c6f2c21cbeedc48b":[15,0,0,0,1,17],
+"api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59":[15,0,0,0,1,5],
+"api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f":[15,0,0,0,1,11],
+"api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768":[15,0,0,0,1,1],
+"api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722":[15,0,0,0,1,10],
+"api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f":[15,0,0,0,1,13],
+"api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236":[15,0,0,0,1,12],
+"api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c":[15,0,0,0,1,14],
+"api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c":[15,0,0,0,1,15],
+"api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a":[15,0,0,0,1,6],
+"api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163":[15,0,0,0,1,7],
+"api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605":[15,0,0,0,1,2],
+"api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5":[15,0,0,0,1,0],
+"api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61":[15,0,0,0,1,8],
+"api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d":[15,0,0,0,1,3],
+"api__msg_8h.html":[15,0,0,3,1,1,1],
+"api__msg_8h.html#a126d82a17c302d883f4131379abd1430":[15,0,0,3,1,1,1,18],
+"api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902":[15,0,0,3,1,1,1,6],
+"api__msg_8h.html#a7402b52416828906a5679828cce37546":[15,0,0,3,1,1,1,11],
+"api__msg_8h.html#a875b82ad129bdec1c6f2c21cbeedc48b":[15,0,0,3,1,1,1,19],
+"api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59":[15,0,0,3,1,1,1,7],
+"api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f":[15,0,0,3,1,1,1,13],
+"api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768":[15,0,0,3,1,1,1,3],
+"api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722":[15,0,0,3,1,1,1,12],
+"api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f":[15,0,0,3,1,1,1,15],
+"api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236":[15,0,0,3,1,1,1,14],
+"api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c":[15,0,0,3,1,1,1,16],
+"api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c":[15,0,0,3,1,1,1,17],
+"api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a":[15,0,0,3,1,1,1,8],
+"api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163":[15,0,0,3,1,1,1,9],
+"api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605":[15,0,0,3,1,1,1,4],
+"api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5":[15,0,0,3,1,1,1,2],
+"api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61":[15,0,0,3,1,1,1,10],
+"api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d":[15,0,0,3,1,1,1,5],
+"apps_2snmp_8h.html":[15,0,0,3,1,0,16],
+"apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16":[15,0,0,3,1,0,16,5],
+"apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926":[15,0,0,3,1,0,16,7],
+"apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f":[15,0,0,3,1,0,16,1],
+"apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43":[15,0,0,3,1,0,16,4],
+"apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee":[15,0,0,3,1,0,16,3],
+"apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019":[15,0,0,3,1,0,16,2],
+"apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186":[15,0,0,3,1,0,16,6],
+"arch_8h.html":[15,0,0,3,1,8],
+"autoip_8c.html":[15,0,0,2,0,1],
+"autoip_8c.html#a6de97b7dcd98f9039d5c1ad11c257d62":[15,0,0,2,0,1,7],
+"autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43":[15,0,0,2,0,1,0],
+"autoip_8c.html#af2a36aee96cbdf8f4a8f1e69c91ff425":[15,0,0,2,0,1,2],
+"autoip_8c.html#af93544c49f2c24b95a3981351d023056":[15,0,0,2,0,1,1],
+"autoip_8h.html":[15,0,0,3,1,9],
+"autoip_8h.html#a6de97b7dcd98f9039d5c1ad11c257d62":[15,0,0,3,1,9,7],
+"autoip_8h.html#af2a36aee96cbdf8f4a8f1e69c91ff425":[15,0,0,3,1,9,2],
+"autoip_8h.html#af93544c49f2c24b95a3981351d023056":[15,0,0,3,1,9,1],
+"bridgeif_8c.html":[15,0,0,4,1],
+"bridgeif_8h.html":[15,0,0,3,2,1],
+"bridgeif__fdb_8c.html":[15,0,0,4,2],
+"bridgeif__opts_8h.html":[15,0,0,3,2,2],
+"bugs.html":[7],
 "changelog.html":[2],
-"compat_2posix_2arpa_2inet_8h.html":[14,0,0,3,0,0,0,0],
-"compat_2posix_2netdb_8h.html":[14,0,0,3,0,0,3],
-"compat_2stdc_2errno_8h.html":[14,0,0,3,0,1,0],
+"cmake.html":[4],
+"compat_2posix_2arpa_2inet_8h.html":[15,0,0,3,0,0,0,0],
+"compat_2posix_2netdb_8h.html":[15,0,0,3,0,0,3],
+"compat_2stdc_2errno_8h.html":[15,0,0,3,0,1,0],
 "contrib.html":[3],
-"debug_8h.html":[14,0,0,3,1,9],
-"debug_8h.html#a957d947c94fda9b85d4aee0aab72952a":[14,0,0,3,1,9,10],
-"def_8c.html":[14,0,0,2,5],
-"def_8c.html#a14f94347a5b9b9e3602705b75b7ae524":[14,0,0,2,5,0],
-"def_8c.html#ad637280639de4066392e6b5614fa3e56":[14,0,0,2,5,1],
-"def_8h.html":[14,0,0,3,1,10],
-"def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37":[14,0,0,3,1,10,1],
-"def_8h.html#ac49eb25570806fb51c329d4f86302cc2":[14,0,0,3,1,10,2],
-"def_8h.html#acf56d3da92a0a7a8a62a617e793e948c":[14,0,0,3,1,10,0],
-"deprecated.html":[11],
-"dhcp6_8c.html":[14,0,0,2,1,0],
-"dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d":[14,0,0,2,1,0,7],
-"dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0":[14,0,0,2,1,0,8],
-"dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a":[14,0,0,2,1,0,0],
-"dhcp6_8c.html#af0f47aac3c04c84a7143fa6925e9fdba":[14,0,0,2,1,0,5],
-"dhcp6_8h.html":[14,0,0,3,1,12],
-"dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d":[14,0,0,3,1,12,8],
-"dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3":[14,0,0,3,1,12,0],
-"dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba":[14,0,0,3,1,12,6],
-"dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f":[14,0,0,3,1,12,1],
-"dhcp_8c.html":[14,0,0,2,0,1],
-"dhcp_8c.html#a04f3824720223c439165243527906002":[14,0,0,2,0,1,9],
-"dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc":[14,0,0,2,0,1,17],
-"dhcp_8c.html#a1fc0a94e0b94f13c5d302018f7ecb535":[14,0,0,2,0,1,4],
-"dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f":[14,0,0,2,0,1,18],
-"dhcp_8c.html#a601d97faa24fa7289244bb452f052045":[14,0,0,2,0,1,7],
-"dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b":[14,0,0,2,0,1,1],
-"dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0":[14,0,0,2,0,1,3],
-"dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab":[14,0,0,2,0,1,2],
-"dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835":[14,0,0,2,0,1,0],
-"dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb":[14,0,0,2,0,1,6],
-"dhcp_8c.html#ae24a2529372218327ab9cb6592041c85":[14,0,0,2,0,1,16],
-"dhcp_8h.html":[14,0,0,3,1,11],
-"dhcp_8h.html#a04f3824720223c439165243527906002":[14,0,0,3,1,11,9],
-"dhcp_8h.html#a1fc0a94e0b94f13c5d302018f7ecb535":[14,0,0,3,1,11,4],
-"dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e":[14,0,0,3,1,11,1],
-"dhcp_8h.html#a601d97faa24fa7289244bb452f052045":[14,0,0,3,1,11,7],
-"dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f":[14,0,0,3,1,11,2],
-"dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc":[14,0,0,3,1,11,3],
-"dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb":[14,0,0,3,1,11,6],
-"dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6":[14,0,0,3,1,11,0],
-"dhcp_8h.html#ae24a2529372218327ab9cb6592041c85":[14,0,0,3,1,11,16],
-"dir_149963277126306875d8bfe8322084f3.html":[14,0,0,1,6],
-"dir_1cb496c74bbaf54ecc99133e1c434e0c.html":[14,0,0,1,0],
-"dir_1e445e767c368c70d58af8a0b7552719.html":[14,0,0,3,0],
-"dir_34adf996f92d0eef72c45a7167a966e6.html":[14,0,0,1,1],
-"dir_403e202f99dba154c685be932a8e0c34.html":[14,0,0,1,9],
-"dir_439fcb6f68ea6a3dc0078b338960fd8f.html":[14,0,0,3,2,0],
-"dir_460c501b2432fc107adcb38111835e48.html":[14,0,0,3,1,1],
-"dir_4b846c6b6971d2800eff93d75504accd.html":[14,0,0,1,2],
-"dir_4e6b3cf33a61b6caac9c8ac30c866f37.html":[14,0,0,3,1],
-"dir_53adf0b982dc8545998aae3f283a5a58.html":[14,0,0,1],
-"dir_56d2b6ddbb44630b0fd661af6321f9c4.html":[14,0,0,1,5],
-"dir_68267d1309a1af8e8297ef4c3efbcdba.html":[14,0,0],
-"dir_6aa605ad180e7b166767bf4f86888ab5.html":[14,0,0,4,0],
-"dir_6b1b06896a870ebfb9c854c4c71f4ff5.html":[14,0,0,3,0,0,0],
-"dir_8da39adb2a11af660bdd7075b7323870.html":[14,0,0,3,0,0,2],
-"dir_900e6f7ff90690cb8edb53323dd38d80.html":[14,0,0,4],
-"dir_a32e111ee6805cfc63488fd2d37f2390.html":[14,0,0,2,0],
-"dir_aebb8dcc11953d78e620bbef0b9e2183.html":[14,0,0,2],
-"dir_b0856f6b0d80ccb263b2f415c91f9e17.html":[14,0,0,3],
-"dir_b42baff89a1adc9a57da7decb1835b6b.html":[14,0,0,3,0,1],
-"dir_c62aba36f6630fea5cd7fe1c941850d4.html":[14,0,0,3,0,0,1],
-"dir_c9a67764bf8a12cf6b427bb859cbcd0b.html":[14,0,0,3,2],
-"dir_da61e3e9a357748887e3ca8d7c5a0c16.html":[14,0,0,0],
-"dir_da9c6f43d3cd00be3de224bac907a425.html":[14,0,0,2,1],
-"dir_dfacd4b005f6a743295cd1d76eff7420.html":[14,0,0,1,4],
-"dir_e7856a6aeaebbc124e80ad9550aedba4.html":[14,0,0,1,8],
-"dir_f9284811ac594eafdc3134d5f8b945cb.html":[14,0,0,3,1,0],
-"dir_fa0f2b7ac208069fc8d28c28af349d8d.html":[14,0,0,3,1,2],
-"dir_fb3f7e43f39ddb210bd1444e66d055f1.html":[14,0,0,1,7],
-"dir_fe219fca207b878205c0dd92278d118b.html":[14,0,0,3,0,0],
-"dir_febe3a637907666e8b25366ae60efc0b.html":[14,0,0,1,3],
-"dns_8c.html":[14,0,0,2,6],
-"dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2":[14,0,0,2,6,4],
-"dns_8c.html#a9209c204996270af5cfdfd6e391267a1":[14,0,0,2,6,6],
-"dns_8c.html#a9389f374ec66488aa4f42a652583f533":[14,0,0,2,6,12],
-"dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0":[14,0,0,2,6,5],
-"dns_8c.html#adb31c3b6180773bd11f914c327f209cf":[14,0,0,2,6,10],
-"dns_8h.html":[14,0,0,3,1,13],
-"dns_8h.html#a464a7435c4c00735af59033d2acd83bb":[14,0,0,3,1,13,0],
-"dns_8h.html#a9389f374ec66488aa4f42a652583f533":[14,0,0,3,1,13,7],
-"dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae":[14,0,0,3,1,13,1],
-"dns_8h.html#adb31c3b6180773bd11f914c327f209cf":[14,0,0,3,1,13,5],
-"err_8c.html":[14,0,0,0,2],
-"err_8h.html":[14,0,0,3,1,14],
-"etharp_8c.html":[14,0,0,2,0,2],
-"etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9":[14,0,0,2,0,2,1],
-"etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c":[14,0,0,2,0,2,5],
-"etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d":[14,0,0,2,0,2,8],
-"etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15":[14,0,0,2,0,2,10],
-"etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6":[14,0,0,2,0,2,7],
-"etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26":[14,0,0,2,0,2,11],
-"etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9":[14,0,0,2,0,2,2],
-"etharp_8c.html#ab93df7ccb26496100d45137541e863c8":[14,0,0,2,0,2,6],
-"etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a":[14,0,0,2,0,2,0],
-"etharp_8c.html#ae180772e31346a0afeb707ad172dd19c":[14,0,0,2,0,2,9],
-"etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05":[14,0,0,2,0,2,4],
-"etharp_8c.html#ae95dee9363e6d3417298e07380b2d383":[14,0,0,2,0,2,3],
-"ethernet_8c.html":[14,0,0,4,3],
-"ethip6_8c.html":[14,0,0,2,1,1],
-"ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd":[14,0,0,2,1,1,0],
-"ethip6_8h.html":[14,0,0,3,1,17],
-"ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd":[14,0,0,3,1,17,0],
-"files.html":[14,0],
-"functions.html":[13,1,0],
-"functions.html":[13,1,0,0],
-"functions_a.html":[13,1,0,1],
-"functions_b.html":[13,1,0,2]
+"debug_8h.html":[15,0,0,3,1,10],
+"debug_8h.html#a957d947c94fda9b85d4aee0aab72952a":[15,0,0,3,1,10,10],
+"def_8c.html":[15,0,0,2,5],
+"def_8c.html#a14f94347a5b9b9e3602705b75b7ae524":[15,0,0,2,5,0],
+"def_8c.html#ad637280639de4066392e6b5614fa3e56":[15,0,0,2,5,1],
+"def_8h.html":[15,0,0,3,1,11],
+"def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37":[15,0,0,3,1,11,1],
+"def_8h.html#ac49eb25570806fb51c329d4f86302cc2":[15,0,0,3,1,11,2],
+"def_8h.html#acf56d3da92a0a7a8a62a617e793e948c":[15,0,0,3,1,11,0],
+"deprecated.html":[12],
+"dhcp6_8c.html":[15,0,0,2,1,0],
+"dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d":[15,0,0,2,1,0,7],
+"dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0":[15,0,0,2,1,0,8],
+"dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a":[15,0,0,2,1,0,0],
+"dhcp6_8c.html#af0f47aac3c04c84a7143fa6925e9fdba":[15,0,0,2,1,0,5],
+"dhcp6_8h.html":[15,0,0,3,1,13],
+"dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d":[15,0,0,3,1,13,8],
+"dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3":[15,0,0,3,1,13,0],
+"dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba":[15,0,0,3,1,13,6],
+"dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f":[15,0,0,3,1,13,1],
+"dhcp_8c.html":[15,0,0,2,0,2],
+"dhcp_8c.html#a2fd33722859054ea932ff05ff62dedaa":[15,0,0,2,0,2,10],
+"dhcp_8c.html#a33f306da575f8a437996d073b374df82":[15,0,0,2,0,2,4],
+"dhcp_8c.html#a601d97faa24fa7289244bb452f052045":[15,0,0,2,0,2,8],
+"dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b":[15,0,0,2,0,2,2],
+"dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0":[15,0,0,2,0,2,5],
+"dhcp_8c.html#aa29d020558b37b29d5d5ae50dfeb0c88":[15,0,0,2,0,2,0],
+"dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab":[15,0,0,2,0,2,3],
+"dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835":[15,0,0,2,0,2,1],
+"dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb":[15,0,0,2,0,2,7],
+"dhcp_8c.html#ae24a2529372218327ab9cb6592041c85":[15,0,0,2,0,2,17],
+"dhcp_8h.html":[15,0,0,3,1,12],
+"dhcp_8h.html#a2fd33722859054ea932ff05ff62dedaa":[15,0,0,3,1,12,9],
+"dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e":[15,0,0,3,1,12,1],
+"dhcp_8h.html#a601d97faa24fa7289244bb452f052045":[15,0,0,3,1,12,7],
+"dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f":[15,0,0,3,1,12,2],
+"dhcp_8h.html#aa85d661c7e160921c0497e7baa892b67":[15,0,0,3,1,12,4],
+"dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc":[15,0,0,3,1,12,3],
+"dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb":[15,0,0,3,1,12,6],
+"dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6":[15,0,0,3,1,12,0],
+"dhcp_8h.html#ae24a2529372218327ab9cb6592041c85":[15,0,0,3,1,12,16],
+"dir_149963277126306875d8bfe8322084f3.html":[15,0,0,1,6],
+"dir_1cb496c74bbaf54ecc99133e1c434e0c.html":[15,0,0,1,0],
+"dir_1e445e767c368c70d58af8a0b7552719.html":[15,0,0,3,0],
+"dir_34adf996f92d0eef72c45a7167a966e6.html":[15,0,0,1,1],
+"dir_403e202f99dba154c685be932a8e0c34.html":[15,0,0,1,9],
+"dir_439fcb6f68ea6a3dc0078b338960fd8f.html":[15,0,0,3,2,0],
+"dir_460c501b2432fc107adcb38111835e48.html":[15,0,0,3,1,1],
+"dir_4b846c6b6971d2800eff93d75504accd.html":[15,0,0,1,2],
+"dir_4e6b3cf33a61b6caac9c8ac30c866f37.html":[15,0,0,3,1],
+"dir_53adf0b982dc8545998aae3f283a5a58.html":[15,0,0,1],
+"dir_56d2b6ddbb44630b0fd661af6321f9c4.html":[15,0,0,1,5],
+"dir_68267d1309a1af8e8297ef4c3efbcdba.html":[15,0,0],
+"dir_6aa605ad180e7b166767bf4f86888ab5.html":[15,0,0,4,0],
+"dir_6b1b06896a870ebfb9c854c4c71f4ff5.html":[15,0,0,3,0,0,0],
+"dir_8da39adb2a11af660bdd7075b7323870.html":[15,0,0,3,0,0,2],
+"dir_900e6f7ff90690cb8edb53323dd38d80.html":[15,0,0,4],
+"dir_a32e111ee6805cfc63488fd2d37f2390.html":[15,0,0,2,0],
+"dir_aebb8dcc11953d78e620bbef0b9e2183.html":[15,0,0,2],
+"dir_b0856f6b0d80ccb263b2f415c91f9e17.html":[15,0,0,3],
+"dir_b42baff89a1adc9a57da7decb1835b6b.html":[15,0,0,3,0,1],
+"dir_c62aba36f6630fea5cd7fe1c941850d4.html":[15,0,0,3,0,0,1],
+"dir_c9a67764bf8a12cf6b427bb859cbcd0b.html":[15,0,0,3,2],
+"dir_da61e3e9a357748887e3ca8d7c5a0c16.html":[15,0,0,0],
+"dir_da9c6f43d3cd00be3de224bac907a425.html":[15,0,0,2,1],
+"dir_dfacd4b005f6a743295cd1d76eff7420.html":[15,0,0,1,4],
+"dir_e7856a6aeaebbc124e80ad9550aedba4.html":[15,0,0,1,8],
+"dir_f9284811ac594eafdc3134d5f8b945cb.html":[15,0,0,3,1,0],
+"dir_fa0f2b7ac208069fc8d28c28af349d8d.html":[15,0,0,3,1,2],
+"dir_fb3f7e43f39ddb210bd1444e66d055f1.html":[15,0,0,1,7],
+"dir_fe219fca207b878205c0dd92278d118b.html":[15,0,0,3,0,0],
+"dir_febe3a637907666e8b25366ae60efc0b.html":[15,0,0,1,3],
+"dns_8c.html":[15,0,0,2,6],
+"dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2":[15,0,0,2,6,4],
+"dns_8c.html#a9209c204996270af5cfdfd6e391267a1":[15,0,0,2,6,6],
+"dns_8c.html#a9389f374ec66488aa4f42a652583f533":[15,0,0,2,6,12],
+"dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0":[15,0,0,2,6,5],
+"dns_8c.html#adb31c3b6180773bd11f914c327f209cf":[15,0,0,2,6,10],
+"dns_8h.html":[15,0,0,3,1,14],
+"dns_8h.html#a464a7435c4c00735af59033d2acd83bb":[15,0,0,3,1,14,0],
+"dns_8h.html#a9389f374ec66488aa4f42a652583f533":[15,0,0,3,1,14,7],
+"dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae":[15,0,0,3,1,14,1],
+"dns_8h.html#adb31c3b6180773bd11f914c327f209cf":[15,0,0,3,1,14,5],
+"err_8c.html":[15,0,0,0,2],
+"err_8h.html":[15,0,0,3,1,15],
+"etharp_8c.html":[15,0,0,2,0,3],
+"etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9":[15,0,0,2,0,3,1],
+"etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c":[15,0,0,2,0,3,7],
+"etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d":[15,0,0,2,0,3,10],
+"etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15":[15,0,0,2,0,3,12],
+"etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6":[15,0,0,2,0,3,9],
+"etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26":[15,0,0,2,0,3,13],
+"etharp_8c.html#a7c41ba8b145fa4d06f8d6af3df44c4ff":[15,0,0,2,0,3,4],
+"etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9":[15,0,0,2,0,3,2],
+"etharp_8c.html#aac7d5048a81ef1c63b18d769700f4899":[15,0,0,2,0,3,5],
+"etharp_8c.html#ab93df7ccb26496100d45137541e863c8":[15,0,0,2,0,3,8],
+"etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a":[15,0,0,2,0,3,0],
+"etharp_8c.html#ae180772e31346a0afeb707ad172dd19c":[15,0,0,2,0,3,11],
+"etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05":[15,0,0,2,0,3,6],
+"etharp_8c.html#ae95dee9363e6d3417298e07380b2d383":[15,0,0,2,0,3,3],
+"ethernet_8c.html":[15,0,0,4,3],
+"ethip6_8c.html":[15,0,0,2,1,1],
+"ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd":[15,0,0,2,1,1,0],
+"ethip6_8h.html":[15,0,0,3,1,18]
 };
diff --git a/doc/doxygen/output/html/navtreeindex1.js b/doc/doxygen/output/html/navtreeindex1.js
index fe3cd49..f71ac01 100644
--- a/doc/doxygen/output/html/navtreeindex1.js
+++ b/doc/doxygen/output/html/navtreeindex1.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX1 =
 {
-"functions_c.html":[13,1,0,3],
-"functions_d.html":[13,1,0,4],
-"functions_e.html":[13,1,0,5],
-"functions_f.html":[13,1,0,6],
-"functions_g.html":[13,1,0,7],
-"functions_h.html":[13,1,0,8],
-"functions_i.html":[13,1,0,9],
-"functions_j.html":[13,1,0,10],
-"functions_k.html":[13,1,0,11],
-"functions_l.html":[13,1,0,12],
-"functions_m.html":[13,1,0,13],
-"functions_n.html":[13,1,0,14],
-"functions_o.html":[13,1,0,15],
-"functions_p.html":[13,1,0,16],
-"functions_q.html":[13,1,0,17],
-"functions_r.html":[13,1,0,18],
-"functions_s.html":[13,1,0,19],
-"functions_t.html":[13,1,0,20],
-"functions_u.html":[13,1,0,21],
-"functions_v.html":[13,1,0,22],
-"functions_vars.html":[13,1,1],
-"functions_vars.html":[13,1,1,0],
-"functions_vars_a.html":[13,1,1,1],
-"functions_vars_b.html":[13,1,1,2],
-"functions_vars_c.html":[13,1,1,3],
-"functions_vars_d.html":[13,1,1,4],
-"functions_vars_e.html":[13,1,1,5],
-"functions_vars_f.html":[13,1,1,6],
-"functions_vars_g.html":[13,1,1,7],
-"functions_vars_h.html":[13,1,1,8],
-"functions_vars_i.html":[13,1,1,9],
-"functions_vars_j.html":[13,1,1,10],
-"functions_vars_k.html":[13,1,1,11],
-"functions_vars_l.html":[13,1,1,12],
-"functions_vars_m.html":[13,1,1,13],
-"functions_vars_n.html":[13,1,1,14],
-"functions_vars_o.html":[13,1,1,15],
-"functions_vars_p.html":[13,1,1,16],
-"functions_vars_q.html":[13,1,1,17],
-"functions_vars_r.html":[13,1,1,18],
-"functions_vars_s.html":[13,1,1,19],
-"functions_vars_t.html":[13,1,1,20],
-"functions_vars_u.html":[13,1,1,21],
-"functions_vars_v.html":[13,1,1,22],
-"functions_vars_w.html":[13,1,1,23],
-"functions_vars_z.html":[13,1,1,24],
-"functions_w.html":[13,1,0,23],
-"functions_z.html":[13,1,0,24],
-"globals.html":[14,1,0],
-"globals.html":[14,1,0,0],
-"globals_b.html":[14,1,0,1],
-"globals_c.html":[14,1,0,2],
-"globals_d.html":[14,1,0,3],
-"globals_defs.html":[14,1,6],
-"globals_defs.html":[14,1,6,0],
-"globals_defs_b.html":[14,1,6,1],
-"globals_defs_c.html":[14,1,6,2],
-"globals_defs_d.html":[14,1,6,3],
-"globals_defs_e.html":[14,1,6,4],
-"globals_defs_f.html":[14,1,6,5],
-"globals_defs_h.html":[14,1,6,6],
-"globals_defs_i.html":[14,1,6,7],
-"globals_defs_l.html":[14,1,6,8],
-"globals_defs_m.html":[14,1,6,9],
-"globals_defs_n.html":[14,1,6,10],
-"globals_defs_p.html":[14,1,6,11],
-"globals_defs_r.html":[14,1,6,12],
-"globals_defs_s.html":[14,1,6,13],
-"globals_defs_t.html":[14,1,6,14],
-"globals_defs_u.html":[14,1,6,15],
-"globals_defs_z.html":[14,1,6,16],
-"globals_e.html":[14,1,0,4],
-"globals_enum.html":[14,1,4],
-"globals_eval.html":[14,1,5],
-"globals_f.html":[14,1,0,5],
-"globals_func.html":[14,1,1],
-"globals_func.html":[14,1,1,0],
-"globals_func_b.html":[14,1,1,1],
-"globals_func_d.html":[14,1,1,2],
-"globals_func_e.html":[14,1,1,3],
-"globals_func_h.html":[14,1,1,4],
-"globals_func_i.html":[14,1,1,5],
-"globals_func_l.html":[14,1,1,6],
-"globals_func_m.html":[14,1,1,7],
-"globals_func_n.html":[14,1,1,8],
-"globals_func_p.html":[14,1,1,9],
-"globals_func_r.html":[14,1,1,10],
-"globals_func_s.html":[14,1,1,11],
-"globals_func_t.html":[14,1,1,12],
-"globals_func_u.html":[14,1,1,13],
-"globals_func_z.html":[14,1,1,14],
-"globals_h.html":[14,1,0,6],
-"globals_i.html":[14,1,0,7],
-"globals_l.html":[14,1,0,8],
-"globals_m.html":[14,1,0,9],
-"globals_n.html":[14,1,0,10],
-"globals_p.html":[14,1,0,11],
-"globals_r.html":[14,1,0,12],
-"globals_s.html":[14,1,0,13],
-"globals_t.html":[14,1,0,14],
-"globals_type.html":[14,1,3],
-"globals_u.html":[14,1,0,15],
-"globals_vars.html":[14,1,2],
-"globals_z.html":[14,1,0,16],
-"group__altcp.html":[12,2,0,0,0],
-"group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319":[12,2,0,0,0,19],
-"group__altcp.html#ga197a33af038556a04d8f27c7033d771f":[12,2,0,0,0,3],
-"group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0":[12,2,0,0,0,14],
-"group__altcp.html#ga4329798afdf3709c789a2ee060ee3993":[12,2,0,0,0,5],
-"group__altcp.html#ga485b248680f73b9876d8674029c5157c":[12,2,0,0,0,4],
-"group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5":[12,2,0,0,0,18],
-"group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5":[12,2,0,0,0,21],
-"group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6":[12,2,0,0,0,13],
-"group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908":[12,2,0,0,0,10],
-"group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f":[12,2,0,0,0,8],
-"group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9":[12,2,0,0,0,2],
-"group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab":[12,2,0,0,0,1],
-"group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71":[12,2,0,0,0,15],
-"group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d":[12,2,0,0,0,22],
-"group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c":[12,2,0,0,0,20],
-"group__altcp.html#gab2b228c77c827fb14bfc513171c79f47":[12,2,0,0,0,17],
-"group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d":[12,2,0,0,0,12],
-"group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83":[12,2,0,0,0,16],
-"group__altcp.html#gadc76a1f3b2448559dc87da1b33291644":[12,2,0,0,0,7],
-"group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08":[12,2,0,0,0,9],
-"group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492":[12,2,0,0,0,6],
-"group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd":[12,2,0,0,0,11],
-"group__altcp__api.html":[12,2,0,0],
-"group__altcp__tls.html":[12,2,0,0,0,0],
-"group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597":[12,2,0,0,0,0,4],
-"group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e":[12,2,0,0,0,0,6],
-"group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2":[12,2,0,0,0,0,8],
-"group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170":[12,2,0,0,0,0,3],
-"group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7":[12,2,0,0,0,0,2],
-"group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145":[12,2,0,0,0,0,7],
-"group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c":[12,2,0,0,0,0,10],
-"group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc":[12,2,0,0,0,0,0],
-"group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8":[12,2,0,0,0,0,9],
-"group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e":[12,2,0,0,0,0,1],
-"group__altcp__tls.html#gaf6ed13271394371cc89d70ef5128c411":[12,2,0,0,0,0,5],
-"group__api.html":[12,2],
-"group__apps.html":[12,4],
-"group__autoip.html":[12,2,0,2,0,0],
-"group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8":[12,2,0,2,0,0,1],
-"group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90":[12,2,0,2,0,0,0],
-"group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4":[12,2,0,2,0,0,2],
-"group__bridgeif.html":[12,3,0],
-"group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c":[12,3,0,9],
-"group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f":[12,3,0,3],
-"group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77":[12,3,0,6],
-"group__bridgeif.html#ga61c8f232a5907f3662157746e71d35cc":[12,3,0,5],
-"group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8":[12,3,0,8],
-"group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741":[12,3,0,4],
-"group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666":[12,3,0,7],
-"group__bridgeif__fdb.html":[12,3,0,1],
-"group__bridgeif__fdb.html#ga137fdeb4939e8fb889b10a97ea479d3a":[12,3,0,1,1],
-"group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750":[12,3,0,1,0],
-"group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39":[12,3,0,1,2],
-"group__bridgeif__opts.html":[12,3,0,0],
-"group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d":[12,3,0,0,4],
-"group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414":[12,3,0,0,3],
-"group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730":[12,3,0,0,1],
-"group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73":[12,3,0,0,0],
-"group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a":[12,3,0,0,2],
-"group__callbackstyle__api.html":[12,2,0],
-"group__compiler__abstraction.html":[12,0,2,4],
-"group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1":[12,0,2,4,11],
-"group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3":[12,0,2,4,0],
-"group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e":[12,0,2,4,5],
-"group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2":[12,0,2,4,24],
-"group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446":[12,0,2,4,12],
-"group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e":[12,0,2,4,20],
-"group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d":[12,0,2,4,10],
-"group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef":[12,0,2,4,25],
-"group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373":[12,0,2,4,8],
-"group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0":[12,0,2,4,3],
-"group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a":[12,0,2,4,16],
-"group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800":[12,0,2,4,7],
-"group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf":[12,0,2,4,18],
-"group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96":[12,0,2,4,19],
-"group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a":[12,0,2,4,17],
-"group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0":[12,0,2,4,13],
-"group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade":[12,0,2,4,15],
-"group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72":[12,0,2,4,2],
-"group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc":[12,0,2,4,4],
-"group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62":[12,0,2,4,22],
-"group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0":[12,0,2,4,21],
-"group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8":[12,0,2,4,1],
-"group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7":[12,0,2,4,23],
-"group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b":[12,0,2,4,14],
-"group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805":[12,0,2,4,9],
-"group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18":[12,0,2,4,6],
-"group__debugging__levels.html":[12,0,4,0,2,0],
-"group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c":[12,0,4,0,2,0,3],
-"group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741":[12,0,4,0,2,0,8],
-"group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96":[12,0,4,0,2,0,5],
-"group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0":[12,0,4,0,2,0,0],
-"group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87":[12,0,4,0,2,0,2],
-"group__debugging__levels.html#ga988147559b78642ac881815b66023646":[12,0,4,0,2,0,9],
-"group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e":[12,0,4,0,2,0,7],
-"group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b":[12,0,4,0,2,0,4],
-"group__debugging__levels.html#gab0a296414983155b30ad51871606b90f":[12,0,4,0,2,0,1],
-"group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1":[12,0,4,0,2,0,6],
-"group__dhcp4.html":[12,2,0,2,0,1],
-"group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f":[12,2,0,2,0,1,6],
-"group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64":[12,2,0,2,0,1,0],
-"group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8":[12,2,0,2,0,1,5],
-"group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947":[12,2,0,2,0,1,4],
-"group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312":[12,2,0,2,0,1,7],
-"group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad":[12,2,0,2,0,1,1],
-"group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece":[12,2,0,2,0,1,3],
-"group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4":[12,2,0,2,0,1,2],
-"group__dhcp6.html":[12,2,0,2,1,0],
-"group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453":[12,2,0,2,1,0,4],
-"group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619":[12,2,0,2,1,0,2],
-"group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde":[12,2,0,2,1,0,0],
-"group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2":[12,2,0,2,1,0,1],
-"group__dhcp6.html#gaf3349463541e673fec33843eb019b18c":[12,2,0,2,1,0,3],
-"group__dns.html":[12,2,0,1],
-"group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f":[12,2,0,1,0],
-"group__dns.html#gac41de226d156384ae8782cfe370284b0":[12,2,0,1,2],
-"group__dns.html#gae84449f60dca6b863142daca8e03ce79":[12,2,0,1,1],
-"group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584":[12,2,0,1,3],
-"group__ethernet.html":[12,2,0,7],
-"group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778":[12,2,0,7,0],
-"group__httpc.html":[12,4,0],
-"group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd":[12,4,0,3],
-"group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c":[12,4,0,1],
-"group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472":[12,4,0,2],
-"group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2":[12,4,0,0],
-"group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3":[12,4,0,5],
-"group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b":[12,4,0,6],
-"group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6":[12,4,0,7],
-"group__httpc.html#gaeef5c7398d07b644c0d5593f3b7d1392":[12,4,0,4],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62":[12,4,0,5,7],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd":[12,4,0,5,1],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096":[12,4,0,5,9],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6":[12,4,0,5,4],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33":[12,4,0,5,5],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8":[12,4,0,5,6],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09":[12,4,0,5,2],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867":[12,4,0,5,8],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d":[12,4,0,5,3],
-"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659":[12,4,0,5,0],
-"group__httpd.html":[12,4,1],
-"group__httpd.html#ga461409c8813c2a82ba63fde987c0e537":[12,4,1,11],
-"group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5":[12,4,1,10],
-"group__httpd.html#ga693032b00bb572d131de09116c822f3b":[12,4,1,2],
-"group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582":[12,4,1,8],
-"group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c":[12,4,1,5]
+"ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd":[15,0,0,3,1,18,0],
+"files.html":[15,0],
+"functions.html":[14,1,0],
+"functions.html":[14,1,0,0],
+"functions_a.html":[14,1,0,1],
+"functions_b.html":[14,1,0,2],
+"functions_c.html":[14,1,0,3],
+"functions_d.html":[14,1,0,4],
+"functions_e.html":[14,1,0,5],
+"functions_f.html":[14,1,0,6],
+"functions_g.html":[14,1,0,7],
+"functions_h.html":[14,1,0,8],
+"functions_i.html":[14,1,0,9],
+"functions_j.html":[14,1,0,10],
+"functions_k.html":[14,1,0,11],
+"functions_l.html":[14,1,0,12],
+"functions_m.html":[14,1,0,13],
+"functions_n.html":[14,1,0,14],
+"functions_o.html":[14,1,0,15],
+"functions_p.html":[14,1,0,16],
+"functions_q.html":[14,1,0,17],
+"functions_r.html":[14,1,0,18],
+"functions_s.html":[14,1,0,19],
+"functions_t.html":[14,1,0,20],
+"functions_u.html":[14,1,0,21],
+"functions_v.html":[14,1,0,22],
+"functions_vars.html":[14,1,1],
+"functions_vars.html":[14,1,1,0],
+"functions_vars_a.html":[14,1,1,1],
+"functions_vars_b.html":[14,1,1,2],
+"functions_vars_c.html":[14,1,1,3],
+"functions_vars_d.html":[14,1,1,4],
+"functions_vars_e.html":[14,1,1,5],
+"functions_vars_f.html":[14,1,1,6],
+"functions_vars_g.html":[14,1,1,7],
+"functions_vars_h.html":[14,1,1,8],
+"functions_vars_i.html":[14,1,1,9],
+"functions_vars_j.html":[14,1,1,10],
+"functions_vars_k.html":[14,1,1,11],
+"functions_vars_l.html":[14,1,1,12],
+"functions_vars_m.html":[14,1,1,13],
+"functions_vars_n.html":[14,1,1,14],
+"functions_vars_o.html":[14,1,1,15],
+"functions_vars_p.html":[14,1,1,16],
+"functions_vars_q.html":[14,1,1,17],
+"functions_vars_r.html":[14,1,1,18],
+"functions_vars_s.html":[14,1,1,19],
+"functions_vars_t.html":[14,1,1,20],
+"functions_vars_u.html":[14,1,1,21],
+"functions_vars_v.html":[14,1,1,22],
+"functions_vars_w.html":[14,1,1,23],
+"functions_vars_z.html":[14,1,1,24],
+"functions_w.html":[14,1,0,23],
+"functions_z.html":[14,1,0,24],
+"globals.html":[15,1,0],
+"globals.html":[15,1,0,0],
+"globals_b.html":[15,1,0,1],
+"globals_c.html":[15,1,0,2],
+"globals_d.html":[15,1,0,3],
+"globals_defs.html":[15,1,6],
+"globals_defs.html":[15,1,6,0],
+"globals_defs_b.html":[15,1,6,1],
+"globals_defs_c.html":[15,1,6,2],
+"globals_defs_d.html":[15,1,6,3],
+"globals_defs_e.html":[15,1,6,4],
+"globals_defs_f.html":[15,1,6,5],
+"globals_defs_h.html":[15,1,6,6],
+"globals_defs_i.html":[15,1,6,7],
+"globals_defs_l.html":[15,1,6,8],
+"globals_defs_m.html":[15,1,6,9],
+"globals_defs_n.html":[15,1,6,10],
+"globals_defs_p.html":[15,1,6,11],
+"globals_defs_q.html":[15,1,6,12],
+"globals_defs_r.html":[15,1,6,13],
+"globals_defs_s.html":[15,1,6,14],
+"globals_defs_t.html":[15,1,6,15],
+"globals_defs_u.html":[15,1,6,16],
+"globals_defs_z.html":[15,1,6,17],
+"globals_e.html":[15,1,0,4],
+"globals_enum.html":[15,1,4],
+"globals_eval.html":[15,1,5],
+"globals_f.html":[15,1,0,5],
+"globals_func.html":[15,1,1],
+"globals_func.html":[15,1,1,0],
+"globals_func_b.html":[15,1,1,1],
+"globals_func_d.html":[15,1,1,2],
+"globals_func_e.html":[15,1,1,3],
+"globals_func_g.html":[15,1,1,4],
+"globals_func_h.html":[15,1,1,5],
+"globals_func_i.html":[15,1,1,6],
+"globals_func_l.html":[15,1,1,7],
+"globals_func_m.html":[15,1,1,8],
+"globals_func_n.html":[15,1,1,9],
+"globals_func_p.html":[15,1,1,10],
+"globals_func_r.html":[15,1,1,11],
+"globals_func_s.html":[15,1,1,12],
+"globals_func_t.html":[15,1,1,13],
+"globals_func_u.html":[15,1,1,14],
+"globals_func_z.html":[15,1,1,15],
+"globals_g.html":[15,1,0,6],
+"globals_h.html":[15,1,0,7],
+"globals_i.html":[15,1,0,8],
+"globals_l.html":[15,1,0,9],
+"globals_m.html":[15,1,0,10],
+"globals_n.html":[15,1,0,11],
+"globals_p.html":[15,1,0,12],
+"globals_q.html":[15,1,0,13],
+"globals_r.html":[15,1,0,14],
+"globals_s.html":[15,1,0,15],
+"globals_t.html":[15,1,0,16],
+"globals_type.html":[15,1,3],
+"globals_u.html":[15,1,0,17],
+"globals_vars.html":[15,1,2],
+"globals_z.html":[15,1,0,18],
+"group__acd.html":[13,2,0,2,0,0],
+"group__acd.html#ga158856bf139cb2761837ddfa07303bdc":[13,2,0,2,0,0,0],
+"group__acd.html#ga18b444f6fc69325416b463208a754c97":[13,2,0,2,0,0,1],
+"group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff":[13,2,0,2,0,0,2],
+"group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb":[13,2,0,2,0,0,4],
+"group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7":[13,2,0,2,0,0,5],
+"group__acd.html#ga70503696bca25e1cfb61fad38b4327da":[13,2,0,2,0,0,3],
+"group__altcp.html":[13,2,0,0,0],
+"group__altcp.html#ga04a328f67359ee03d1ec6824978b7209":[13,2,0,0,0,2],
+"group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319":[13,2,0,0,0,21],
+"group__altcp.html#ga197a33af038556a04d8f27c7033d771f":[13,2,0,0,0,5],
+"group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0":[13,2,0,0,0,16],
+"group__altcp.html#ga4329798afdf3709c789a2ee060ee3993":[13,2,0,0,0,7],
+"group__altcp.html#ga485b248680f73b9876d8674029c5157c":[13,2,0,0,0,6],
+"group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5":[13,2,0,0,0,20],
+"group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5":[13,2,0,0,0,23],
+"group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6":[13,2,0,0,0,15],
+"group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908":[13,2,0,0,0,12],
+"group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f":[13,2,0,0,0,10],
+"group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9":[13,2,0,0,0,4],
+"group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab":[13,2,0,0,0,3],
+"group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71":[13,2,0,0,0,17],
+"group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d":[13,2,0,0,0,24],
+"group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c":[13,2,0,0,0,22],
+"group__altcp.html#gab2b228c77c827fb14bfc513171c79f47":[13,2,0,0,0,19],
+"group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d":[13,2,0,0,0,14],
+"group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83":[13,2,0,0,0,18],
+"group__altcp.html#gadc76a1f3b2448559dc87da1b33291644":[13,2,0,0,0,9],
+"group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08":[13,2,0,0,0,11],
+"group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492":[13,2,0,0,0,8],
+"group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd":[13,2,0,0,0,13],
+"group__altcp__api.html":[13,2,0,0],
+"group__altcp__tls.html":[13,2,0,0,0,0],
+"group__altcp__tls.html#ga1f60b12a6a4440214b7bcf2e3ba43126":[13,2,0,0,0,0,2],
+"group__altcp__tls.html#ga4aed4aa55d0e1b15f4118863cea06d18":[13,2,0,0,0,0,14],
+"group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597":[13,2,0,0,0,0,5],
+"group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e":[13,2,0,0,0,0,7],
+"group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2":[13,2,0,0,0,0,9],
+"group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170":[13,2,0,0,0,0,4],
+"group__altcp__tls.html#ga827c76a0bddc4923b9a17c813e13891e":[13,2,0,0,0,0,11],
+"group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7":[13,2,0,0,0,0,3],
+"group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145":[13,2,0,0,0,0,8],
+"group__altcp__tls.html#ga906eefcef66e9dd2b43c3392704905f5":[13,2,0,0,0,0,10],
+"group__altcp__tls.html#gaa37649bf24ebea235a8e3e8f50b9831f":[13,2,0,0,0,0,6],
+"group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c":[13,2,0,0,0,0,15],
+"group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc":[13,2,0,0,0,0,0],
+"group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8":[13,2,0,0,0,0,13],
+"group__altcp__tls.html#gae6c3cf72fcd29e6ea4c74181370420c3":[13,2,0,0,0,0,12],
+"group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e":[13,2,0,0,0,0,1],
+"group__api.html":[13,2],
+"group__apps.html":[13,4],
+"group__autoip.html":[13,2,0,2,0,1],
+"group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8":[13,2,0,2,0,1,2],
+"group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90":[13,2,0,2,0,1,1],
+"group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4":[13,2,0,2,0,1,3],
+"group__autoip.html#gac0c98035795500ede464aa4af2515f30":[13,2,0,2,0,1,0],
+"group__bridgeif.html":[13,3,0],
+"group__bridgeif.html#ga23cc2c5f8fccefc470093840cc53727c":[13,3,0,9],
+"group__bridgeif.html#ga3d41c7905b61aef3a3b8c61b3af7879f":[13,3,0,3],
+"group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77":[13,3,0,6],
+"group__bridgeif.html#ga61c8f232a5907f3662157746e71d35cc":[13,3,0,5],
+"group__bridgeif.html#ga79349b1e9d0f944e8abad5a6cfb1c8e8":[13,3,0,8],
+"group__bridgeif.html#gaaaeb47fbf1dd6c30cb502343fa0d0741":[13,3,0,4],
+"group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666":[13,3,0,7],
+"group__bridgeif__fdb.html":[13,3,0,1],
+"group__bridgeif__fdb.html#ga137fdeb4939e8fb889b10a97ea479d3a":[13,3,0,1,1],
+"group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750":[13,3,0,1,0],
+"group__bridgeif__fdb.html#gad912bfd3ce8e24d0eb48b7dc9de07c39":[13,3,0,1,2],
+"group__bridgeif__opts.html":[13,3,0,0],
+"group__bridgeif__opts.html#ga5aed5cd9b01ba1345b47845cd04ca30d":[13,3,0,0,4],
+"group__bridgeif__opts.html#ga6fe03b84359150b7dea3dfca942b6414":[13,3,0,0,3],
+"group__bridgeif__opts.html#ga72e389f592470dc50288a68f3db70730":[13,3,0,0,1],
+"group__bridgeif__opts.html#gaab45e20e9b09a98217994082968cec73":[13,3,0,0,0],
+"group__bridgeif__opts.html#gac456e97b1b0e9a57449596a2b229763a":[13,3,0,0,2],
+"group__callbackstyle__api.html":[13,2,0],
+"group__compiler__abstraction.html":[13,0,2,4],
+"group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1":[13,0,2,4,11],
+"group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3":[13,0,2,4,0],
+"group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e":[13,0,2,4,5],
+"group__compiler__abstraction.html#ga33623da05bb55497534c3dc26ebebeb2":[13,0,2,4,24],
+"group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446":[13,0,2,4,12],
+"group__compiler__abstraction.html#ga465fef70f294e21cbf4ea51fc342f20e":[13,0,2,4,20],
+"group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d":[13,0,2,4,10],
+"group__compiler__abstraction.html#ga57b90d36d8bea3798a5d1815945fd8ef":[13,0,2,4,25],
+"group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373":[13,0,2,4,8],
+"group__compiler__abstraction.html#ga651bb349041669fe717b19f127ef16c0":[13,0,2,4,3],
+"group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a":[13,0,2,4,16],
+"group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800":[13,0,2,4,7],
+"group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf":[13,0,2,4,18],
+"group__compiler__abstraction.html#ga73199061891adf1b912d20835c7d5e96":[13,0,2,4,19],
+"group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a":[13,0,2,4,17],
+"group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0":[13,0,2,4,13],
+"group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade":[13,0,2,4,15],
+"group__compiler__abstraction.html#gaa0dd3f76dd9a837feaac61fedc0dbe72":[13,0,2,4,2],
+"group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc":[13,0,2,4,4],
+"group__compiler__abstraction.html#gaa8f75e4117374c2d09fbda5566e40b62":[13,0,2,4,22],
+"group__compiler__abstraction.html#gaab0b988124e37a978d9a88e7c1c778e0":[13,0,2,4,21],
+"group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8":[13,0,2,4,1],
+"group__compiler__abstraction.html#gacc89e224363eb0ebca24b64d925c3cb7":[13,0,2,4,23],
+"group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b":[13,0,2,4,14],
+"group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805":[13,0,2,4,9],
+"group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18":[13,0,2,4,6],
+"group__debugging__levels.html":[13,0,4,0,2,0],
+"group__debugging__levels.html#ga0269bdc51f1e8a5ecf9af72c6e1c996c":[13,0,4,0,2,0,3],
+"group__debugging__levels.html#ga511ee3deb3240635f5ec6a1709c6d741":[13,0,4,0,2,0,8],
+"group__debugging__levels.html#ga77c491e468bf7d9a1bc48430c1866a96":[13,0,4,0,2,0,5],
+"group__debugging__levels.html#ga7d44d1804fa5e747aed86816e2a6cae0":[13,0,4,0,2,0,0],
+"group__debugging__levels.html#ga8ebaeb006b43f55897f3196b3617dc87":[13,0,4,0,2,0,2],
+"group__debugging__levels.html#ga988147559b78642ac881815b66023646":[13,0,4,0,2,0,9],
+"group__debugging__levels.html#ga9e31b7cbbc8f46af8e62b548079acd4e":[13,0,4,0,2,0,7],
+"group__debugging__levels.html#gaab41143277cd38047b6660d90e9cec3b":[13,0,4,0,2,0,4],
+"group__debugging__levels.html#gab0a296414983155b30ad51871606b90f":[13,0,4,0,2,0,1],
+"group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1":[13,0,4,0,2,0,6],
+"group__dhcp4.html":[13,2,0,2,0,2],
+"group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f":[13,2,0,2,0,2,6],
+"group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64":[13,2,0,2,0,2,0],
+"group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8":[13,2,0,2,0,2,5],
+"group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947":[13,2,0,2,0,2,4],
+"group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312":[13,2,0,2,0,2,7],
+"group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad":[13,2,0,2,0,2,1],
+"group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece":[13,2,0,2,0,2,3],
+"group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4":[13,2,0,2,0,2,2],
+"group__dhcp6.html":[13,2,0,2,1,0],
+"group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453":[13,2,0,2,1,0,4],
+"group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619":[13,2,0,2,1,0,2],
+"group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde":[13,2,0,2,1,0,0],
+"group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2":[13,2,0,2,1,0,1],
+"group__dhcp6.html#gaf3349463541e673fec33843eb019b18c":[13,2,0,2,1,0,3],
+"group__dns.html":[13,2,0,1],
+"group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f":[13,2,0,1,0],
+"group__dns.html#gac41de226d156384ae8782cfe370284b0":[13,2,0,1,2],
+"group__dns.html#gae84449f60dca6b863142daca8e03ce79":[13,2,0,1,1],
+"group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584":[13,2,0,1,3],
+"group__ethernet.html":[13,2,0,7],
+"group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778":[13,2,0,7,0],
+"group__httpc.html":[13,4,0]
 };
diff --git a/doc/doxygen/output/html/navtreeindex10.js b/doc/doxygen/output/html/navtreeindex10.js
index 5ceedc2..f6e889e 100644
--- a/doc/doxygen/output/html/navtreeindex10.js
+++ b/doc/doxygen/output/html/navtreeindex10.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX10 =
 {
-"structnetbios__hdr.html":[13,0,60],
-"structnetbios__name__hdr.html":[13,0,61],
-"structnetbios__question__hdr.html":[13,0,62],
-"structnetbios__resp.html":[13,0,63],
-"structnetbuf.html":[13,0,64],
-"structnetconn.html":[13,0,65],
-"structnetconn.html#a05b15a28b0803bea3729b1da2047541e":[13,0,65,8],
-"structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d":[13,0,65,4],
-"structnetconn.html#a2a54e90fa370cf0df46dfd0b97f1cce7":[13,0,65,7],
-"structnetconn.html#a44e55724482b8e447134f5ba4f01551a":[13,0,65,11],
-"structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9":[13,0,65,2],
-"structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6":[13,0,65,14],
-"structnetconn.html#a6febc9717418ddba16f16e988061cfac":[13,0,65,9],
-"structnetconn.html#a936c33090ec35e5e8c0011be5515a589":[13,0,65,13],
-"structnetconn.html#a96cb9a3830248699bd07a1a447e5630c":[13,0,65,3],
-"structnetconn.html#a982506698a59f185ff3f16d1675ea4ae":[13,0,65,5],
-"structnetconn.html#a9b59188f300828d2b5814e27ab27cad0":[13,0,65,0],
-"structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da":[13,0,65,10],
-"structnetconn.html#abe796060bb06e585333ca9a87862b624":[13,0,65,1],
-"structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36":[13,0,65,12],
-"structnetconn.html#ad08c5613a3a6fa9fe569b4acf30973f8":[13,0,65,6],
-"structnetif.html":[13,0,66],
-"structnetif.html#a1513e81d02557d2a950e965f18b53a45":[13,0,66,26],
-"structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971":[13,0,66,27],
-"structnetif.html#a1c171db6097bbb6f09f63549a66e00ea":[13,0,66,0],
-"structnetif.html#a26f6e26d4a54c998716c10b7b85c8230":[13,0,66,7],
-"structnetif.html#a32fca6ffd28bb9af3f891a378827a67e":[13,0,66,18],
-"structnetif.html#a4388cfadc8b4e9a9c1c93ce777bc3673":[13,0,66,10],
-"structnetif.html#a54e81344084e9840a51cc4abab3b059b":[13,0,66,6],
-"structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3":[13,0,66,25],
-"structnetif.html#a8e1dcfe65db487feecd244355f39215e":[13,0,66,21],
-"structnetif.html#a8fe4f1b7b0d710216287da9615164a5c":[13,0,66,4],
-"structnetif.html#a908452e854180941054ed89f52bb8094":[13,0,66,11],
-"structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866":[13,0,66,9],
-"structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6":[13,0,66,24],
-"structnetif.html#ab32cbe1851154fd020bac4be558f5fd5":[13,0,66,14],
-"structnetif.html#ab7ef01e505dd2feb781fe86756b1c973":[13,0,66,20],
-"structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4":[13,0,66,5],
-"structnetif.html#abc67963ff9f574e98ef9c50138a3e470":[13,0,66,15],
-"structnetif.html#ac38383379cff22c402156fec71c19617":[13,0,66,22],
-"structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48":[13,0,66,16],
-"structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d":[13,0,66,13],
-"structnetif.html#acd78fca5dad6468605f38e327b3a5e72":[13,0,66,17],
-"structnetif.html#ad0ee2a2169e384a2977ece2c471e0062":[13,0,66,12],
-"structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f":[13,0,66,8],
-"structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07":[13,0,66,23],
-"structnetif.html#ae64e56581bf0f136601f24c5395c19f0":[13,0,66,3],
-"structnetif.html#ae77736b64df442242795220d76be6b86":[13,0,66,19],
-"structnetif.html#aee967965d999fc1a4c40a66709304e69":[13,0,66,1],
-"structnetif.html#afe1181561cb16241f3cb5ed01e567d42":[13,0,66,2],
-"structnetif__ext__callback__args__t_1_1ipv4__changed__s.html":[12,2,0,3,5,0],
-"structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade":[12,2,0,3,5,0,0],
-"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html":[12,2,0,3,5,1],
-"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776":[12,2,0,3,5,1,2],
-"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17":[12,2,0,3,5,1,1],
-"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f":[12,2,0,3,5,1,0],
-"structnetif__ext__callback__args__t_1_1ipv6__set__s.html":[12,2,0,3,5,2],
-"structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226":[12,2,0,3,5,2,1],
-"structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd":[12,2,0,3,5,2,0],
-"structnetif__ext__callback__args__t_1_1link__changed__s.html":[12,2,0,3,5,3],
-"structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c":[12,2,0,3,5,3,0],
-"structnetif__ext__callback__args__t_1_1status__changed__s.html":[12,2,0,3,5,4],
-"structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7":[12,2,0,3,5,4,0],
-"structnetvector.html":[13,0,68],
-"structnetvector.html#a523362737ea7764f9aaa73a050a0b983":[13,0,68,1],
-"structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd":[13,0,68,0],
-"structns__header.html":[13,0,69],
-"structpbuf.html":[13,0,70],
-"structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f":[13,0,70,6],
-"structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341":[13,0,70,3],
-"structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131":[13,0,70,7],
-"structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7":[13,0,70,5],
-"structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697":[13,0,70,1],
-"structpbuf.html#a6f82449625e36e294f5d210268c0703f":[13,0,70,2],
-"structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460":[13,0,70,4],
-"structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a":[13,0,70,0],
-"structpbuf__custom.html":[13,0,71],
-"structpbuf__custom.html#a100e338f13464e76b46896647b962ed8":[13,0,71,1],
-"structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9":[13,0,71,0],
-"structpbuf__custom__ref.html":[13,0,72],
-"structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d":[13,0,72,0],
-"structpbuf__custom__ref.html#af5884b6a7031d73406cb9596a51382b7":[13,0,72,1],
-"structpbuf__rom.html":[13,0,73],
-"structpbuf__rom.html#a5cd0dcc590038629644ad775d76230a1":[13,0,73,1],
-"structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7":[13,0,73,0],
-"structraw__pcb.html":[13,0,74],
-"structraw__pcb.html#a2ecc77e919de9bb552d1c70e771e2cad":[13,0,74,1],
-"structraw__pcb.html#a5124a21e1523c774bd76c0eabc7c7ca8":[13,0,74,0],
-"structraw__pcb.html#a963b023239ad97c05536046ed7058a10":[13,0,74,2],
-"structredirect__header.html":[13,0,75],
-"structrs__header.html":[13,0,76],
-"structsmtp__send__request.html":[13,0,77],
-"structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4":[13,0,77,0],
-"structsmtp__session.html":[13,0,78],
-"structsmtp__session.html#a003dfd03ac58252b575a7c965e532461":[13,0,78,1],
-"structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d":[13,0,78,3],
-"structsmtp__session.html#a191b09e7142414a671da82fece888e65":[13,0,78,8],
-"structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b":[13,0,78,6],
-"structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61":[13,0,78,16],
-"structsmtp__session.html#a561389328fb1fefcb4d4d17fd0d43301":[13,0,78,0],
-"structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb":[13,0,78,17],
-"structsmtp__session.html#a5884425cb5ce964d8383b29cc20208d7":[13,0,78,13],
-"structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b":[13,0,78,4],
-"structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402":[13,0,78,15],
-"structsmtp__session.html#a70b3753bc70e65f779279c246617faea":[13,0,78,14],
-"structsmtp__session.html#a7a5a3c00378ce076ce70236525afd431":[13,0,78,9],
-"structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49":[13,0,78,2],
-"structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee":[13,0,78,7],
-"structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7":[13,0,78,11],
-"structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c":[13,0,78,12],
-"structsmtp__session.html#aed9c182738767279c2b58b1e3322db09":[13,0,78,10],
-"structsmtp__session.html#af0544df7a935a092d825d8f2380f970f":[13,0,78,5],
-"structsnmp__leaf__node.html":[13,0,79],
-"structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992":[13,0,79,0],
-"structsnmp__mib.html":[13,0,80],
-"structsnmp__next__oid__state.html":[13,0,81],
-"structsnmp__node.html":[13,0,82],
-"structsnmp__node.html#a1af8e20a688943a419b307bf123b1851":[13,0,82,0],
-"structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271":[13,0,82,1],
-"structsnmp__node__instance.html":[13,0,83],
-"structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd":[13,0,83,8],
-"structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649":[13,0,83,2],
-"structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de":[13,0,83,7],
-"structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac":[13,0,83,4],
-"structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c":[13,0,83,0],
-"structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5":[13,0,83,5],
-"structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834":[13,0,83,9],
-"structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54":[13,0,83,6],
-"structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23":[13,0,83,3],
-"structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9":[13,0,83,1],
-"structsnmp__obj__id.html":[13,0,84],
-"structsnmp__oid__range.html":[13,0,85],
-"structsnmp__scalar__array__node.html":[13,0,86],
-"structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b":[13,0,86,0],
-"structsnmp__scalar__array__node__def.html":[13,0,87],
-"structsnmp__scalar__node.html":[13,0,88],
-"structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1":[13,0,88,0],
-"structsnmp__table__col__def.html":[13,0,89],
-"structsnmp__table__node.html":[13,0,90],
-"structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804":[13,0,90,3],
-"structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18":[13,0,90,1],
-"structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272":[13,0,90,0],
-"structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0":[13,0,90,2],
-"structsnmp__table__simple__node.html":[13,0,91],
-"structsnmp__threadsync__instance.html":[13,0,92],
-"structsnmp__threadsync__node.html":[13,0,93],
-"structsnmp__tree__node.html":[13,0,94],
-"structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386":[13,0,94,0],
-"structsnmp__varbind.html":[13,0,95],
-"structsnmp__varbind.html#a328227d7ae188a0a2feb95f8000aac45":[13,0,95,4],
-"structsnmp__varbind.html#a365abcc1f80d28dc8ffd07193099c760":[13,0,95,2],
-"structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e":[13,0,95,0],
-"structsnmp__varbind.html#ab094577fac6c7cc16ad666c9970cdb85":[13,0,95,5],
-"structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4":[13,0,95,1],
-"structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950":[13,0,95,3],
-"structsnmp__varbind__len.html":[13,0,96],
-"structsntp__msg.html":[13,0,98],
-"structsntp__server.html":[13,0,99],
-"structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d":[13,0,99,0],
-"structsntp__time.html":[13,0,100],
-"structsntp__timestamps.html":[13,0,101],
-"structstats__.html":[13,0,103],
-"structstats__.html#a10bc430163b0e6db91338aded5b7019a":[13,0,103,1],
-"structstats__.html#a25a6b5940e32d53a066aa1bbc2028c03":[13,0,103,2],
-"structstats__.html#a317123da6c92aa9d2fa40e8060357035":[13,0,103,14],
-"structstats__.html#a32ef1aaa427d62a5c7890de0ac23fe86":[13,0,103,15],
-"structstats__.html#a40f5b637d083896a07a3482ede23b7ed":[13,0,103,4],
-"structstats__.html#a626e03d4bded6480582789cfd17d4063":[13,0,103,16],
-"structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c":[13,0,103,9],
-"structstats__.html#a67759c9b0059bf569f9f771df23924eb":[13,0,103,8],
-"structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf":[13,0,103,6],
-"structstats__.html#a81fcccf03ab0d4e31423f39d0c880302":[13,0,103,7],
-"structstats__.html#a877e369c2abef97f13492faa838e2271":[13,0,103,3],
-"structstats__.html#aa52547cb08dc828927494dc485bb69f3":[13,0,103,0],
-"structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc":[13,0,103,10],
-"structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8":[13,0,103,12],
-"structstats__.html#ab348a3a4b593b05d7df1293a06af8adf":[13,0,103,13],
-"structstats__.html#ac001c065c56c26c3952b19b9ce0d5832":[13,0,103,11],
-"structstats__.html#afc0942a5bc26735cf059099636b85336":[13,0,103,5],
-"structstats__igmp.html":[13,0,104],
-"structstats__mem.html":[13,0,105],
-"structstats__mib2.html":[13,0,106],
-"structstats__mib2__netif__ctrs.html":[12,2,0,3,4,0],
-"structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd":[12,2,0,3,4,0,2],
-"structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7":[12,2,0,3,4,0,9],
-"structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471":[12,2,0,3,4,0,10],
-"structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842":[12,2,0,3,4,0,6],
-"structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947":[12,2,0,3,4,0,0],
-"structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e":[12,2,0,3,4,0,3],
-"structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e":[12,2,0,3,4,0,7],
-"structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8":[12,2,0,3,4,0,4],
-"structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa":[12,2,0,3,4,0,5],
-"structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7":[12,2,0,3,4,0,8],
-"structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d":[12,2,0,3,4,0,1],
-"structstats__proto.html":[13,0,108],
-"structstats__sys.html":[13,0,109],
-"structstats__syselem.html":[13,0,110],
-"structt_c_g_i.html":[12,4,1,1],
-"structtcp__ext__arg__callbacks.html":[13,0,112],
-"structtcp__ext__arg__callbacks.html#a86b5816e8285378813963d09272b050a":[13,0,112,1],
-"structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b":[13,0,112,0],
-"structtcp__pcb.html":[13,0,113],
-"structtcp__pcb.html#a0c4f101d55debee0d8fad86a7eb4f76f":[13,0,113,0],
-"structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260":[13,0,113,1],
-"structtcp__pcb__listen.html":[13,0,114],
-"structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34":[13,0,114,1],
-"structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987":[13,0,114,0],
-"structtftp__context.html":[12,4,9,1],
-"structtftp__context.html#a65d6359e2aac571813c05c61676c01a1":[12,4,9,1,1],
-"structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c":[12,4,9,1,2],
-"structtftp__context.html#a9e6e4ec803ec9597822923369701754d":[12,4,9,1,3],
-"structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65":[12,4,9,1,0],
-"structthreadsync__data.html":[13,0,116],
-"structudp__pcb.html":[13,0,117],
-"structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab":[13,0,117,7],
-"structudp__pcb.html#a1c32c7ebd76898cf8f1227c10d34dbe0":[13,0,117,4],
-"structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d":[13,0,117,0],
-"structudp__pcb.html#a6160ea5e52f0d33e51b16b853ea1cd63":[13,0,117,1],
-"structudp__pcb.html#a8cc805631142eefc5593ae8ba3302d7c":[13,0,117,2],
-"structudp__pcb.html#aaab9255f7f1186aef12d45c9bb90d3f4":[13,0,117,5],
-"structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8":[13,0,117,6],
-"structudp__pcb.html#ac80ae56333b88cea08bfa3563b0dd3cd":[13,0,117,3],
-"structzepif__init.html":[13,0,118],
-"structzepif__init.html#a3d97bf90b6bd4dd8258a3b1caf7890e3":[13,0,118,3],
-"structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d":[13,0,118,0],
-"structzepif__init.html#a851efb99a973348f1064a31b97ce779d":[13,0,118,1],
-"structzepif__init.html#a86c6229ed3010158e601666afe91a286":[13,0,118,2],
-"structzepif__init.html#ad739032585841b126b4c0eab5899d40f":[13,0,118,5],
-"structzepif__init.html#adbe989f1f5cba623d742187def36f02c":[13,0,118,4],
-"sys_8c.html":[14,0,0,2,16],
-"sys_8h.html":[14,0,0,3,1,48],
-"sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8":[14,0,0,3,1,48,9],
-"sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6":[14,0,0,3,1,48,0],
-"sys_8h.html#a84e7e4bc00255aee84e6e7289a985703":[14,0,0,3,1,48,11],
-"sys_8h.html#a9e8ad541356786936f23ab83b8f550cc":[14,0,0,3,1,48,10],
-"sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb":[14,0,0,3,1,48,8],
-"sys_8h.html#ab0571e67edca0132b144106e9b319ef9":[14,0,0,3,1,48,5],
-"sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13":[14,0,0,3,1,48,7],
-"sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b":[14,0,0,3,1,48,3],
-"sys_8h.html#ac89f307e8b360eaf821b461a4f26753a":[14,0,0,3,1,48,17],
-"sys_8h.html#ae293feebb61d36f2db99be53702b8203":[14,0,0,3,1,48,6],
-"sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9":[14,0,0,3,1,48,12],
-"sys_init.html":[8],
-"tcp_8c.html":[14,0,0,2,17],
-"tcp_8c.html#a0075b56ad4b0eca7c9d439cf150e1973":[14,0,0,2,17,30],
-"tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3":[14,0,0,2,17,11],
-"tcp_8c.html#a0cb3f604fc8d20870d8cab291da5701c":[14,0,0,2,17,32],
-"tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8":[14,0,0,2,17,45],
-"tcp_8c.html#a2c4234f1e95b6bde0e84d4ea97ae95bc":[14,0,0,2,17,38],
-"tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb":[14,0,0,2,17,41]
+"structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a":[14,0,33,0],
+"structip6__reass__helper.html":[14,0,34],
+"structip6__reassdata.html":[14,0,35],
+"structip__addr.html":[13,1,0,2],
+"structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a":[13,1,0,2,0],
+"structip__globals.html":[14,0,37],
+"structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0":[14,0,37,5],
+"structip__globals.html#a0b4e54250c692c638408de54593d2aa1":[14,0,37,4],
+"structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a":[14,0,37,3],
+"structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4":[14,0,37,1],
+"structip__globals.html#a7803dc5950d143e4433a0df689989bab":[14,0,37,6],
+"structip__globals.html#a7da899c663b1d560b61d92ba6d544701":[14,0,37,0],
+"structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41":[14,0,37,2],
+"structip__reass__helper.html":[14,0,38],
+"structip__reassdata.html":[14,0,39],
+"structlowpan6__ieee802154__data.html":[14,0,40],
+"structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f":[14,0,40,0],
+"structlowpan6__ieee802154__data.html#a190c9c06dfe1075abb7399f99553b507":[14,0,40,1],
+"structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c":[14,0,40,3],
+"structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35":[14,0,40,2],
+"structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c":[14,0,40,4],
+"structlowpan6__link__addr.html":[14,0,41],
+"structlowpan6__reass__helper.html":[14,0,42],
+"structlwip__cyclic__timer.html":[14,0,43],
+"structlwip__select__cb.html":[14,0,44],
+"structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99":[14,0,44,7],
+"structlwip__select__cb.html#a21a98e316bb7001d8750b20f5a7d0aa7":[14,0,44,4],
+"structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed":[14,0,44,0],
+"structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba":[14,0,44,3],
+"structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e":[14,0,44,5],
+"structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a":[14,0,44,1],
+"structlwip__select__cb.html#aa89638b1c2c6b2c88030560861aba04c":[14,0,44,8],
+"structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482":[14,0,44,6],
+"structlwip__select__cb.html#ae39fc1bef3938380d15085e0141639de":[14,0,44,2],
+"structlwip__sock.html":[14,0,45],
+"structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4":[14,0,45,0],
+"structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8":[14,0,45,5],
+"structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e":[14,0,45,1],
+"structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1":[14,0,45,2],
+"structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38":[14,0,45,4],
+"structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a":[14,0,45,3],
+"structmdns__delayed__msg.html":[14,0,46],
+"structmdns__delayed__msg.html#a5ca9fccc523b7820f8e67c9ccf921da8":[14,0,46,3],
+"structmdns__delayed__msg.html#a641abcf692a99e2c969048432b3c6adf":[14,0,46,2],
+"structmdns__delayed__msg.html#a6c7e581f1cf67daf039ffcaa31580e60":[14,0,46,4],
+"structmdns__delayed__msg.html#a6f2ed8a51e6e249c3c72c3e31f23d20b":[14,0,46,0],
+"structmdns__delayed__msg.html#a7052387506ef48b1db099c48f4ec5736":[14,0,46,5],
+"structmdns__delayed__msg.html#abd5210624394fece45e57e16da85a47d":[14,0,46,6],
+"structmdns__delayed__msg.html#acaa15e086356be60b2a1bdd8fcc17edd":[14,0,46,1],
+"structmdns__host.html":[14,0,47],
+"structmdns__host.html#a002e836a1888c7df4cf2b775c7fae557":[14,0,47,6],
+"structmdns__host.html#a07aadf9f308eee16a99041635df38123":[14,0,47,5],
+"structmdns__host.html#a16016021ddabb1dc182f36c7185bf283":[14,0,47,3],
+"structmdns__host.html#a2ed51b16771590917e0eef5cf25ada71":[14,0,47,9],
+"structmdns__host.html#a560447b364854eb5480e137e09d3cd24":[14,0,47,4],
+"structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed":[14,0,47,8],
+"structmdns__host.html#a9c09b5c58b3db64f78ce8eeb14952bea":[14,0,47,7],
+"structmdns__host.html#a9d0df33231cd8b50e25aa1fa4ebdc291":[14,0,47,2],
+"structmdns__host.html#ab1ca90b282a4a6511fa87408b946f49a":[14,0,47,0],
+"structmdns__host.html#ab5099b1bfe27698f6cc7ac36a80111a0":[14,0,47,1],
+"structmdns__outmsg.html":[14,0,48],
+"structmdns__outmsg.html#a187774c17294968998b6f12bb5834cd0":[14,0,48,1],
+"structmdns__outmsg.html#a1d2d5f1d5d366f31d65ca18a239bfd4e":[14,0,48,6],
+"structmdns__outmsg.html#a3f6810fb1f2a989afcbc2fd852a20386":[14,0,48,5],
+"structmdns__outmsg.html#a4a3ee99f7c25e88f17ea912897617aa0":[14,0,48,4],
+"structmdns__outmsg.html#a8118f6c263f6f8727552620deac2b7c2":[14,0,48,2],
+"structmdns__outmsg.html#a8abcd5b3e04c16a75752b36cf613ac6f":[14,0,48,7],
+"structmdns__outmsg.html#aab2d5c566dcd83874d9cc77cd5fc7253":[14,0,48,3],
+"structmdns__outmsg.html#ab46f1589681a1abe826e8f6c58d10f1a":[14,0,48,0],
+"structmdns__outpacket.html":[14,0,49],
+"structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c":[14,0,49,5],
+"structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035":[14,0,49,2],
+"structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9":[14,0,49,4],
+"structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5":[14,0,49,6],
+"structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad":[14,0,49,1],
+"structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce":[14,0,49,0],
+"structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f":[14,0,49,3],
+"structmdns__packet.html":[14,0,50],
+"structmdns__packet.html#a01f2cd644ceda020d639290fe1c3ea1c":[14,0,50,4],
+"structmdns__packet.html#a09211e78f7f773c492b5856d31423699":[14,0,50,10],
+"structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00":[14,0,50,14],
+"structmdns__packet.html#a1ff4547d0866f338d1c58fc1dadf43f1":[14,0,50,6],
+"structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45":[14,0,50,9],
+"structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68":[14,0,50,8],
+"structmdns__packet.html#a56ba495a1458a21982e65d746468849d":[14,0,50,3],
+"structmdns__packet.html#a8659b4f582be0df84b6ae91308737377":[14,0,50,12],
+"structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7":[14,0,50,2],
+"structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a":[14,0,50,13],
+"structmdns__packet.html#ab7d1d004dcac3cb6761241c5fe58b0ab":[14,0,50,0],
+"structmdns__packet.html#ac47f5a84c173a1565c69673536537c89":[14,0,50,1],
+"structmdns__packet.html#ade926269f6b1de2e51ee92a703068445":[14,0,50,5],
+"structmdns__packet.html#afdb78218c1775073762d9560986c119b":[14,0,50,7],
+"structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437":[14,0,50,11],
+"structmdns__request.html":[14,0,51],
+"structmdns__request.html#a1080b561c8dcb322fb2af64217b13f64":[14,0,51,1],
+"structmdns__request.html#a3ed18dad500125e0d63274c797bd52f5":[14,0,51,0],
+"structmdns__request.html#a497e1b8f664dab9904a89e5f15f5bc60":[14,0,51,2],
+"structmdns__request.html#a4cc8a4e62ce71bc33f1e7cb24b198c1d":[14,0,51,4],
+"structmdns__request.html#a5a9261362213a1a790a0b3451916f669":[14,0,51,3],
+"structmdns__request.html#aace6ab8b7de73d61d02711f26de7b751":[14,0,51,5],
+"structmdns__rr__info.html":[14,0,52],
+"structmdns__service.html":[14,0,53],
+"structmdns__service.html#a35daff90a18d19b14f23fa02df424f94":[14,0,53,5],
+"structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad":[14,0,53,3],
+"structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c":[14,0,53,4],
+"structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d":[14,0,53,2],
+"structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c":[14,0,53,1],
+"structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784":[14,0,53,0],
+"structmem.html":[14,0,54],
+"structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf":[14,0,54,0],
+"structmem.html#a9d7722ed10adf965fa98563d502f98ac":[14,0,54,1],
+"structmem.html#aa76b6a39425617435978dce903f0d456":[14,0,54,2],
+"structmemp__desc.html":[14,0,55],
+"structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500":[14,0,55,3],
+"structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3":[14,0,55,2],
+"structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7":[14,0,55,1],
+"structmemp__desc.html#a9aec58adcbcd88167247296ca4346558":[14,0,55,0],
+"structmemp__desc.html#a9d6b758ce5c3b47a67a7568d38fb3926":[14,0,55,4],
+"structmld__group.html":[14,0,56],
+"structmld__group.html#a21f31e845cb11d2aca4ae7120736f69a":[14,0,56,4],
+"structmld__group.html#a781abf78d835627ded1202166b44b88e":[14,0,56,0],
+"structmld__group.html#a9273a345a5754241bf26ddc835d27ddc":[14,0,56,3],
+"structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b":[14,0,56,2],
+"structmld__group.html#addc67094f83c9352fe039c392c480f9e":[14,0,56,5],
+"structmld__group.html#ae9cfd3f126257aa3aff4a24e05c04059":[14,0,56,1],
+"structmld__header.html":[14,0,57],
+"structmqtt__client__s.html":[14,0,58],
+"structmqtt__client__s.html#a1897eeefe64f9e2d2d953adca858f439":[14,0,58,7],
+"structmqtt__client__s.html#a26dc9112351c042594a41703197925a7":[14,0,58,3],
+"structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef":[14,0,58,2],
+"structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c":[14,0,58,6],
+"structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824":[14,0,58,4],
+"structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5":[14,0,58,5],
+"structmqtt__client__s.html#ab4100f6e0867c212d5923f10024f2e32":[14,0,58,8],
+"structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a":[14,0,58,1],
+"structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6":[14,0,58,0],
+"structmqtt__connect__client__info__t.html":[13,4,4,1],
+"structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9":[13,4,4,1,6],
+"structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8":[13,4,4,1,8],
+"structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4":[13,4,4,1,4],
+"structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3":[13,4,4,1,7],
+"structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b":[13,4,4,1,1],
+"structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7":[13,4,4,1,5],
+"structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a":[13,4,4,1,3],
+"structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a":[13,4,4,1,0],
+"structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5":[13,4,4,1,2],
+"structmqtt__request__t.html":[14,0,60],
+"structmqtt__request__t.html#a32a4b14b0b8b5b8ce8db1074e53f4a79":[14,0,60,0],
+"structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073":[14,0,60,3],
+"structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b":[14,0,60,1],
+"structmqtt__request__t.html#af2dc3cd85cdad25b9b3e1534ecc0cb58":[14,0,60,2],
+"structmqtt__ringbuf__t.html":[14,0,61],
+"structna__header.html":[14,0,62],
+"structnd6__neighbor__cache__entry.html":[14,0,63],
+"structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df":[14,0,63,0],
+"structnd6__q__entry.html":[14,0,64],
+"structnetbios__answer.html":[14,0,65],
+"structnetbios__answer.html#a0069c9ae014881298828660787fa945e":[14,0,65,5],
+"structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea":[14,0,65,11],
+"structnetbios__answer.html#a151dce0f0bf626b2a54fbb75775237ba":[14,0,65,24],
+"structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408":[14,0,65,17],
+"structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4":[14,0,65,1],
+"structnetbios__answer.html#a31ec9ea28b5801b9bb5f1b240d3412de":[14,0,65,18],
+"structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e":[14,0,65,8],
+"structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2":[14,0,65,22],
+"structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d":[14,0,65,6],
+"structnetbios__answer.html#a58aba600ed34b7c689606c296ef57c8c":[14,0,65,3],
+"structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42":[14,0,65,14],
+"structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d":[14,0,65,15],
+"structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683":[14,0,65,2],
+"structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f":[14,0,65,21],
+"structnetbios__answer.html#a9cf85c173fe0d99c1c4e7e09aaeed9b8":[14,0,65,4],
+"structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b":[14,0,65,19],
+"structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd":[14,0,65,12],
+"structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321":[14,0,65,16],
+"structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8":[14,0,65,9],
+"structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2":[14,0,65,7],
+"structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c":[14,0,65,20],
+"structnetbios__answer.html#abf746cd54add594216ddc3683c741406":[14,0,65,0],
+"structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491":[14,0,65,13],
+"structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787":[14,0,65,23],
+"structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219":[14,0,65,10],
+"structnetbios__hdr.html":[14,0,66],
+"structnetbios__name__hdr.html":[14,0,67],
+"structnetbios__question__hdr.html":[14,0,68],
+"structnetbios__resp.html":[14,0,69],
+"structnetbuf.html":[14,0,70],
+"structnetconn.html":[14,0,71],
+"structnetconn.html#a05b15a28b0803bea3729b1da2047541e":[14,0,71,8],
+"structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d":[14,0,71,4],
+"structnetconn.html#a2a54e90fa370cf0df46dfd0b97f1cce7":[14,0,71,7],
+"structnetconn.html#a44e55724482b8e447134f5ba4f01551a":[14,0,71,11],
+"structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9":[14,0,71,2],
+"structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6":[14,0,71,13],
+"structnetconn.html#a6febc9717418ddba16f16e988061cfac":[14,0,71,9],
+"structnetconn.html#a936c33090ec35e5e8c0011be5515a589":[14,0,71,12],
+"structnetconn.html#a96cb9a3830248699bd07a1a447e5630c":[14,0,71,3],
+"structnetconn.html#a982506698a59f185ff3f16d1675ea4ae":[14,0,71,5],
+"structnetconn.html#a9b59188f300828d2b5814e27ab27cad0":[14,0,71,0],
+"structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da":[14,0,71,10],
+"structnetconn.html#abe796060bb06e585333ca9a87862b624":[14,0,71,1],
+"structnetconn.html#ad08c5613a3a6fa9fe569b4acf30973f8":[14,0,71,6],
+"structnetif.html":[14,0,72],
+"structnetif.html#a1513e81d02557d2a950e965f18b53a45":[14,0,72,26],
+"structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971":[14,0,72,27],
+"structnetif.html#a1c171db6097bbb6f09f63549a66e00ea":[14,0,72,0],
+"structnetif.html#a26f6e26d4a54c998716c10b7b85c8230":[14,0,72,7],
+"structnetif.html#a32fca6ffd28bb9af3f891a378827a67e":[14,0,72,18],
+"structnetif.html#a4388cfadc8b4e9a9c1c93ce777bc3673":[14,0,72,10],
+"structnetif.html#a54e81344084e9840a51cc4abab3b059b":[14,0,72,6],
+"structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3":[14,0,72,25],
+"structnetif.html#a8e1dcfe65db487feecd244355f39215e":[14,0,72,21],
+"structnetif.html#a8fe4f1b7b0d710216287da9615164a5c":[14,0,72,4],
+"structnetif.html#a908452e854180941054ed89f52bb8094":[14,0,72,11],
+"structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866":[14,0,72,9],
+"structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6":[14,0,72,24],
+"structnetif.html#ab32cbe1851154fd020bac4be558f5fd5":[14,0,72,14],
+"structnetif.html#ab7ef01e505dd2feb781fe86756b1c973":[14,0,72,20],
+"structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4":[14,0,72,5],
+"structnetif.html#abc67963ff9f574e98ef9c50138a3e470":[14,0,72,15],
+"structnetif.html#ac38383379cff22c402156fec71c19617":[14,0,72,22],
+"structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48":[14,0,72,16],
+"structnetif.html#acaaac9b415a7be73eb8a287c8ed18a8d":[14,0,72,13],
+"structnetif.html#acd78fca5dad6468605f38e327b3a5e72":[14,0,72,17],
+"structnetif.html#ad0ee2a2169e384a2977ece2c471e0062":[14,0,72,12],
+"structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f":[14,0,72,8],
+"structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07":[14,0,72,23],
+"structnetif.html#ae64e56581bf0f136601f24c5395c19f0":[14,0,72,3],
+"structnetif.html#ae77736b64df442242795220d76be6b86":[14,0,72,19],
+"structnetif.html#aee967965d999fc1a4c40a66709304e69":[14,0,72,1],
+"structnetif.html#afe1181561cb16241f3cb5ed01e567d42":[14,0,72,2],
+"structnetif__ext__callback__args__t_1_1ipv4__changed__s.html":[13,2,0,3,5,0],
+"structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade":[13,2,0,3,5,0,0],
+"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html":[13,2,0,3,5,1],
+"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776":[13,2,0,3,5,1,2],
+"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17":[13,2,0,3,5,1,1],
+"structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f":[13,2,0,3,5,1,0],
+"structnetif__ext__callback__args__t_1_1ipv6__set__s.html":[13,2,0,3,5,2],
+"structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226":[13,2,0,3,5,2,1],
+"structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd":[13,2,0,3,5,2,0],
+"structnetif__ext__callback__args__t_1_1link__changed__s.html":[13,2,0,3,5,3],
+"structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c":[13,2,0,3,5,3,0],
+"structnetif__ext__callback__args__t_1_1status__changed__s.html":[13,2,0,3,5,4],
+"structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7":[13,2,0,3,5,4,0],
+"structnetvector.html":[14,0,74],
+"structnetvector.html#a523362737ea7764f9aaa73a050a0b983":[14,0,74,1],
+"structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd":[14,0,74,0],
+"structns__header.html":[14,0,75],
+"structpbuf.html":[14,0,76],
+"structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f":[14,0,76,6]
 };
diff --git a/doc/doxygen/output/html/navtreeindex11.js b/doc/doxygen/output/html/navtreeindex11.js
index 90088b9..3028704 100644
--- a/doc/doxygen/output/html/navtreeindex11.js
+++ b/doc/doxygen/output/html/navtreeindex11.js
@@ -1,158 +1,253 @@
 var NAVTREEINDEX11 =
 {
-"tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c":[14,0,0,2,17,36],
-"tcp_8c.html#a421fb42ef919018e14ae413adfee9905":[14,0,0,2,17,40],
-"tcp_8c.html#a44fc672b9d14a65e61040707c45302ba":[14,0,0,2,17,27],
-"tcp_8c.html#a4d0c2d1ad02134c79fc72fe95ee2a703":[14,0,0,2,17,23],
-"tcp_8c.html#a51515507dec664e9d69a870e6b627610":[14,0,0,2,17,47],
-"tcp_8c.html#a51de4ded7d342456d31722493c92c969":[14,0,0,2,17,20],
-"tcp_8c.html#a5265b1df024d04287ed3edc02b1b9ccc":[14,0,0,2,17,15],
-"tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547":[14,0,0,2,17,42],
-"tcp_8c.html#a6d2c254b779db4e517cb34e41301588d":[14,0,0,2,17,43],
-"tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911":[14,0,0,2,17,44],
-"tcp_8c.html#a9384b436de95d5bf8550438b9d3c8cd4":[14,0,0,2,17,34],
-"tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81":[14,0,0,2,17,46],
-"tcp_8c.html#a9a4cb4f0391916cea723b5b5a11df2bb":[14,0,0,2,17,3],
-"tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3":[14,0,0,2,17,48],
-"tcp_8c.html#aa2b6b075c27c64dfb8c402ac961fb910":[14,0,0,2,17,19],
-"tcp_8c.html#aaaef096f6a03bf5b778329bb66ee06f6":[14,0,0,2,17,28],
-"tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d":[14,0,0,2,17,18],
-"tcp_8c.html#ac6283651b26f74dba2444159aee88b20":[14,0,0,2,17,35],
-"tcp_8c.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe":[14,0,0,2,17,0],
-"tcp_8c.html#afd5dc2fa74855a84b2da642ba31059ea":[14,0,0,2,17,26],
-"tcp_8h.html":[14,0,0,3,1,49],
-"tcp_8h.html#a00517abce6856d6c82f0efebdafb734d":[14,0,0,3,1,49,4],
-"tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55":[14,0,0,3,1,49,6],
-"tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd":[14,0,0,3,1,49,8],
-"tcp_8h.html#a2c4234f1e95b6bde0e84d4ea97ae95bc":[14,0,0,3,1,49,35],
-"tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073":[14,0,0,3,1,49,9],
-"tcp_8h.html#a780cfac08b02c66948ab94ea974202e8":[14,0,0,3,1,49,10],
-"tcp_8h.html#a874630045102fc5f1442704a790c8bb8":[14,0,0,3,1,49,3],
-"tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8":[14,0,0,3,1,49,5],
-"tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18":[14,0,0,3,1,49,11],
-"tcp_8h.html#aba649c5bdf19d47e39643392b6d88588":[14,0,0,3,1,49,7],
-"tcp__in_8c.html":[14,0,0,2,18],
-"tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5":[14,0,0,2,18,1],
-"tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84":[14,0,0,2,18,0],
-"tcp__out_8c.html":[14,0,0,2,19],
-"tcp__out_8c.html#a0d8bb5fc8522515aa35d305774cc5332":[14,0,0,2,19,3],
-"tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39":[14,0,0,2,19,9],
-"tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b":[14,0,0,2,19,0],
-"tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6":[14,0,0,2,19,15],
-"tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4":[14,0,0,2,19,8],
-"tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129":[14,0,0,2,19,1],
-"tcp__out_8c.html#aa7d5d552647d567095876aab202bfd1a":[14,0,0,2,19,2],
-"tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014":[14,0,0,2,19,10],
-"tcp__out_8c.html#ab5ef9c8ab4629eb721987ae316b9f30f":[14,0,0,2,19,7],
-"tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5":[14,0,0,2,19,13],
-"tcp__out_8c.html#adb6ee7b4d59f125cc8bfac3bb5ca3937":[14,0,0,2,19,6],
-"tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996":[14,0,0,2,19,11],
-"tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342":[14,0,0,2,19,12],
-"tcp__out_8c.html#af75fefe4fe509845be156d6e424eb6f1":[14,0,0,2,19,5],
-"tcp__priv_8h.html":[14,0,0,3,1,1,8],
-"tcp__priv_8h.html#a0075b56ad4b0eca7c9d439cf150e1973":[14,0,0,3,1,1,8,19],
-"tcp__priv_8h.html#a08a3b5396c40f32dd8b21e7d63b3e1b3":[14,0,0,3,1,1,8,7],
-"tcp__priv_8h.html#a0cb3f604fc8d20870d8cab291da5701c":[14,0,0,3,1,1,8,20],
-"tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332":[14,0,0,3,1,1,8,14],
-"tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69":[14,0,0,3,1,1,8,3],
-"tcp__priv_8h.html#a1b42a7ac0fc173a42d575f86853d32a8":[14,0,0,3,1,1,8,40],
-"tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39":[14,0,0,3,1,1,8,25],
-"tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb":[14,0,0,3,1,1,8,35],
-"tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c":[14,0,0,3,1,1,8,29],
-"tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905":[14,0,0,3,1,1,8,32],
-"tcp__priv_8h.html#a44fc672b9d14a65e61040707c45302ba":[14,0,0,3,1,1,8,17],
-"tcp__priv_8h.html#a4d0c2d1ad02134c79fc72fe95ee2a703":[14,0,0,3,1,1,8,15],
-"tcp__priv_8h.html#a51de4ded7d342456d31722493c92c969":[14,0,0,3,1,1,8,12],
-"tcp__priv_8h.html#a5265b1df024d04287ed3edc02b1b9ccc":[14,0,0,3,1,1,8,9],
-"tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547":[14,0,0,3,1,1,8,36],
-"tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6":[14,0,0,3,1,1,8,38],
-"tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d":[14,0,0,3,1,1,8,37],
-"tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911":[14,0,0,3,1,1,8,39],
-"tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249":[14,0,0,3,1,1,8,34],
-"tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4":[14,0,0,3,1,1,8,27],
-"tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81":[14,0,0,3,1,1,8,41],
-"tcp__priv_8h.html#a9a4cb4f0391916cea723b5b5a11df2bb":[14,0,0,3,1,1,8,6],
-"tcp__priv_8h.html#a9a522a66c5e1f1a4e28fe7a672cc64e3":[14,0,0,3,1,1,8,43],
-"tcp__priv_8h.html#a9ef9dc094e21bdf0779aed25ab0b08d4":[14,0,0,3,1,1,8,24],
-"tcp__priv_8h.html#aa2b6b075c27c64dfb8c402ac961fb910":[14,0,0,3,1,1,8,11],
-"tcp__priv_8h.html#aa7d5d552647d567095876aab202bfd1a":[14,0,0,3,1,1,8,8],
-"tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014":[14,0,0,3,1,1,8,26],
-"tcp__priv_8h.html#aaaef096f6a03bf5b778329bb66ee06f6":[14,0,0,3,1,1,8,18],
-"tcp__priv_8h.html#ab5ef9c8ab4629eb721987ae316b9f30f":[14,0,0,3,1,1,8,23],
-"tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8":[14,0,0,3,1,1,8,0],
-"tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d":[14,0,0,3,1,1,8,10],
-"tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20":[14,0,0,3,1,1,8,28],
-"tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5":[14,0,0,3,1,1,8,33],
-"tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990":[14,0,0,3,1,1,8,4],
-"tcp__priv_8h.html#adb6ee7b4d59f125cc8bfac3bb5ca3937":[14,0,0,3,1,1,8,22],
-"tcp__priv_8h.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe":[14,0,0,3,1,1,8,5],
-"tcp__priv_8h.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5":[14,0,0,3,1,1,8,13],
-"tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee":[14,0,0,3,1,1,8,1],
-"tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996":[14,0,0,3,1,1,8,30],
-"tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342":[14,0,0,3,1,1,8,31],
-"tcp__priv_8h.html#af5e1079ab223e1cb27208c45e3c84df7":[14,0,0,3,1,1,8,42],
-"tcp__priv_8h.html#af75fefe4fe509845be156d6e424eb6f1":[14,0,0,3,1,1,8,21],
-"tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f":[14,0,0,3,1,1,8,2],
-"tcp__priv_8h.html#afd5dc2fa74855a84b2da642ba31059ea":[14,0,0,3,1,1,8,16],
-"tcpbase_8h.html":[14,0,0,3,1,50],
-"tcpip_8c.html":[14,0,0,0,8],
-"tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d":[14,0,0,0,8,11],
-"tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08":[14,0,0,0,8,2],
-"tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c":[14,0,0,0,8,0],
-"tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c":[14,0,0,0,8,1],
-"tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102":[14,0,0,0,8,9],
-"tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d":[14,0,0,0,8,13],
-"tcpip_8h.html":[14,0,0,3,1,51],
-"tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d":[14,0,0,3,1,51,3],
-"tcpip_8h.html#a4700525e737fc025fea4887b172e0c95":[14,0,0,3,1,51,0],
-"tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c":[14,0,0,3,1,51,5],
-"tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c":[14,0,0,3,1,51,6],
-"tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992":[14,0,0,3,1,51,4],
-"tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d":[14,0,0,3,1,51,2],
-"tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102":[14,0,0,3,1,51,13],
-"tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d":[14,0,0,3,1,51,16],
-"tcpip__priv_8h.html":[14,0,0,3,1,1,9],
-"tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d":[14,0,0,3,1,1,9,1],
-"tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08":[14,0,0,3,1,1,9,0],
-"tftp__opts_8h.html":[14,0,0,3,1,0,24],
-"tftp__server_8c.html":[14,0,0,1,9,0],
-"tftp__server_8h.html":[14,0,0,3,1,0,25],
-"timeouts_8c.html":[14,0,0,2,20],
-"timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c":[14,0,0,2,20,3],
-"timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e":[14,0,0,2,20,1],
-"timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249":[14,0,0,2,20,6],
-"timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8":[14,0,0,2,20,2],
-"timeouts_8c.html#a9d01f287a19f20b073d3a1c306ecbfcd":[14,0,0,2,20,8],
-"timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664":[14,0,0,2,20,4],
-"timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6":[14,0,0,2,20,5],
-"timeouts_8c.html#addc06ab816f051a0fe6f280972eed142":[14,0,0,2,20,7],
-"timeouts_8h.html":[14,0,0,3,1,52],
-"timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25":[14,0,0,3,1,52,3],
-"timeouts_8h.html#a3835d5c43cf31662a2b9c99e72788e25":[14,0,0,3,1,52,2],
-"timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c":[14,0,0,3,1,52,7],
-"timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e":[14,0,0,3,1,52,5],
-"timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8":[14,0,0,3,1,52,6],
-"timeouts_8h.html#a9d01f287a19f20b073d3a1c306ecbfcd":[14,0,0,3,1,52,11],
-"timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0":[14,0,0,3,1,52,1],
-"timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664":[14,0,0,3,1,52,8],
-"timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6":[14,0,0,3,1,52,9],
-"timeouts_8h.html#addc06ab816f051a0fe6f280972eed142":[14,0,0,3,1,52,10],
-"topics.html":[12],
-"udp_8c.html":[14,0,0,2,21],
-"udp_8c.html#a7b338a5515606bd51976fbc5bcec9611":[14,0,0,2,21,5],
-"udp_8c.html#ab857f86a0b15d02b864292b161b2c3fc":[14,0,0,2,21,6],
-"udp_8c.html#ae7f7431ce99333577d7b82b26619309e":[14,0,0,2,21,4],
-"udp_8h.html":[14,0,0,3,1,53],
-"udp_8h.html#a7b338a5515606bd51976fbc5bcec9611":[14,0,0,3,1,53,7],
-"udp_8h.html#ab857f86a0b15d02b864292b161b2c3fc":[14,0,0,3,1,53,8],
-"udp_8h.html#ae7f7431ce99333577d7b82b26619309e":[14,0,0,3,1,53,6],
-"udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b":[14,0,0,3,1,53,1],
-"unionnetif__ext__callback__args__t.html":[12,2,0,3,5],
-"unionsnmp__variant__value.html":[13,0,97],
-"unionsockaddr__aligned.html":[13,0,102],
-"upgrading.html":[1],
-"zepif_8c.html":[14,0,0,4,8],
-"zepif_8c.html#a8cae594e71cf385076f7bda166729dcd":[14,0,0,4,8,0],
-"zepif_8h.html":[14,0,0,3,2,10],
-"zerocopyrx.html":[7]
+"structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341":[14,0,76,3],
+"structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131":[14,0,76,7],
+"structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7":[14,0,76,5],
+"structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697":[14,0,76,1],
+"structpbuf.html#a6f82449625e36e294f5d210268c0703f":[14,0,76,2],
+"structpbuf.html#a8d32dc3e964369d4eec638fc37fbc460":[14,0,76,4],
+"structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a":[14,0,76,0],
+"structpbuf__custom.html":[14,0,77],
+"structpbuf__custom.html#a100e338f13464e76b46896647b962ed8":[14,0,77,1],
+"structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9":[14,0,77,0],
+"structpbuf__custom__ref.html":[14,0,78],
+"structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d":[14,0,78,0],
+"structpbuf__custom__ref.html#af5884b6a7031d73406cb9596a51382b7":[14,0,78,1],
+"structpbuf__rom.html":[14,0,79],
+"structpbuf__rom.html#a5cd0dcc590038629644ad775d76230a1":[14,0,79,1],
+"structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7":[14,0,79,0],
+"structraw__pcb.html":[14,0,80],
+"structraw__pcb.html#a2ecc77e919de9bb552d1c70e771e2cad":[14,0,80,1],
+"structraw__pcb.html#a5124a21e1523c774bd76c0eabc7c7ca8":[14,0,80,0],
+"structraw__pcb.html#a963b023239ad97c05536046ed7058a10":[14,0,80,2],
+"structredirect__header.html":[14,0,81],
+"structrs__header.html":[14,0,82],
+"structsmtp__send__request.html":[14,0,83],
+"structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4":[14,0,83,0],
+"structsmtp__session.html":[14,0,84],
+"structsmtp__session.html#a003dfd03ac58252b575a7c965e532461":[14,0,84,1],
+"structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d":[14,0,84,3],
+"structsmtp__session.html#a191b09e7142414a671da82fece888e65":[14,0,84,8],
+"structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b":[14,0,84,6],
+"structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61":[14,0,84,16],
+"structsmtp__session.html#a561389328fb1fefcb4d4d17fd0d43301":[14,0,84,0],
+"structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb":[14,0,84,17],
+"structsmtp__session.html#a5884425cb5ce964d8383b29cc20208d7":[14,0,84,13],
+"structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b":[14,0,84,4],
+"structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402":[14,0,84,15],
+"structsmtp__session.html#a70b3753bc70e65f779279c246617faea":[14,0,84,14],
+"structsmtp__session.html#a7a5a3c00378ce076ce70236525afd431":[14,0,84,9],
+"structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49":[14,0,84,2],
+"structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee":[14,0,84,7],
+"structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7":[14,0,84,11],
+"structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c":[14,0,84,12],
+"structsmtp__session.html#aed9c182738767279c2b58b1e3322db09":[14,0,84,10],
+"structsmtp__session.html#af0544df7a935a092d825d8f2380f970f":[14,0,84,5],
+"structsnmp__leaf__node.html":[14,0,85],
+"structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992":[14,0,85,0],
+"structsnmp__mib.html":[14,0,86],
+"structsnmp__next__oid__state.html":[14,0,87],
+"structsnmp__node.html":[14,0,88],
+"structsnmp__node.html#a1af8e20a688943a419b307bf123b1851":[14,0,88,0],
+"structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271":[14,0,88,1],
+"structsnmp__node__instance.html":[14,0,89],
+"structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd":[14,0,89,8],
+"structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649":[14,0,89,2],
+"structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de":[14,0,89,7],
+"structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac":[14,0,89,4],
+"structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c":[14,0,89,0],
+"structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5":[14,0,89,5],
+"structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834":[14,0,89,9],
+"structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54":[14,0,89,6],
+"structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23":[14,0,89,3],
+"structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9":[14,0,89,1],
+"structsnmp__obj__id.html":[14,0,90],
+"structsnmp__oid__range.html":[14,0,91],
+"structsnmp__scalar__array__node.html":[14,0,92],
+"structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b":[14,0,92,0],
+"structsnmp__scalar__array__node__def.html":[14,0,93],
+"structsnmp__scalar__node.html":[14,0,94],
+"structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1":[14,0,94,0],
+"structsnmp__table__col__def.html":[14,0,95],
+"structsnmp__table__node.html":[14,0,96],
+"structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804":[14,0,96,3],
+"structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18":[14,0,96,1],
+"structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272":[14,0,96,0],
+"structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0":[14,0,96,2],
+"structsnmp__table__simple__node.html":[14,0,97],
+"structsnmp__threadsync__instance.html":[14,0,98],
+"structsnmp__threadsync__node.html":[14,0,99],
+"structsnmp__tree__node.html":[14,0,100],
+"structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386":[14,0,100,0],
+"structsnmp__varbind.html":[14,0,101],
+"structsnmp__varbind.html#a328227d7ae188a0a2feb95f8000aac45":[14,0,101,4],
+"structsnmp__varbind.html#a365abcc1f80d28dc8ffd07193099c760":[14,0,101,2],
+"structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e":[14,0,101,0],
+"structsnmp__varbind.html#ab094577fac6c7cc16ad666c9970cdb85":[14,0,101,5],
+"structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4":[14,0,101,1],
+"structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950":[14,0,101,3],
+"structsnmp__varbind__len.html":[14,0,102],
+"structsntp__msg.html":[14,0,104],
+"structsntp__server.html":[14,0,105],
+"structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d":[14,0,105,0],
+"structsntp__time.html":[14,0,106],
+"structsntp__timestamps.html":[14,0,107],
+"structstats__.html":[14,0,109],
+"structstats__.html#a10bc430163b0e6db91338aded5b7019a":[14,0,109,1],
+"structstats__.html#a25a6b5940e32d53a066aa1bbc2028c03":[14,0,109,2],
+"structstats__.html#a317123da6c92aa9d2fa40e8060357035":[14,0,109,14],
+"structstats__.html#a32ef1aaa427d62a5c7890de0ac23fe86":[14,0,109,15],
+"structstats__.html#a40f5b637d083896a07a3482ede23b7ed":[14,0,109,4],
+"structstats__.html#a626e03d4bded6480582789cfd17d4063":[14,0,109,16],
+"structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c":[14,0,109,9],
+"structstats__.html#a67759c9b0059bf569f9f771df23924eb":[14,0,109,8],
+"structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf":[14,0,109,6],
+"structstats__.html#a81fcccf03ab0d4e31423f39d0c880302":[14,0,109,7],
+"structstats__.html#a877e369c2abef97f13492faa838e2271":[14,0,109,3],
+"structstats__.html#aa52547cb08dc828927494dc485bb69f3":[14,0,109,0],
+"structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc":[14,0,109,10],
+"structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8":[14,0,109,12],
+"structstats__.html#ab348a3a4b593b05d7df1293a06af8adf":[14,0,109,13],
+"structstats__.html#ac001c065c56c26c3952b19b9ce0d5832":[14,0,109,11],
+"structstats__.html#afc0942a5bc26735cf059099636b85336":[14,0,109,5],
+"structstats__igmp.html":[14,0,110],
+"structstats__mem.html":[14,0,111],
+"structstats__mib2.html":[14,0,112],
+"structstats__mib2__netif__ctrs.html":[13,2,0,3,4,0],
+"structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd":[13,2,0,3,4,0,2],
+"structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7":[13,2,0,3,4,0,9],
+"structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471":[13,2,0,3,4,0,10],
+"structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842":[13,2,0,3,4,0,6],
+"structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947":[13,2,0,3,4,0,0],
+"structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e":[13,2,0,3,4,0,3],
+"structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e":[13,2,0,3,4,0,7],
+"structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8":[13,2,0,3,4,0,4],
+"structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa":[13,2,0,3,4,0,5],
+"structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7":[13,2,0,3,4,0,8],
+"structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d":[13,2,0,3,4,0,1],
+"structstats__proto.html":[14,0,114],
+"structstats__sys.html":[14,0,115],
+"structstats__syselem.html":[14,0,116],
+"structt_c_g_i.html":[13,4,1,1],
+"structtcp__ext__arg__callbacks.html":[14,0,118],
+"structtcp__ext__arg__callbacks.html#a86b5816e8285378813963d09272b050a":[14,0,118,1],
+"structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b":[14,0,118,0],
+"structtcp__pcb.html":[14,0,119],
+"structtcp__pcb.html#a0c4f101d55debee0d8fad86a7eb4f76f":[14,0,119,0],
+"structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260":[14,0,119,1],
+"structtcp__pcb__listen.html":[14,0,120],
+"structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34":[14,0,120,1],
+"structtcp__pcb__listen.html#a8a4f7b0551a0c6926a08ea5b6b3d5987":[14,0,120,0],
+"structtftp__context.html":[13,4,9,1],
+"structtftp__context.html#a39cbb84a9c0eaa8ea62d183ba8214519":[13,4,9,1,1],
+"structtftp__context.html#a65d6359e2aac571813c05c61676c01a1":[13,4,9,1,2],
+"structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c":[13,4,9,1,3],
+"structtftp__context.html#a9e6e4ec803ec9597822923369701754d":[13,4,9,1,4],
+"structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65":[13,4,9,1,0],
+"structthreadsync__data.html":[14,0,122],
+"structudp__pcb.html":[14,0,123],
+"structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab":[14,0,123,7],
+"structudp__pcb.html#a1c32c7ebd76898cf8f1227c10d34dbe0":[14,0,123,4],
+"structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d":[14,0,123,0],
+"structudp__pcb.html#a6160ea5e52f0d33e51b16b853ea1cd63":[14,0,123,1],
+"structudp__pcb.html#a8cc805631142eefc5593ae8ba3302d7c":[14,0,123,2],
+"structudp__pcb.html#aaab9255f7f1186aef12d45c9bb90d3f4":[14,0,123,5],
+"structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8":[14,0,123,6],
+"structudp__pcb.html#ac80ae56333b88cea08bfa3563b0dd3cd":[14,0,123,3],
+"structzepif__init.html":[14,0,124],
+"structzepif__init.html#a3d97bf90b6bd4dd8258a3b1caf7890e3":[14,0,124,3],
+"structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d":[14,0,124,0],
+"structzepif__init.html#a851efb99a973348f1064a31b97ce779d":[14,0,124,1],
+"structzepif__init.html#a86c6229ed3010158e601666afe91a286":[14,0,124,2],
+"structzepif__init.html#ad739032585841b126b4c0eab5899d40f":[14,0,124,5],
+"structzepif__init.html#adbe989f1f5cba623d742187def36f02c":[14,0,124,4],
+"sys_8c.html":[15,0,0,2,16],
+"sys_8h.html":[15,0,0,3,1,49],
+"sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8":[15,0,0,3,1,49,10],
+"sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6":[15,0,0,3,1,49,0],
+"sys_8h.html#a84e7e4bc00255aee84e6e7289a985703":[15,0,0,3,1,49,12],
+"sys_8h.html#a9e8ad541356786936f23ab83b8f550cc":[15,0,0,3,1,49,11],
+"sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb":[15,0,0,3,1,49,9],
+"sys_8h.html#ab0571e67edca0132b144106e9b319ef9":[15,0,0,3,1,49,6],
+"sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13":[15,0,0,3,1,49,8],
+"sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b":[15,0,0,3,1,49,4],
+"sys_8h.html#ac89f307e8b360eaf821b461a4f26753a":[15,0,0,3,1,49,18],
+"sys_8h.html#ae293feebb61d36f2db99be53702b8203":[15,0,0,3,1,49,7],
+"sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9":[15,0,0,3,1,49,13],
+"sys_init.html":[9],
+"tcp_8c.html":[15,0,0,2,17],
+"tcp_8c.html#a0075b56ad4b0eca7c9d439cf150e1973":[15,0,0,2,17,30],
+"tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3":[15,0,0,2,17,11],
+"tcp_8c.html#a0cb3f604fc8d20870d8cab291da5701c":[15,0,0,2,17,32],
+"tcp_8c.html#a1b42a7ac0fc173a42d575f86853d32a8":[15,0,0,2,17,45],
+"tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb":[15,0,0,2,17,41],
+"tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c":[15,0,0,2,17,36],
+"tcp_8c.html#a421fb42ef919018e14ae413adfee9905":[15,0,0,2,17,40],
+"tcp_8c.html#a44fc672b9d14a65e61040707c45302ba":[15,0,0,2,17,27],
+"tcp_8c.html#a4d0c2d1ad02134c79fc72fe95ee2a703":[15,0,0,2,17,23],
+"tcp_8c.html#a51515507dec664e9d69a870e6b627610":[15,0,0,2,17,47],
+"tcp_8c.html#a51de4ded7d342456d31722493c92c969":[15,0,0,2,17,20],
+"tcp_8c.html#a5265b1df024d04287ed3edc02b1b9ccc":[15,0,0,2,17,15],
+"tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547":[15,0,0,2,17,42],
+"tcp_8c.html#a6d2c254b779db4e517cb34e41301588d":[15,0,0,2,17,43],
+"tcp_8c.html#a78c09dbae67ccc06b659d9f1a388f911":[15,0,0,2,17,44],
+"tcp_8c.html#a9384b436de95d5bf8550438b9d3c8cd4":[15,0,0,2,17,34],
+"tcp_8c.html#a96fe1350e510d4308ac9969ffb4c9c81":[15,0,0,2,17,46],
+"tcp_8c.html#a9a4cb4f0391916cea723b5b5a11df2bb":[15,0,0,2,17,3],
+"tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3":[15,0,0,2,17,48],
+"tcp_8c.html#aa2b6b075c27c64dfb8c402ac961fb910":[15,0,0,2,17,19],
+"tcp_8c.html#aaaef096f6a03bf5b778329bb66ee06f6":[15,0,0,2,17,28],
+"tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d":[15,0,0,2,17,18],
+"tcp_8c.html#ac6283651b26f74dba2444159aee88b20":[15,0,0,2,17,35],
+"tcp_8c.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe":[15,0,0,2,17,0],
+"tcp_8c.html#afd5dc2fa74855a84b2da642ba31059ea":[15,0,0,2,17,26],
+"tcp_8h.html":[15,0,0,3,1,50],
+"tcp_8h.html#a00517abce6856d6c82f0efebdafb734d":[15,0,0,3,1,50,4],
+"tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55":[15,0,0,3,1,50,6],
+"tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd":[15,0,0,3,1,50,8],
+"tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073":[15,0,0,3,1,50,9],
+"tcp_8h.html#a780cfac08b02c66948ab94ea974202e8":[15,0,0,3,1,50,10],
+"tcp_8h.html#a874630045102fc5f1442704a790c8bb8":[15,0,0,3,1,50,3],
+"tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8":[15,0,0,3,1,50,5],
+"tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18":[15,0,0,3,1,50,11],
+"tcp_8h.html#aba649c5bdf19d47e39643392b6d88588":[15,0,0,3,1,50,7],
+"tcp__in_8c.html":[15,0,0,2,18],
+"tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5":[15,0,0,2,18,1],
+"tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84":[15,0,0,2,18,0],
+"tcp__out_8c.html":[15,0,0,2,19],
+"tcp__out_8c.html#a0d8bb5fc8522515aa35d305774cc5332":[15,0,0,2,19,3],
+"tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39":[15,0,0,2,19,9],
+"tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b":[15,0,0,2,19,0],
+"tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6":[15,0,0,2,19,16],
+"tcp__out_8c.html#a7cf7cbc5aa473de8116dc9f00cbc5d57":[15,0,0,2,19,11],
+"tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4":[15,0,0,2,19,8],
+"tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129":[15,0,0,2,19,1],
+"tcp__out_8c.html#aa7d5d552647d567095876aab202bfd1a":[15,0,0,2,19,2],
+"tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014":[15,0,0,2,19,10],
+"tcp__out_8c.html#ab5ef9c8ab4629eb721987ae316b9f30f":[15,0,0,2,19,7],
+"tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5":[15,0,0,2,19,14],
+"tcp__out_8c.html#adb6ee7b4d59f125cc8bfac3bb5ca3937":[15,0,0,2,19,6],
+"tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996":[15,0,0,2,19,12],
+"tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342":[15,0,0,2,19,13],
+"tcp__out_8c.html#af75fefe4fe509845be156d6e424eb6f1":[15,0,0,2,19,5],
+"tcp__priv_8h.html":[15,0,0,3,1,1,8],
+"tcp__priv_8h.html#a0075b56ad4b0eca7c9d439cf150e1973":[15,0,0,3,1,1,8,19],
+"tcp__priv_8h.html#a08a3b5396c40f32dd8b21e7d63b3e1b3":[15,0,0,3,1,1,8,7],
+"tcp__priv_8h.html#a0cb3f604fc8d20870d8cab291da5701c":[15,0,0,3,1,1,8,20],
+"tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332":[15,0,0,3,1,1,8,14],
+"tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69":[15,0,0,3,1,1,8,3],
+"tcp__priv_8h.html#a1b42a7ac0fc173a42d575f86853d32a8":[15,0,0,3,1,1,8,41],
+"tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39":[15,0,0,3,1,1,8,25],
+"tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb":[15,0,0,3,1,1,8,36],
+"tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c":[15,0,0,3,1,1,8,30],
+"tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905":[15,0,0,3,1,1,8,33],
+"tcp__priv_8h.html#a44fc672b9d14a65e61040707c45302ba":[15,0,0,3,1,1,8,17],
+"tcp__priv_8h.html#a4d0c2d1ad02134c79fc72fe95ee2a703":[15,0,0,3,1,1,8,15],
+"tcp__priv_8h.html#a51de4ded7d342456d31722493c92c969":[15,0,0,3,1,1,8,12],
+"tcp__priv_8h.html#a5265b1df024d04287ed3edc02b1b9ccc":[15,0,0,3,1,1,8,9],
+"tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547":[15,0,0,3,1,1,8,37],
+"tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6":[15,0,0,3,1,1,8,39],
+"tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d":[15,0,0,3,1,1,8,38],
+"tcp__priv_8h.html#a78c09dbae67ccc06b659d9f1a388f911":[15,0,0,3,1,1,8,40],
+"tcp__priv_8h.html#a7cf7cbc5aa473de8116dc9f00cbc5d57":[15,0,0,3,1,1,8,27]
 };
diff --git a/doc/doxygen/output/html/navtreeindex12.js b/doc/doxygen/output/html/navtreeindex12.js
new file mode 100644
index 0000000..b6c4e48
--- /dev/null
+++ b/doc/doxygen/output/html/navtreeindex12.js
@@ -0,0 +1,96 @@
+var NAVTREEINDEX12 =
+{
+"tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249":[15,0,0,3,1,1,8,35],
+"tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4":[15,0,0,3,1,1,8,28],
+"tcp__priv_8h.html#a96fe1350e510d4308ac9969ffb4c9c81":[15,0,0,3,1,1,8,42],
+"tcp__priv_8h.html#a9a4cb4f0391916cea723b5b5a11df2bb":[15,0,0,3,1,1,8,6],
+"tcp__priv_8h.html#a9a522a66c5e1f1a4e28fe7a672cc64e3":[15,0,0,3,1,1,8,44],
+"tcp__priv_8h.html#a9ef9dc094e21bdf0779aed25ab0b08d4":[15,0,0,3,1,1,8,24],
+"tcp__priv_8h.html#aa2b6b075c27c64dfb8c402ac961fb910":[15,0,0,3,1,1,8,11],
+"tcp__priv_8h.html#aa7d5d552647d567095876aab202bfd1a":[15,0,0,3,1,1,8,8],
+"tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014":[15,0,0,3,1,1,8,26],
+"tcp__priv_8h.html#aaaef096f6a03bf5b778329bb66ee06f6":[15,0,0,3,1,1,8,18],
+"tcp__priv_8h.html#ab5ef9c8ab4629eb721987ae316b9f30f":[15,0,0,3,1,1,8,23],
+"tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8":[15,0,0,3,1,1,8,0],
+"tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d":[15,0,0,3,1,1,8,10],
+"tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20":[15,0,0,3,1,1,8,29],
+"tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5":[15,0,0,3,1,1,8,34],
+"tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990":[15,0,0,3,1,1,8,4],
+"tcp__priv_8h.html#adb6ee7b4d59f125cc8bfac3bb5ca3937":[15,0,0,3,1,1,8,22],
+"tcp__priv_8h.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe":[15,0,0,3,1,1,8,5],
+"tcp__priv_8h.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5":[15,0,0,3,1,1,8,13],
+"tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee":[15,0,0,3,1,1,8,1],
+"tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996":[15,0,0,3,1,1,8,31],
+"tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342":[15,0,0,3,1,1,8,32],
+"tcp__priv_8h.html#af5e1079ab223e1cb27208c45e3c84df7":[15,0,0,3,1,1,8,43],
+"tcp__priv_8h.html#af75fefe4fe509845be156d6e424eb6f1":[15,0,0,3,1,1,8,21],
+"tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f":[15,0,0,3,1,1,8,2],
+"tcp__priv_8h.html#afd5dc2fa74855a84b2da642ba31059ea":[15,0,0,3,1,1,8,16],
+"tcpbase_8h.html":[15,0,0,3,1,51],
+"tcpip_8c.html":[15,0,0,0,8],
+"tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d":[15,0,0,0,8,12],
+"tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08":[15,0,0,0,8,2],
+"tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c":[15,0,0,0,8,0],
+"tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c":[15,0,0,0,8,1],
+"tcpip_8c.html#a8d8a2ac0271def71a4ca31b24a31228f":[15,0,0,0,8,4],
+"tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102":[15,0,0,0,8,10],
+"tcpip_8c.html#acd7be2108e9a47fd8f1ab0a49f76241d":[15,0,0,0,8,14],
+"tcpip_8h.html":[15,0,0,3,1,52],
+"tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d":[15,0,0,3,1,52,3],
+"tcpip_8h.html#a4700525e737fc025fea4887b172e0c95":[15,0,0,3,1,52,0],
+"tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c":[15,0,0,3,1,52,5],
+"tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c":[15,0,0,3,1,52,6],
+"tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992":[15,0,0,3,1,52,4],
+"tcpip_8h.html#a8d8a2ac0271def71a4ca31b24a31228f":[15,0,0,3,1,52,8],
+"tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d":[15,0,0,3,1,52,2],
+"tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102":[15,0,0,3,1,52,14],
+"tcpip_8h.html#acd7be2108e9a47fd8f1ab0a49f76241d":[15,0,0,3,1,52,17],
+"tcpip__priv_8h.html":[15,0,0,3,1,1,9],
+"tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d":[15,0,0,3,1,1,9,1],
+"tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08":[15,0,0,3,1,1,9,0],
+"tftp_8c.html":[15,0,0,1,9,0],
+"tftp_8c.html#a5c6cf3de84a0dc990c055d66e574ca70":[15,0,0,1,9,0,2],
+"tftp__client_8h.html":[15,0,0,3,1,0,26],
+"tftp__common_8h.html":[15,0,0,3,1,0,27],
+"tftp__common_8h.html#a5c6cf3de84a0dc990c055d66e574ca70":[15,0,0,3,1,0,27,1],
+"tftp__opts_8h.html":[15,0,0,3,1,0,28],
+"tftp__server_8h.html":[15,0,0,3,1,0,29],
+"timeouts_8c.html":[15,0,0,2,20],
+"timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c":[15,0,0,2,20,3],
+"timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e":[15,0,0,2,20,1],
+"timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249":[15,0,0,2,20,6],
+"timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8":[15,0,0,2,20,2],
+"timeouts_8c.html#a9d01f287a19f20b073d3a1c306ecbfcd":[15,0,0,2,20,8],
+"timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664":[15,0,0,2,20,4],
+"timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6":[15,0,0,2,20,5],
+"timeouts_8c.html#addc06ab816f051a0fe6f280972eed142":[15,0,0,2,20,7],
+"timeouts_8h.html":[15,0,0,3,1,53],
+"timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25":[15,0,0,3,1,53,3],
+"timeouts_8h.html#a3835d5c43cf31662a2b9c99e72788e25":[15,0,0,3,1,53,2],
+"timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c":[15,0,0,3,1,53,7],
+"timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e":[15,0,0,3,1,53,5],
+"timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8":[15,0,0,3,1,53,6],
+"timeouts_8h.html#a9d01f287a19f20b073d3a1c306ecbfcd":[15,0,0,3,1,53,11],
+"timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0":[15,0,0,3,1,53,1],
+"timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664":[15,0,0,3,1,53,8],
+"timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6":[15,0,0,3,1,53,9],
+"timeouts_8h.html#addc06ab816f051a0fe6f280972eed142":[15,0,0,3,1,53,10],
+"topics.html":[13],
+"udp_8c.html":[15,0,0,2,21],
+"udp_8c.html#a7b338a5515606bd51976fbc5bcec9611":[15,0,0,2,21,5],
+"udp_8c.html#ab857f86a0b15d02b864292b161b2c3fc":[15,0,0,2,21,6],
+"udp_8c.html#ae7f7431ce99333577d7b82b26619309e":[15,0,0,2,21,4],
+"udp_8h.html":[15,0,0,3,1,54],
+"udp_8h.html#a7b338a5515606bd51976fbc5bcec9611":[15,0,0,3,1,54,7],
+"udp_8h.html#ab857f86a0b15d02b864292b161b2c3fc":[15,0,0,3,1,54,8],
+"udp_8h.html#ae7f7431ce99333577d7b82b26619309e":[15,0,0,3,1,54,6],
+"udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b":[15,0,0,3,1,54,1],
+"unionnetif__ext__callback__args__t.html":[13,2,0,3,5],
+"unionsnmp__variant__value.html":[14,0,103],
+"unionsockaddr__aligned.html":[14,0,108],
+"upgrading.html":[1],
+"zepif_8c.html":[15,0,0,4,8],
+"zepif_8c.html#a8cae594e71cf385076f7bda166729dcd":[15,0,0,4,8,0],
+"zepif_8h.html":[15,0,0,3,2,10],
+"zerocopyrx.html":[8]
+};
diff --git a/doc/doxygen/output/html/navtreeindex2.js b/doc/doxygen/output/html/navtreeindex2.js
index ac81044..c4a947e 100644
--- a/doc/doxygen/output/html/navtreeindex2.js
+++ b/doc/doxygen/output/html/navtreeindex2.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX2 =
 {
-"group__httpd.html#gac364305cee969a0be43c071722b136e6":[12,4,1,6],
-"group__httpd.html#gaca4357acf5c988b28123bc6f23540380":[12,4,1,9],
-"group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897":[12,4,1,4],
-"group__httpd.html#gaf88dacc4f18d299084cab75252001319":[12,4,1,3],
-"group__httpd.html#gafaedb1911a83854b1e9835132db64409":[12,4,1,7],
-"group__httpd__opts.html":[12,4,1,0],
-"group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a":[12,4,1,0,37],
-"group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43":[12,4,1,0,35],
-"group__httpd__opts.html#ga0d5074965efd40786182287895feb691":[12,4,1,0,20],
-"group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a":[12,4,1,0,12],
-"group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79":[12,4,1,0,16],
-"group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50":[12,4,1,0,8],
-"group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8":[12,4,1,0,21],
-"group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0":[12,4,1,0,30],
-"group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331":[12,4,1,0,19],
-"group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5":[12,4,1,0,31],
-"group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da":[12,4,1,0,1],
-"group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2":[12,4,1,0,2],
-"group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048":[12,4,1,0,0],
-"group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103":[12,4,1,0,6],
-"group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e":[12,4,1,0,32],
-"group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7":[12,4,1,0,17],
-"group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd":[12,4,1,0,36],
-"group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3":[12,4,1,0,23],
-"group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07":[12,4,1,0,33],
-"group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8":[12,4,1,0,25],
-"group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a":[12,4,1,0,29],
-"group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3":[12,4,1,0,24],
-"group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182":[12,4,1,0,10],
-"group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466":[12,4,1,0,28],
-"group__httpd__opts.html#gabb13219495a813fceaafa954a238a924":[12,4,1,0,11],
-"group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a":[12,4,1,0,22],
-"group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949":[12,4,1,0,27],
-"group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c":[12,4,1,0,34],
-"group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63":[12,4,1,0,5],
-"group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860":[12,4,1,0,14],
-"group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc":[12,4,1,0,3],
-"group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5":[12,4,1,0,4],
-"group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd":[12,4,1,0,15],
-"group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c":[12,4,1,0,18],
-"group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0":[12,4,1,0,26],
-"group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9":[12,4,1,0,7],
-"group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c":[12,4,1,0,13],
-"group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441":[12,4,1,0,9],
-"group__iana.html":[12,1,4],
-"group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe":[12,1,4,0],
-"group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0":[12,1,4,1],
-"group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c":[12,1,4,0,0],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22":[12,1,4,1,11],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618":[12,1,4,1,4],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb":[12,1,4,1,5],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050":[12,1,4,1,3],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6":[12,1,4,1,12],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b":[12,1,4,1,10],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40":[12,1,4,1,2],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601":[12,1,4,1,13],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d":[12,1,4,1,1],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88":[12,1,4,1,9],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede":[12,1,4,1,6],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c":[12,1,4,1,0],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3":[12,1,4,1,7],
-"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8":[12,1,4,1,8],
-"group__ieee.html":[12,1,5],
-"group__ieee.html#gab3a7b97666b100584972d158acbbd1f4":[12,1,5,0],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc":[12,1,5,0,11],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f":[12,1,5,0,3],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1":[12,1,5,0,8],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394":[12,1,5,0,15],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5":[12,1,5,0,1],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c":[12,1,5,0,10],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b":[12,1,5,0,2],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569":[12,1,5,0,6],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d":[12,1,5,0,9],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c":[12,1,5,0,7],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc":[12,1,5,0,14],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383":[12,1,5,0,5],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14":[12,1,5,0,12],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79":[12,1,5,0,0],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e":[12,1,5,0,13],
-"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903":[12,1,5,0,4],
-"group__if__api.html":[12,2,2,0],
-"group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be":[12,2,2,0,1],
-"group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d":[12,2,2,0,0],
-"group__igmp.html":[12,2,0,2,0,2],
-"group__igmp.html#ga21c572ba7481ca41eb873923a5346544":[12,2,0,2,0,2,3],
-"group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201":[12,2,0,2,0,2,4],
-"group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6":[12,2,0,2,0,2,2],
-"group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6":[12,2,0,2,0,2,1],
-"group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d":[12,2,0,2,0,2,0],
-"group__infrastructure.html":[12,1],
-"group__infrastructure__errors.html":[12,1,3],
-"group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc":[12,1,3,1],
-"group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb":[12,1,3,0],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63":[12,1,3,1,2],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929":[12,1,3,1,5],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b":[12,1,3,1,8],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5":[12,1,3,1,14],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6":[12,1,3,1,12],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33":[12,1,3,1,10],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a":[12,1,3,1,4],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb":[12,1,3,1,0],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5":[12,1,3,1,15],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd":[12,1,3,1,6],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05":[12,1,3,1,1],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27":[12,1,3,1,11],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91":[12,1,3,1,16],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad":[12,1,3,1,7],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8":[12,1,3,1,3],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5":[12,1,3,1,9],
-"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142":[12,1,3,1,13],
-"group__ip.html":[12,2,0,2],
-"group__ip.html#ga0fa3afc2c00aea346889b476650adee3":[12,2,0,2,6],
-"group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0":[12,2,0,2,2],
-"group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250":[12,2,0,2,4],
-"group__ip.html#gab9d45f846f796bd6ce1e0c780c392765":[12,2,0,2,5],
-"group__ip.html#gaf056aa43789c2964f091f8349bb83730":[12,2,0,2,3],
-"group__ip4.html":[12,2,0,2,0],
-"group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420":[12,2,0,2,0,3],
-"group__ip4addr.html":[12,1,0,0],
-"group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c":[12,1,0,0,3],
-"group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42":[12,1,0,0,1],
-"group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03":[12,1,0,0,2],
-"group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff":[12,1,0,0,0],
-"group__ip6.html":[12,2,0,2,1],
-"group__ip6.html#ga1224b474149331702ae5aec24dd14caa":[12,2,0,2,1,3],
-"group__ip6__zones.html":[12,2,0,2,1,2],
-"group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5":[12,2,0,2,1,2,0],
-"group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe":[12,2,0,2,1,2,15],
-"group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb":[12,2,0,2,1,2,12],
-"group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6":[12,2,0,2,1,2,9],
-"group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4":[12,2,0,2,1,2,3],
-"group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78":[12,2,0,2,1,2,6],
-"group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9":[12,2,0,2,1,2,13],
-"group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90":[12,2,0,2,1,2,5],
-"group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e":[12,2,0,2,1,2,10],
-"group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c":[12,2,0,2,1,2,8],
-"group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9":[12,2,0,2,1,2,2],
-"group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97":[12,2,0,2,1,2,7],
-"group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad":[12,2,0,2,1,2,1],
-"group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b":[12,2,0,2,1,2,14],
-"group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634":[12,2,0,2,1,2,11],
-"group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f":[12,2,0,2,1,2,4],
-"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809":[12,2,0,2,1,2,15,2],
-"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0":[12,2,0,2,1,2,15,1],
-"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8":[12,2,0,2,1,2,15,0],
-"group__ip6addr.html":[12,1,0,1],
-"group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd":[12,1,0,1,2],
-"group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0":[12,1,0,1,0],
-"group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43":[12,1,0,1,1],
-"group__ipaddr.html":[12,1,0],
-"group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04":[12,1,0,7],
-"group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e":[12,1,0,3],
-"group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151":[12,1,0,5],
-"group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef":[12,1,0,6],
-"group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c":[12,1,0,4],
-"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02":[12,1,0,4,1],
-"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e":[12,1,0,4,2],
-"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049":[12,1,0,4,0],
-"group__iperf.html":[12,4,2],
-"group__iperf.html#ga1088722d967f0f465d45fd3b15dde445":[12,4,2,1],
-"group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec":[12,4,2,3],
-"group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456":[12,4,2,2],
-"group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004":[12,4,2,0],
-"group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5":[12,4,2,4],
-"group__lwip.html":[12,0],
-"group__lwip__assertions.html":[12,0,4,0,0],
-"group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41":[12,0,4,0,0,0],
-"group__lwip__nosys.html":[12,0,0],
-"group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9":[12,0,0,2],
-"group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26":[12,0,0,1],
-"group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385":[12,0,0,3],
-"group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff":[12,0,0,0],
-"group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883":[12,0,0,4],
-"group__lwip__opts.html":[12,0,4],
-"group__lwip__opts__arp.html":[12,0,4,4,0],
-"group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1":[12,0,4,4,0,1],
-"group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084":[12,0,4,4,0,7],
-"group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f":[12,0,4,4,0,9],
-"group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7":[12,0,4,4,0,5],
-"group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90":[12,0,4,4,0,6],
-"group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432":[12,0,4,4,0,0],
-"group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58":[12,0,4,4,0,2],
-"group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9":[12,0,4,4,0,3],
-"group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87":[12,0,4,4,0,8],
-"group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276":[12,0,4,4,0,4],
-"group__lwip__opts__autoip.html":[12,0,4,4,3],
-"group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe":[12,0,4,4,3,1],
-"group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2":[12,0,4,4,3,2],
-"group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069":[12,0,4,4,3,0],
-"group__lwip__opts__callback.html":[12,0,4,2],
-"group__lwip__opts__checksum.html":[12,0,4,1,9],
-"group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e":[12,0,4,1,9,2],
-"group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2":[12,0,4,1,9,5],
-"group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004":[12,0,4,1,9,10],
-"group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37":[12,0,4,1,9,4],
-"group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25":[12,0,4,1,9,0],
-"group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013":[12,0,4,1,9,6],
-"group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb":[12,0,4,1,9,8],
-"group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265":[12,0,4,1,9,7],
-"group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c":[12,0,4,1,9,9],
-"group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613":[12,0,4,1,9,11],
-"group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699":[12,0,4,1,9,3],
-"group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d":[12,0,4,1,9,1],
-"group__lwip__opts__debug.html":[12,0,4,0],
-"group__lwip__opts__debugmsg.html":[12,0,4,0,2],
-"group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4":[12,0,4,0,2,35],
-"group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7":[12,0,4,0,2,14],
-"group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15":[12,0,4,0,2,34],
-"group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642":[12,0,4,0,2,23],
-"group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe":[12,0,4,0,2,16],
-"group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4":[12,0,4,0,2,18],
-"group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1":[12,0,4,0,2,32],
-"group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679":[12,0,4,0,2,30],
-"group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697":[12,0,4,0,2,2],
-"group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33":[12,0,4,0,2,13],
-"group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c":[12,0,4,0,2,25],
-"group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934":[12,0,4,0,2,22],
-"group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f":[12,0,4,0,2,33],
-"group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23":[12,0,4,0,2,26],
-"group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c":[12,0,4,0,2,19],
-"group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a":[12,0,4,0,2,12],
-"group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411":[12,0,4,0,2,24],
-"group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160":[12,0,4,0,2,1],
-"group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3":[12,0,4,0,2,10],
-"group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa":[12,0,4,0,2,9],
-"group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a":[12,0,4,0,2,8],
-"group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee":[12,0,4,0,2,5],
-"group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb":[12,0,4,0,2,28],
-"group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857":[12,0,4,0,2,21],
-"group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f":[12,0,4,0,2,6],
-"group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e":[12,0,4,0,2,7],
-"group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d":[12,0,4,0,2,15],
-"group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce":[12,0,4,0,2,11],
-"group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1":[12,0,4,0,2,4],
-"group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662":[12,0,4,0,2,31],
-"group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616":[12,0,4,0,2,17],
-"group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55":[12,0,4,0,2,29],
-"group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25":[12,0,4,0,2,20],
-"group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8":[12,0,4,0,2,27],
-"group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5":[12,0,4,0,2,3],
-"group__lwip__opts__dhcp.html":[12,0,4,4,2],
-"group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83":[12,0,4,4,2,3],
-"group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423":[12,0,4,4,2,2],
-"group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6":[12,0,4,4,2,4],
-"group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9":[12,0,4,4,2,1],
-"group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2":[12,0,4,4,2,5],
-"group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69":[12,0,4,4,2,0],
-"group__lwip__opts__dhcpv6.html":[12,0,4,7,3],
-"group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6":[12,0,4,7,3,3],
-"group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155":[12,0,4,7,3,4]
+"group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd":[13,4,0,3],
+"group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c":[13,4,0,1],
+"group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472":[13,4,0,2],
+"group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2":[13,4,0,0],
+"group__httpc.html#ga49e34884b272b1e0ddae8da46c31d9a3":[13,4,0,5],
+"group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b":[13,4,0,6],
+"group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6":[13,4,0,7],
+"group__httpc.html#gaeef5c7398d07b644c0d5593f3b7d1392":[13,4,0,4],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62":[13,4,0,5,7],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd":[13,4,0,5,1],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096":[13,4,0,5,9],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6":[13,4,0,5,4],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33":[13,4,0,5,5],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8":[13,4,0,5,6],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09":[13,4,0,5,2],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867":[13,4,0,5,8],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d":[13,4,0,5,3],
+"group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659":[13,4,0,5,0],
+"group__httpd.html":[13,4,1],
+"group__httpd.html#ga461409c8813c2a82ba63fde987c0e537":[13,4,1,11],
+"group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5":[13,4,1,10],
+"group__httpd.html#ga693032b00bb572d131de09116c822f3b":[13,4,1,2],
+"group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582":[13,4,1,8],
+"group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c":[13,4,1,5],
+"group__httpd.html#gac364305cee969a0be43c071722b136e6":[13,4,1,6],
+"group__httpd.html#gaca4357acf5c988b28123bc6f23540380":[13,4,1,9],
+"group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897":[13,4,1,4],
+"group__httpd.html#gaf88dacc4f18d299084cab75252001319":[13,4,1,3],
+"group__httpd.html#gafaedb1911a83854b1e9835132db64409":[13,4,1,7],
+"group__httpd__opts.html":[13,4,1,0],
+"group__httpd__opts.html#ga006baa7219cff5ee02f5a14ef7d7c89d":[13,4,1,0,30],
+"group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a":[13,4,1,0,39],
+"group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43":[13,4,1,0,37],
+"group__httpd__opts.html#ga0d5074965efd40786182287895feb691":[13,4,1,0,21],
+"group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a":[13,4,1,0,12],
+"group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79":[13,4,1,0,16],
+"group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50":[13,4,1,0,8],
+"group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8":[13,4,1,0,22],
+"group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0":[13,4,1,0,32],
+"group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331":[13,4,1,0,20],
+"group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5":[13,4,1,0,33],
+"group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da":[13,4,1,0,1],
+"group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2":[13,4,1,0,2],
+"group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048":[13,4,1,0,0],
+"group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103":[13,4,1,0,6],
+"group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e":[13,4,1,0,34],
+"group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7":[13,4,1,0,17],
+"group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd":[13,4,1,0,38],
+"group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3":[13,4,1,0,24],
+"group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07":[13,4,1,0,35],
+"group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8":[13,4,1,0,26],
+"group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a":[13,4,1,0,31],
+"group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3":[13,4,1,0,25],
+"group__httpd__opts.html#gaa3648a9fdefe3ab1c890b715a4786429":[13,4,1,0,18],
+"group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182":[13,4,1,0,10],
+"group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466":[13,4,1,0,29],
+"group__httpd__opts.html#gabb13219495a813fceaafa954a238a924":[13,4,1,0,11],
+"group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a":[13,4,1,0,23],
+"group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949":[13,4,1,0,28],
+"group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c":[13,4,1,0,36],
+"group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63":[13,4,1,0,5],
+"group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860":[13,4,1,0,14],
+"group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc":[13,4,1,0,3],
+"group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5":[13,4,1,0,4],
+"group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd":[13,4,1,0,15],
+"group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c":[13,4,1,0,19],
+"group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0":[13,4,1,0,27],
+"group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9":[13,4,1,0,7],
+"group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c":[13,4,1,0,13],
+"group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441":[13,4,1,0,9],
+"group__iana.html":[13,1,4],
+"group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe":[13,1,4,0],
+"group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0":[13,1,4,1],
+"group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c":[13,1,4,0,0],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22":[13,1,4,1,11],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618":[13,1,4,1,4],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb":[13,1,4,1,5],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050":[13,1,4,1,3],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6":[13,1,4,1,12],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b":[13,1,4,1,10],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40":[13,1,4,1,2],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601":[13,1,4,1,13],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d":[13,1,4,1,1],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88":[13,1,4,1,9],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede":[13,1,4,1,6],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c":[13,1,4,1,0],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3":[13,1,4,1,7],
+"group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8":[13,1,4,1,8],
+"group__ieee.html":[13,1,5],
+"group__ieee.html#gab3a7b97666b100584972d158acbbd1f4":[13,1,5,0],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc":[13,1,5,0,11],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f":[13,1,5,0,3],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1":[13,1,5,0,8],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394":[13,1,5,0,15],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5":[13,1,5,0,1],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c":[13,1,5,0,10],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b":[13,1,5,0,2],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569":[13,1,5,0,6],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d":[13,1,5,0,9],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c":[13,1,5,0,7],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc":[13,1,5,0,14],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383":[13,1,5,0,5],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14":[13,1,5,0,12],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79":[13,1,5,0,0],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e":[13,1,5,0,13],
+"group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903":[13,1,5,0,4],
+"group__if__api.html":[13,2,2,0],
+"group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be":[13,2,2,0,1],
+"group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d":[13,2,2,0,0],
+"group__igmp.html":[13,2,0,2,0,3],
+"group__igmp.html#ga21c572ba7481ca41eb873923a5346544":[13,2,0,2,0,3,3],
+"group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201":[13,2,0,2,0,3,4],
+"group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6":[13,2,0,2,0,3,2],
+"group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6":[13,2,0,2,0,3,1],
+"group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d":[13,2,0,2,0,3,0],
+"group__infrastructure.html":[13,1],
+"group__infrastructure__errors.html":[13,1,3],
+"group__infrastructure__errors.html#gae2e66c7d13afc90ffecd6151680fbadc":[13,1,3,1],
+"group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb":[13,1,3,0],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca05c91366f1b5203a5db9a241b415cd63":[13,1,3,1,2],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca13e1dd0edca8a27b6abdf1524bde7929":[13,1,3,1,5],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca4ebdc2aa1dbd75f927845733a3fb1f8b":[13,1,3,1,8],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca759030525f1768a23dc086a5fd45b4e5":[13,1,3,1,14],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca7d61d90449ae6788575e8e46d5d3bbc6":[13,1,3,1,12],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca8543e1d6422fed7b318d97e08dcbaa33":[13,1,3,1,10],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadca9448893187313c0c5a502ca9a9ad1c2a":[13,1,3,1,4],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb":[13,1,3,1,0],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa5176d9fecf8ec43d3bc49f4e6c3f7f5":[13,1,3,1,15],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa9a1c5a6fdeed0aad7fe41d538482bbd":[13,1,3,1,6],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaaaeafdbf3aecc46864daa3cd829c7e05":[13,1,3,1,1],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab0036c51817b5200bfe8157cc4115b27":[13,1,3,1,11],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab508ce0ebdf3ca735208b00a80a45c91":[13,1,3,1,16],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad":[13,1,3,1,7],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcac568baeb6407ef5e2630084ccbc34be8":[13,1,3,1,3],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcae6f9c1e4c18ca844f7934307d4cc30e5":[13,1,3,1,9],
+"group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaf316b2c5eee4079820f7100849115142":[13,1,3,1,13],
+"group__ip.html":[13,2,0,2],
+"group__ip.html#ga0fa3afc2c00aea346889b476650adee3":[13,2,0,2,6],
+"group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0":[13,2,0,2,2],
+"group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250":[13,2,0,2,4],
+"group__ip.html#gab9d45f846f796bd6ce1e0c780c392765":[13,2,0,2,5],
+"group__ip.html#gaf056aa43789c2964f091f8349bb83730":[13,2,0,2,3],
+"group__ip4.html":[13,2,0,2,0],
+"group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420":[13,2,0,2,0,4],
+"group__ip4addr.html":[13,1,0,0],
+"group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c":[13,1,0,0,3],
+"group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42":[13,1,0,0,1],
+"group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03":[13,1,0,0,2],
+"group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff":[13,1,0,0,0],
+"group__ip6.html":[13,2,0,2,1],
+"group__ip6.html#ga1224b474149331702ae5aec24dd14caa":[13,2,0,2,1,3],
+"group__ip6__zones.html":[13,2,0,2,1,2],
+"group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5":[13,2,0,2,1,2,0],
+"group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe":[13,2,0,2,1,2,16],
+"group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb":[13,2,0,2,1,2,13],
+"group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6":[13,2,0,2,1,2,9],
+"group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4":[13,2,0,2,1,2,3],
+"group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78":[13,2,0,2,1,2,6],
+"group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9":[13,2,0,2,1,2,14],
+"group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90":[13,2,0,2,1,2,5],
+"group__ip6__zones.html#gabc6d5f833b2abef31aa602dc11ace0a9":[13,2,0,2,1,2,12],
+"group__ip6__zones.html#gac01d0bad0a682dcc239ba3d5695e0648":[13,2,0,2,1,2,2],
+"group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e":[13,2,0,2,1,2,10],
+"group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c":[13,2,0,2,1,2,8],
+"group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97":[13,2,0,2,1,2,7],
+"group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad":[13,2,0,2,1,2,1],
+"group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b":[13,2,0,2,1,2,15],
+"group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634":[13,2,0,2,1,2,11],
+"group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f":[13,2,0,2,1,2,4],
+"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809":[13,2,0,2,1,2,16,2],
+"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0":[13,2,0,2,1,2,16,1],
+"group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8":[13,2,0,2,1,2,16,0],
+"group__ip6addr.html":[13,1,0,1],
+"group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd":[13,1,0,1,2],
+"group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0":[13,1,0,1,0],
+"group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43":[13,1,0,1,1],
+"group__ipaddr.html":[13,1,0],
+"group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a":[13,1,0,3],
+"group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e":[13,1,0,10],
+"group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04":[13,1,0,20],
+"group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752":[13,1,0,11],
+"group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4":[13,1,0,6],
+"group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e":[13,1,0,16],
+"group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653":[13,1,0,9],
+"group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb":[13,1,0,13],
+"group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151":[13,1,0,18],
+"group__ipaddr.html#ga5b40158bdffa4b0c81c4ee77066e6b28":[13,1,0,5],
+"group__ipaddr.html#ga8ac2686417ec2974bb0b3fc6ee0ee1a7":[13,1,0,14],
+"group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75":[13,1,0,8],
+"group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef":[13,1,0,19],
+"group__ipaddr.html#gabe43b154533b73585c4e58f568370ede":[13,1,0,15],
+"group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05":[13,1,0,7],
+"group__ipaddr.html#gad1bbbe4c93ea2368663e90814953b929":[13,1,0,12],
+"group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4":[13,1,0,4],
+"group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c":[13,1,0,17],
+"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02":[13,1,0,17,1],
+"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e":[13,1,0,17,2],
+"group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049":[13,1,0,17,0],
+"group__iperf.html":[13,4,2],
+"group__iperf.html#ga1088722d967f0f465d45fd3b15dde445":[13,4,2,1],
+"group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec":[13,4,2,3],
+"group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456":[13,4,2,2],
+"group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004":[13,4,2,0],
+"group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5":[13,4,2,4],
+"group__lwip.html":[13,0],
+"group__lwip__assertions.html":[13,0,4,0,0],
+"group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41":[13,0,4,0,0,0],
+"group__lwip__nosys.html":[13,0,0],
+"group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9":[13,0,0,2],
+"group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26":[13,0,0,1],
+"group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385":[13,0,0,3],
+"group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff":[13,0,0,0],
+"group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883":[13,0,0,4],
+"group__lwip__opts.html":[13,0,4],
+"group__lwip__opts__acd.html":[13,0,4,4,4],
+"group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7":[13,0,4,4,4,0],
+"group__lwip__opts__arp.html":[13,0,4,4,0],
+"group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1":[13,0,4,4,0,1],
+"group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084":[13,0,4,4,0,7],
+"group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f":[13,0,4,4,0,9],
+"group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7":[13,0,4,4,0,5],
+"group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90":[13,0,4,4,0,6],
+"group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432":[13,0,4,4,0,0],
+"group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58":[13,0,4,4,0,2],
+"group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9":[13,0,4,4,0,3],
+"group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87":[13,0,4,4,0,8],
+"group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276":[13,0,4,4,0,4],
+"group__lwip__opts__autoip.html":[13,0,4,4,3],
+"group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe":[13,0,4,4,3,1],
+"group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2":[13,0,4,4,3,2],
+"group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069":[13,0,4,4,3,0],
+"group__lwip__opts__callback.html":[13,0,4,2],
+"group__lwip__opts__checksum.html":[13,0,4,1,9],
+"group__lwip__opts__checksum.html#ga005b1b9988b84a2cb844144cef22c11e":[13,0,4,1,9,2],
+"group__lwip__opts__checksum.html#ga2291ec5bec0a551545da6d5f9f9316b2":[13,0,4,1,9,5],
+"group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004":[13,0,4,1,9,10],
+"group__lwip__opts__checksum.html#ga6747f7b72abe544fd4dc184cc7fcad37":[13,0,4,1,9,4],
+"group__lwip__opts__checksum.html#ga79807171be8c20b69a5cd8de83566d25":[13,0,4,1,9,0],
+"group__lwip__opts__checksum.html#ga7cd47a55af03b1048c5a4a5fe0e76013":[13,0,4,1,9,6],
+"group__lwip__opts__checksum.html#ga800069963cc4552b99235237c22f00bb":[13,0,4,1,9,8],
+"group__lwip__opts__checksum.html#ga8ddad81fc26268a13b35091781da2265":[13,0,4,1,9,7],
+"group__lwip__opts__checksum.html#ga98d460f8c2baed8bf62d5473831c0b2c":[13,0,4,1,9,9],
+"group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613":[13,0,4,1,9,11],
+"group__lwip__opts__checksum.html#gab676cc29571b7ffda12336482ad97699":[13,0,4,1,9,3],
+"group__lwip__opts__checksum.html#gaf466a10b093489910a773fd1cec74c2d":[13,0,4,1,9,1],
+"group__lwip__opts__debug.html":[13,0,4,0],
+"group__lwip__opts__debugmsg.html":[13,0,4,0,2],
+"group__lwip__opts__debugmsg.html#ga0393f312c5475a1c649b39ef9cfcaad4":[13,0,4,0,2,36],
+"group__lwip__opts__debugmsg.html#ga2043f599515774f8e571ba185dbcb9e7":[13,0,4,0,2,15],
+"group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15":[13,0,4,0,2,35]
 };
diff --git a/doc/doxygen/output/html/navtreeindex3.js b/doc/doxygen/output/html/navtreeindex3.js
index 17b3e08..5467053 100644
--- a/doc/doxygen/output/html/navtreeindex3.js
+++ b/doc/doxygen/output/html/navtreeindex3.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX3 =
 {
-"group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77":[12,0,4,7,3,0],
-"group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930":[12,0,4,7,3,5],
-"group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29":[12,0,4,7,3,1],
-"group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe":[12,0,4,7,3,2],
-"group__lwip__opts__dns.html":[12,0,4,2,1],
-"group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6":[12,0,4,2,1,0],
-"group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7":[12,0,4,2,1,6],
-"group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124":[12,0,4,2,1,3],
-"group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8":[12,0,4,2,1,2],
-"group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5":[12,0,4,2,1,8],
-"group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646":[12,0,4,2,1,7],
-"group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292":[12,0,4,2,1,5],
-"group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba":[12,0,4,2,1,4],
-"group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659":[12,0,4,2,1,1],
-"group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb":[12,0,4,2,1,9],
-"group__lwip__opts__hooks.html":[12,0,4,1,10],
-"group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4":[12,0,4,1,10,17],
-"group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0":[12,0,4,1,10,18],
-"group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d":[12,0,4,1,10,4],
-"group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f":[12,0,4,1,10,11],
-"group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a":[12,0,4,1,10,15],
-"group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0":[12,0,4,1,10,12],
-"group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e":[12,0,4,1,10,22],
-"group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1":[12,0,4,1,10,3],
-"group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9":[12,0,4,1,10,21],
-"group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f":[12,0,4,1,10,19],
-"group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a":[12,0,4,1,10,0],
-"group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4":[12,0,4,1,10,1],
-"group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70":[12,0,4,1,10,7],
-"group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4":[12,0,4,1,10,20],
-"group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce":[12,0,4,1,10,10],
-"group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6":[12,0,4,1,10,6],
-"group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024":[12,0,4,1,10,8],
-"group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1":[12,0,4,1,10,14],
-"group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2":[12,0,4,1,10,16],
-"group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20":[12,0,4,1,10,9],
-"group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5":[12,0,4,1,10,13],
-"group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d":[12,0,4,1,10,5],
-"group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2":[12,0,4,1,10,2],
-"group__lwip__opts__icmp.html":[12,0,4,4,1],
-"group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9":[12,0,4,4,1,1],
-"group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf":[12,0,4,4,1,0],
-"group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6":[12,0,4,4,1,2],
-"group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661":[12,0,4,4,1,3],
-"group__lwip__opts__icmp6.html":[12,0,4,7,0],
-"group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f":[12,0,4,7,0,0],
-"group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79":[12,0,4,7,0,2],
-"group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf":[12,0,4,7,0,1],
-"group__lwip__opts__igmp.html":[12,0,4,4,4],
-"group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923":[12,0,4,4,4,0],
-"group__lwip__opts__infrastructure.html":[12,0,4,1],
-"group__lwip__opts__ipv4.html":[12,0,4,4],
-"group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384":[12,0,4,4,13],
-"group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db":[12,0,4,4,14],
-"group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69":[12,0,4,4,12],
-"group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394":[12,0,4,4,10],
-"group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410":[12,0,4,4,15],
-"group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411":[12,0,4,4,5],
-"group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59":[12,0,4,4,6],
-"group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7":[12,0,4,4,7],
-"group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933":[12,0,4,4,9],
-"group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b":[12,0,4,4,11],
-"group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4":[12,0,4,4,8],
-"group__lwip__opts__ipv6.html":[12,0,4,7],
-"group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3":[12,0,4,7,11],
-"group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c":[12,0,4,7,15],
-"group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858":[12,0,4,7,6],
-"group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03":[12,0,4,7,7],
-"group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b":[12,0,4,7,14],
-"group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f":[12,0,4,7,5],
-"group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969":[12,0,4,7,4],
-"group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5":[12,0,4,7,13],
-"group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3":[12,0,4,7,10],
-"group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32":[12,0,4,7,9],
-"group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864":[12,0,4,7,12],
-"group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb":[12,0,4,7,8],
-"group__lwip__opts__lock.html":[12,0,4,1,3],
-"group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf":[12,0,4,1,3,4],
-"group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75":[12,0,4,1,3,0],
-"group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011":[12,0,4,1,3,3],
-"group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e":[12,0,4,1,3,1],
-"group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959":[12,0,4,1,3,5],
-"group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9":[12,0,4,1,3,2],
-"group__lwip__opts__loop.html":[12,0,4,6,0],
-"group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300":[12,0,4,6,0,2],
-"group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01":[12,0,4,6,0,3],
-"group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5":[12,0,4,6,0,4],
-"group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf":[12,0,4,6,0,0],
-"group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea":[12,0,4,6,0,1],
-"group__lwip__opts__mem.html":[12,0,4,1,4],
-"group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff":[12,0,4,1,4,11],
-"group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2":[12,0,4,1,4,0],
-"group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3":[12,0,4,1,4,10],
-"group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c":[12,0,4,1,4,5],
-"group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8":[12,0,4,1,4,2],
-"group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b":[12,0,4,1,4,12],
-"group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3":[12,0,4,1,4,4],
-"group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7":[12,0,4,1,4,1],
-"group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0":[12,0,4,1,4,8],
-"group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82":[12,0,4,1,4,7],
-"group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba":[12,0,4,1,4,6],
-"group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e":[12,0,4,1,4,3],
-"group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38":[12,0,4,1,4,9],
-"group__lwip__opts__memcpy.html":[12,0,4,1,2],
-"group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863":[12,0,4,1,2,1],
-"group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec":[12,0,4,1,2,2],
-"group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6":[12,0,4,1,2,0],
-"group__lwip__opts__memp.html":[12,0,4,1,5],
-"group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a":[12,0,4,1,5,19],
-"group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7":[12,0,4,1,5,3],
-"group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86":[12,0,4,1,5,14],
-"group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630":[12,0,4,1,5,5],
-"group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd":[12,0,4,1,5,1],
-"group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a":[12,0,4,1,5,10],
-"group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb":[12,0,4,1,5,23],
-"group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3":[12,0,4,1,5,13],
-"group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980":[12,0,4,1,5,4],
-"group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e":[12,0,4,1,5,17],
-"group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a":[12,0,4,1,5,24],
-"group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444":[12,0,4,1,5,2],
-"group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be":[12,0,4,1,5,8],
-"group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e":[12,0,4,1,5,18],
-"group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804":[12,0,4,1,5,0],
-"group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893":[12,0,4,1,5,15],
-"group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418":[12,0,4,1,5,12],
-"group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3":[12,0,4,1,5,20],
-"group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0":[12,0,4,1,5,7],
-"group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831":[12,0,4,1,5,22],
-"group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a":[12,0,4,1,5,6],
-"group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456":[12,0,4,1,5,9],
-"group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948":[12,0,4,1,5,16],
-"group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c":[12,0,4,1,5,11],
-"group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c":[12,0,4,1,5,21],
-"group__lwip__opts__mib2.html":[12,0,4,1,6],
-"group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29":[12,0,4,1,6,0],
-"group__lwip__opts__mld6.html":[12,0,4,7,1],
-"group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528":[12,0,4,7,1,0],
-"group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494":[12,0,4,7,1,1],
-"group__lwip__opts__multicast.html":[12,0,4,1,7],
-"group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30":[12,0,4,1,7,0],
-"group__lwip__opts__nd6.html":[12,0,4,7,2],
-"group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f":[12,0,4,7,2,10],
-"group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74":[12,0,4,7,2,12],
-"group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715":[12,0,4,7,2,1],
-"group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9":[12,0,4,7,2,13],
-"group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a":[12,0,4,7,2,9],
-"group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a":[12,0,4,7,2,4],
-"group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df":[12,0,4,7,2,2],
-"group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30":[12,0,4,7,2,3],
-"group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4":[12,0,4,7,2,14],
-"group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16":[12,0,4,7,2,7],
-"group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2":[12,0,4,7,2,15],
-"group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672":[12,0,4,7,2,6],
-"group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9":[12,0,4,7,2,0],
-"group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a":[12,0,4,7,2,8],
-"group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429":[12,0,4,7,2,11],
-"group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691":[12,0,4,7,2,5],
-"group__lwip__opts__netconn.html":[12,0,4,3,0],
-"group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99":[12,0,4,3,0,3],
-"group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4":[12,0,4,3,0,2],
-"group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77":[12,0,4,3,0,0],
-"group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406":[12,0,4,3,0,1],
-"group__lwip__opts__netif.html":[12,0,4,6],
-"group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e":[12,0,4,6,2],
-"group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b":[12,0,4,6,5],
-"group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be":[12,0,4,6,10],
-"group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936":[12,0,4,6,9],
-"group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf":[12,0,4,6,6],
-"group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1":[12,0,4,6,3],
-"group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e":[12,0,4,6,8],
-"group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9":[12,0,4,6,4],
-"group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77":[12,0,4,6,1],
-"group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36":[12,0,4,6,7],
-"group__lwip__opts__nosys.html":[12,0,4,1,0],
-"group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b":[12,0,4,1,0,0],
-"group__lwip__opts__pbuf.html":[12,0,4,5],
-"group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685":[12,0,4,5,3],
-"group__lwip__opts__pbuf.html#ga3b7067723b378457373722ca1a46a9d6":[12,0,4,5,0],
-"group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de":[12,0,4,5,2],
-"group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38":[12,0,4,5,1],
-"group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5":[12,0,4,5,4],
-"group__lwip__opts__perf.html":[12,0,4,0,3],
-"group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de":[12,0,4,0,3,0],
-"group__lwip__opts__raw.html":[12,0,4,2,0],
-"group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c":[12,0,4,2,0,1],
-"group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221":[12,0,4,2,0,0],
-"group__lwip__opts__socket.html":[12,0,4,3,1],
-"group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762":[12,0,4,3,1,1],
-"group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28":[12,0,4,3,1,4],
-"group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58":[12,0,4,3,1,7],
-"group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f":[12,0,4,3,1,8],
-"group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36":[12,0,4,3,1,12],
-"group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402":[12,0,4,3,1,2],
-"group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942":[12,0,4,3,1,6],
-"group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d":[12,0,4,3,1,14],
-"group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb":[12,0,4,3,1,11],
-"group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200":[12,0,4,3,1,10],
-"group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77":[12,0,4,3,1,13],
-"group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed":[12,0,4,3,1,5],
-"group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d":[12,0,4,3,1,3],
-"group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e":[12,0,4,3,1,9],
-"group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44":[12,0,4,3,1,16],
-"group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942":[12,0,4,3,1,15],
-"group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447":[12,0,4,3,1,0],
-"group__lwip__opts__stats.html":[12,0,4,0,1],
-"group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218":[12,0,4,0,1,16],
-"group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275":[12,0,4,0,1,0],
-"group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b":[12,0,4,0,1,2],
-"group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740":[12,0,4,0,1,3],
-"group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b":[12,0,4,0,1,9],
-"group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f":[12,0,4,0,1,13],
-"group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7":[12,0,4,0,1,11],
-"group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2":[12,0,4,0,1,5],
-"group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0":[12,0,4,0,1,1],
-"group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf":[12,0,4,0,1,15],
-"group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58":[12,0,4,0,1,17],
-"group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b":[12,0,4,0,1,4],
-"group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041":[12,0,4,0,1,12],
-"group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f":[12,0,4,0,1,7],
-"group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1":[12,0,4,0,1,10],
-"group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a":[12,0,4,0,1,8],
-"group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276":[12,0,4,0,1,18],
-"group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e":[12,0,4,0,1,14],
-"group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be":[12,0,4,0,1,6],
-"group__lwip__opts__tcp.html":[12,0,4,2,3],
-"group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6":[12,0,4,2,3,12],
-"group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e":[12,0,4,2,3,15],
-"group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd":[12,0,4,2,3,7],
-"group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77":[12,0,4,2,3,0],
-"group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7":[12,0,4,2,3,2],
-"group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223":[12,0,4,2,3,5],
-"group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6":[12,0,4,2,3,22],
-"group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef":[12,0,4,2,3,16],
-"group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d":[12,0,4,2,3,25],
-"group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698":[12,0,4,2,3,21],
-"group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7":[12,0,4,2,3,24],
-"group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd":[12,0,4,2,3,18],
-"group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530":[12,0,4,2,3,8],
-"group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75":[12,0,4,2,3,17],
-"group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf":[12,0,4,2,3,10],
-"group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d":[12,0,4,2,3,11],
-"group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904":[12,0,4,2,3,19],
-"group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25":[12,0,4,2,3,14],
-"group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9":[12,0,4,2,3,3],
-"group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc":[12,0,4,2,3,4],
-"group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8":[12,0,4,2,3,1],
-"group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5":[12,0,4,2,3,9],
-"group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4":[12,0,4,2,3,23],
-"group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec":[12,0,4,2,3,20],
-"group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b":[12,0,4,2,3,13]
+"group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642":[13,0,4,0,2,24],
+"group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe":[13,0,4,0,2,17],
+"group__lwip__opts__debugmsg.html#ga2dfad02b075a7f9a8791a66fe40864a4":[13,0,4,0,2,19],
+"group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1":[13,0,4,0,2,33],
+"group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679":[13,0,4,0,2,31],
+"group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697":[13,0,4,0,2,3],
+"group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33":[13,0,4,0,2,14],
+"group__lwip__opts__debugmsg.html#ga4f43bb8a430c7a52a1ad5086d3f2803c":[13,0,4,0,2,26],
+"group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934":[13,0,4,0,2,23],
+"group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f":[13,0,4,0,2,34],
+"group__lwip__opts__debugmsg.html#ga5895bee26e8e1a0b89d597e0f2580b23":[13,0,4,0,2,27],
+"group__lwip__opts__debugmsg.html#ga5c3d44a0ec3bb8bd66f776c70d5c6a6c":[13,0,4,0,2,20],
+"group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a":[13,0,4,0,2,13],
+"group__lwip__opts__debugmsg.html#ga66df03d8192cd978d3321a9d68bf5411":[13,0,4,0,2,25],
+"group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160":[13,0,4,0,2,2],
+"group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3":[13,0,4,0,2,11],
+"group__lwip__opts__debugmsg.html#ga87ff0c6077b9a36b05c3fc5b8fae8ad3":[13,0,4,0,2,1],
+"group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa":[13,0,4,0,2,10],
+"group__lwip__opts__debugmsg.html#ga9595904a1cb9bfe0b9b1d958abdc923a":[13,0,4,0,2,9],
+"group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee":[13,0,4,0,2,6],
+"group__lwip__opts__debugmsg.html#ga9f70601fdc1feee490772bf7fcdb74fb":[13,0,4,0,2,29],
+"group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857":[13,0,4,0,2,22],
+"group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f":[13,0,4,0,2,7],
+"group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e":[13,0,4,0,2,8],
+"group__lwip__opts__debugmsg.html#gac095d0e53f5eb5b326b2cccfd071d93d":[13,0,4,0,2,16],
+"group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce":[13,0,4,0,2,12],
+"group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1":[13,0,4,0,2,5],
+"group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662":[13,0,4,0,2,32],
+"group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616":[13,0,4,0,2,18],
+"group__lwip__opts__debugmsg.html#gae7980c7f8eb45cd411bf410ff0a3fc55":[13,0,4,0,2,30],
+"group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25":[13,0,4,0,2,21],
+"group__lwip__opts__debugmsg.html#gaf51dc2563536de56470146749f715ba8":[13,0,4,0,2,28],
+"group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5":[13,0,4,0,2,4],
+"group__lwip__opts__dhcp.html":[13,0,4,4,2],
+"group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83":[13,0,4,4,2,4],
+"group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423":[13,0,4,4,2,1],
+"group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6":[13,0,4,4,2,5],
+"group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9":[13,0,4,4,2,0],
+"group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2":[13,0,4,4,2,6],
+"group__lwip__opts__dhcp.html#gad6b030f8e828666953661578f936e605":[13,0,4,4,2,2],
+"group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55":[13,0,4,4,2,3],
+"group__lwip__opts__dhcpv6.html":[13,0,4,7,3],
+"group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6":[13,0,4,7,3,3],
+"group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155":[13,0,4,7,3,4],
+"group__lwip__opts__dhcpv6.html#ga5d08f76a7472daa7bcfe17343243bd77":[13,0,4,7,3,0],
+"group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930":[13,0,4,7,3,5],
+"group__lwip__opts__dhcpv6.html#ga92c3bc242ad20a5f398c45d332864a29":[13,0,4,7,3,1],
+"group__lwip__opts__dhcpv6.html#gaf3ac8e15d7a67429a02bc2317e16bcfe":[13,0,4,7,3,2],
+"group__lwip__opts__dns.html":[13,0,4,2,1],
+"group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6":[13,0,4,2,1,0],
+"group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7":[13,0,4,2,1,6],
+"group__lwip__opts__dns.html#ga3b01c79902063c170ef57deb72f56124":[13,0,4,2,1,3],
+"group__lwip__opts__dns.html#ga8235a5fb0a1c1cceeee670cf95612ba8":[13,0,4,2,1,2],
+"group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5":[13,0,4,2,1,8],
+"group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646":[13,0,4,2,1,7],
+"group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292":[13,0,4,2,1,5],
+"group__lwip__opts__dns.html#gaab73c241189335435f3f662aa6a00dba":[13,0,4,2,1,4],
+"group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659":[13,0,4,2,1,1],
+"group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb":[13,0,4,2,1,9],
+"group__lwip__opts__hooks.html":[13,0,4,1,10],
+"group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4":[13,0,4,1,10,17],
+"group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0":[13,0,4,1,10,18],
+"group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d":[13,0,4,1,10,4],
+"group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f":[13,0,4,1,10,11],
+"group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a":[13,0,4,1,10,15],
+"group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0":[13,0,4,1,10,12],
+"group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e":[13,0,4,1,10,22],
+"group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1":[13,0,4,1,10,3],
+"group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9":[13,0,4,1,10,21],
+"group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f":[13,0,4,1,10,19],
+"group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a":[13,0,4,1,10,0],
+"group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4":[13,0,4,1,10,1],
+"group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70":[13,0,4,1,10,7],
+"group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4":[13,0,4,1,10,20],
+"group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce":[13,0,4,1,10,10],
+"group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6":[13,0,4,1,10,6],
+"group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024":[13,0,4,1,10,8],
+"group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1":[13,0,4,1,10,14],
+"group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2":[13,0,4,1,10,16],
+"group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20":[13,0,4,1,10,9],
+"group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5":[13,0,4,1,10,13],
+"group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d":[13,0,4,1,10,5],
+"group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2":[13,0,4,1,10,2],
+"group__lwip__opts__icmp.html":[13,0,4,4,1],
+"group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9":[13,0,4,4,1,1],
+"group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf":[13,0,4,4,1,0],
+"group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6":[13,0,4,4,1,2],
+"group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661":[13,0,4,4,1,3],
+"group__lwip__opts__icmp6.html":[13,0,4,7,0],
+"group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f":[13,0,4,7,0,0],
+"group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79":[13,0,4,7,0,2],
+"group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf":[13,0,4,7,0,1],
+"group__lwip__opts__igmp.html":[13,0,4,4,5],
+"group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923":[13,0,4,4,5,0],
+"group__lwip__opts__infrastructure.html":[13,0,4,1],
+"group__lwip__opts__ipv4.html":[13,0,4,4],
+"group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384":[13,0,4,4,14],
+"group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db":[13,0,4,4,15],
+"group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69":[13,0,4,4,13],
+"group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394":[13,0,4,4,11],
+"group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410":[13,0,4,4,16],
+"group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411":[13,0,4,4,6],
+"group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59":[13,0,4,4,7],
+"group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7":[13,0,4,4,8],
+"group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933":[13,0,4,4,10],
+"group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b":[13,0,4,4,12],
+"group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4":[13,0,4,4,9],
+"group__lwip__opts__ipv6.html":[13,0,4,7],
+"group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3":[13,0,4,7,11],
+"group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c":[13,0,4,7,15],
+"group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858":[13,0,4,7,6],
+"group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03":[13,0,4,7,7],
+"group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b":[13,0,4,7,14],
+"group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f":[13,0,4,7,5],
+"group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969":[13,0,4,7,4],
+"group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5":[13,0,4,7,13],
+"group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3":[13,0,4,7,10],
+"group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32":[13,0,4,7,9],
+"group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864":[13,0,4,7,12],
+"group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb":[13,0,4,7,8],
+"group__lwip__opts__lock.html":[13,0,4,1,3],
+"group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf":[13,0,4,1,3,4],
+"group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75":[13,0,4,1,3,0],
+"group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011":[13,0,4,1,3,3],
+"group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e":[13,0,4,1,3,1],
+"group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959":[13,0,4,1,3,5],
+"group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9":[13,0,4,1,3,2],
+"group__lwip__opts__loop.html":[13,0,4,6,0],
+"group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300":[13,0,4,6,0,2],
+"group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01":[13,0,4,6,0,3],
+"group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5":[13,0,4,6,0,4],
+"group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf":[13,0,4,6,0,0],
+"group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea":[13,0,4,6,0,1],
+"group__lwip__opts__mem.html":[13,0,4,1,4],
+"group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff":[13,0,4,1,4,11],
+"group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2":[13,0,4,1,4,0],
+"group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3":[13,0,4,1,4,10],
+"group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c":[13,0,4,1,4,5],
+"group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8":[13,0,4,1,4,2],
+"group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b":[13,0,4,1,4,12],
+"group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3":[13,0,4,1,4,4],
+"group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7":[13,0,4,1,4,1],
+"group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0":[13,0,4,1,4,8],
+"group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82":[13,0,4,1,4,7],
+"group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba":[13,0,4,1,4,6],
+"group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e":[13,0,4,1,4,3],
+"group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38":[13,0,4,1,4,9],
+"group__lwip__opts__memcpy.html":[13,0,4,1,2],
+"group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863":[13,0,4,1,2,1],
+"group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec":[13,0,4,1,2,2],
+"group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6":[13,0,4,1,2,0],
+"group__lwip__opts__memp.html":[13,0,4,1,5],
+"group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a":[13,0,4,1,5,19],
+"group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7":[13,0,4,1,5,3],
+"group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86":[13,0,4,1,5,14],
+"group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630":[13,0,4,1,5,5],
+"group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd":[13,0,4,1,5,1],
+"group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a":[13,0,4,1,5,10],
+"group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb":[13,0,4,1,5,23],
+"group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3":[13,0,4,1,5,13],
+"group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980":[13,0,4,1,5,4],
+"group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e":[13,0,4,1,5,17],
+"group__lwip__opts__memp.html#ga50eaadc4cad0716410332691e382c38a":[13,0,4,1,5,24],
+"group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444":[13,0,4,1,5,2],
+"group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be":[13,0,4,1,5,8],
+"group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e":[13,0,4,1,5,18],
+"group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804":[13,0,4,1,5,0],
+"group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893":[13,0,4,1,5,15],
+"group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418":[13,0,4,1,5,12],
+"group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3":[13,0,4,1,5,20],
+"group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0":[13,0,4,1,5,7],
+"group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831":[13,0,4,1,5,22],
+"group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a":[13,0,4,1,5,6],
+"group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456":[13,0,4,1,5,9],
+"group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948":[13,0,4,1,5,16],
+"group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c":[13,0,4,1,5,11],
+"group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c":[13,0,4,1,5,21],
+"group__lwip__opts__mib2.html":[13,0,4,1,6],
+"group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29":[13,0,4,1,6,0],
+"group__lwip__opts__mld6.html":[13,0,4,7,1],
+"group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528":[13,0,4,7,1,0],
+"group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494":[13,0,4,7,1,1],
+"group__lwip__opts__multicast.html":[13,0,4,1,7],
+"group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30":[13,0,4,1,7,0],
+"group__lwip__opts__nd6.html":[13,0,4,7,2],
+"group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f":[13,0,4,7,2,10],
+"group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74":[13,0,4,7,2,12],
+"group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715":[13,0,4,7,2,1],
+"group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9":[13,0,4,7,2,13],
+"group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a":[13,0,4,7,2,9],
+"group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a":[13,0,4,7,2,4],
+"group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df":[13,0,4,7,2,2],
+"group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30":[13,0,4,7,2,3],
+"group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4":[13,0,4,7,2,14],
+"group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16":[13,0,4,7,2,7],
+"group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2":[13,0,4,7,2,15],
+"group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672":[13,0,4,7,2,6],
+"group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9":[13,0,4,7,2,0],
+"group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a":[13,0,4,7,2,8],
+"group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429":[13,0,4,7,2,11],
+"group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691":[13,0,4,7,2,5],
+"group__lwip__opts__netconn.html":[13,0,4,3,0],
+"group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99":[13,0,4,3,0,3],
+"group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4":[13,0,4,3,0,2],
+"group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77":[13,0,4,3,0,0],
+"group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406":[13,0,4,3,0,1],
+"group__lwip__opts__netif.html":[13,0,4,6],
+"group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e":[13,0,4,6,2],
+"group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b":[13,0,4,6,5],
+"group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be":[13,0,4,6,10],
+"group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936":[13,0,4,6,9],
+"group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf":[13,0,4,6,6],
+"group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1":[13,0,4,6,3],
+"group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e":[13,0,4,6,8],
+"group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9":[13,0,4,6,4],
+"group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77":[13,0,4,6,1],
+"group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36":[13,0,4,6,7],
+"group__lwip__opts__nosys.html":[13,0,4,1,0],
+"group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b":[13,0,4,1,0,0],
+"group__lwip__opts__pbuf.html":[13,0,4,5],
+"group__lwip__opts__pbuf.html#ga35998a3d56af9940e6a80bb372597685":[13,0,4,5,3],
+"group__lwip__opts__pbuf.html#ga3b7067723b378457373722ca1a46a9d6":[13,0,4,5,0],
+"group__lwip__opts__pbuf.html#ga6e1ba1875ae5168a17b53d83597bc1de":[13,0,4,5,2],
+"group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38":[13,0,4,5,1],
+"group__lwip__opts__pbuf.html#gae61f4491d56e805e79b79eb5d35a00e5":[13,0,4,5,4],
+"group__lwip__opts__perf.html":[13,0,4,0,3],
+"group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de":[13,0,4,0,3,0],
+"group__lwip__opts__raw.html":[13,0,4,2,0],
+"group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c":[13,0,4,2,0,1],
+"group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221":[13,0,4,2,0,0],
+"group__lwip__opts__socket.html":[13,0,4,3,1],
+"group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762":[13,0,4,3,1,1],
+"group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28":[13,0,4,3,1,4],
+"group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58":[13,0,4,3,1,7],
+"group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f":[13,0,4,3,1,8],
+"group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36":[13,0,4,3,1,13],
+"group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402":[13,0,4,3,1,2],
+"group__lwip__opts__socket.html#ga524c013ecdd8a45a2949f2a433469e82":[13,0,4,3,1,9],
+"group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942":[13,0,4,3,1,6],
+"group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d":[13,0,4,3,1,15],
+"group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb":[13,0,4,3,1,12],
+"group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200":[13,0,4,3,1,11],
+"group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77":[13,0,4,3,1,14],
+"group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed":[13,0,4,3,1,5],
+"group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d":[13,0,4,3,1,3],
+"group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e":[13,0,4,3,1,10],
+"group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44":[13,0,4,3,1,17],
+"group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942":[13,0,4,3,1,16],
+"group__lwip__opts__socket.html#gafed2811f031822ec5afa1ee211fb7447":[13,0,4,3,1,0],
+"group__lwip__opts__stats.html":[13,0,4,0,1]
 };
diff --git a/doc/doxygen/output/html/navtreeindex4.js b/doc/doxygen/output/html/navtreeindex4.js
index 7bd5485..7427987 100644
--- a/doc/doxygen/output/html/navtreeindex4.js
+++ b/doc/doxygen/output/html/navtreeindex4.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX4 =
 {
-"group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f":[12,0,4,2,3,6],
-"group__lwip__opts__thread.html":[12,0,4,1,8],
-"group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335":[12,0,4,1,8,6],
-"group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7":[12,0,4,1,8,2],
-"group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456":[12,0,4,1,8,4],
-"group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587":[12,0,4,1,8,12],
-"group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435":[12,0,4,1,8,13],
-"group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7":[12,0,4,1,8,1],
-"group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461":[12,0,4,1,8,0],
-"group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb":[12,0,4,1,8,5],
-"group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb":[12,0,4,1,8,7],
-"group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06":[12,0,4,1,8,11],
-"group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0":[12,0,4,1,8,14],
-"group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e":[12,0,4,1,8,9],
-"group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616":[12,0,4,1,8,3],
-"group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258":[12,0,4,1,8,10],
-"group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675":[12,0,4,1,8,8],
-"group__lwip__opts__threadsafe__apis.html":[12,0,4,3],
-"group__lwip__opts__timers.html":[12,0,4,1,1],
-"group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c":[12,0,4,1,1,0],
-"group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815":[12,0,4,1,1,1],
-"group__lwip__opts__udp.html":[12,0,4,2,2],
-"group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61":[12,0,4,2,2,2],
-"group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa":[12,0,4,2,2,0],
-"group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096":[12,0,4,2,2,3],
-"group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3":[12,0,4,2,2,1],
-"group__lwip__os.html":[12,0,1],
-"group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1":[12,0,1,3],
-"group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db":[12,0,1,6],
-"group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666":[12,0,1,5],
-"group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8":[12,0,1,4],
-"group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a":[12,0,1,1],
-"group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd":[12,0,1,2],
-"group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df":[12,0,1,0],
-"group__lwip__os.html#gae510f195171bed8499ae94e264a92717":[12,0,1,7],
-"group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020":[12,0,1,8],
-"group__lwip__version.html":[12,0,3],
-"group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59":[12,0,3,2],
-"group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50":[12,0,3,6],
-"group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034":[12,0,3,4],
-"group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469":[12,0,3,1],
-"group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246":[12,0,3,3],
-"group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b":[12,0,3,0],
-"group__lwip__version.html#gab47e87bc38eef94486db402813183ba7":[12,0,3,7],
-"group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1":[12,0,3,5],
-"group__mdns.html":[12,4,3],
-"group__mdns.html#ga01c85202f4b85edc8b571f2f419db576":[12,4,3,4],
-"group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85":[12,4,3,5],
-"group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad":[12,4,3,6],
-"group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3":[12,4,3,7],
-"group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e":[12,4,3,9],
-"group__mdns.html#ga824e992e94be216c8e059f48f49a59ce":[12,4,3,3],
-"group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a":[12,4,3,11],
-"group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb":[12,4,3,2],
-"group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c":[12,4,3,8],
-"group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec":[12,4,3,1],
-"group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9":[12,4,3,10],
-"group__mdns__opts.html":[12,4,3,0],
-"group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396":[12,4,3,0,2],
-"group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9":[12,4,3,0,0],
-"group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6":[12,4,3,0,1],
-"group__mempool.html":[12,1,1],
-"group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb":[12,1,1,1],
-"group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a":[12,1,1,0],
-"group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41":[12,1,1,3],
-"group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13":[12,1,1,4],
-"group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04":[12,1,1,2],
-"group__mld6.html":[12,2,0,2,1,1],
-"group__mld6.html#ga02a2259082f22c5989a3c929be95e641":[12,2,0,2,1,1,0],
-"group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940":[12,2,0,2,1,1,2],
-"group__mld6.html#ga53560ab6e47163e4888070830bf912a8":[12,2,0,2,1,1,1],
-"group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5":[12,2,0,2,1,1,3],
-"group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22":[12,2,0,2,1,1,4],
-"group__mqtt.html":[12,4,4],
-"group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f":[12,4,4,5],
-"group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f":[12,4,4,4],
-"group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29":[12,4,4,8],
-"group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6":[12,4,4,15],
-"group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029":[12,4,4,3],
-"group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f":[12,4,4,6],
-"group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d":[12,4,4,10],
-"group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5":[12,4,4,13],
-"group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882":[12,4,4,12],
-"group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd":[12,4,4,2],
-"group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7":[12,4,4,14],
-"group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd":[12,4,4,9],
-"group__mqtt.html#gade9850d716e81fde572cb012be795d2f":[12,4,4,16],
-"group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0":[12,4,4,11],
-"group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103":[12,4,4,18],
-"group__mqtt.html#gafdfa0e65b217e92835d35858924565cf":[12,4,4,17],
-"group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81":[12,4,4,7],
-"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1":[12,4,4,10,0],
-"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a":[12,4,4,10,2],
-"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a":[12,4,4,10,4],
-"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd":[12,4,4,10,6],
-"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190":[12,4,4,10,1],
-"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62":[12,4,4,10,7],
-"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a":[12,4,4,10,3],
-"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17":[12,4,4,10,5],
-"group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f":[12,4,4,9,0],
-"group__mqtt__opts.html":[12,4,4,0],
-"group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e":[12,4,4,0,1],
-"group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a":[12,4,4,0,4],
-"group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b":[12,4,4,0,2],
-"group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805":[12,4,4,0,5],
-"group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b":[12,4,4,0,0],
-"group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f":[12,4,4,0,3],
-"group__netbiosns.html":[12,4,5],
-"group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b":[12,4,5,1],
-"group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806":[12,4,5,2],
-"group__netbiosns__opts.html":[12,4,5,0],
-"group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b":[12,4,5,0,1],
-"group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84":[12,4,5,0,0],
-"group__netbuf.html":[12,2,1,0,3],
-"group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b":[12,2,1,0,3,5],
-"group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01":[12,2,1,0,3,2],
-"group__netbuf.html#ga1525001cbea926fdae88b0ac40bd6525":[12,2,1,0,3,0],
-"group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51":[12,2,1,0,3,4],
-"group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602":[12,2,1,0,3,1],
-"group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d":[12,2,1,0,3,3],
-"group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2":[12,2,1,0,3,8],
-"group__netbuf.html#gade8afe4d5b849cec3784708d691be711":[12,2,1,0,3,6],
-"group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715":[12,2,1,0,3,7],
-"group__netconn.html":[12,2,1,0],
-"group__netconn__common.html":[12,2,1,0,0],
-"group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf":[12,2,1,0,0,11],
-"group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230":[12,2,1,0,0,4],
-"group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5":[12,2,1,0,0,5],
-"group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91":[12,2,1,0,0,3],
-"group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c":[12,2,1,0,0,1],
-"group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403":[12,2,1,0,0,7],
-"group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4":[12,2,1,0,0,8],
-"group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77":[12,2,1,0,0,6],
-"group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0":[12,2,1,0,0,10],
-"group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1":[12,2,1,0,0,2],
-"group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31":[12,2,1,0,0,0],
-"group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5":[12,2,1,0,0,9],
-"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9":[12,2,1,0,0,3,8],
-"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e":[12,2,1,0,0,3,7],
-"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e":[12,2,1,0,0,3,5],
-"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4":[12,2,1,0,0,3,3],
-"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636":[12,2,1,0,0,3,2],
-"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a":[12,2,1,0,0,3,0],
-"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de":[12,2,1,0,0,3,4],
-"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7":[12,2,1,0,0,3,6],
-"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013":[12,2,1,0,0,3,1],
-"group__netconn__tcp.html":[12,2,1,0,1],
-"group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69":[12,2,1,0,1,0],
-"group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624":[12,2,1,0,1,1],
-"group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490":[12,2,1,0,1,3],
-"group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63":[12,2,1,0,1,5],
-"group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d":[12,2,1,0,1,2],
-"group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294":[12,2,1,0,1,4],
-"group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf":[12,2,1,0,1,6],
-"group__netconn__udp.html":[12,2,1,0,2],
-"group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b":[12,2,1,0,2,2],
-"group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c":[12,2,1,0,2,4],
-"group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402":[12,2,1,0,2,0],
-"group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed":[12,2,1,0,2,1],
-"group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238":[12,2,1,0,2,3],
-"group__netdbapi.html":[12,2,2,1],
-"group__netif.html":[12,2,0,3],
-"group__netif.html#ga0e755cb6624d3365551eeed5430fa226":[12,2,0,3,14],
-"group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4":[12,2,0,3,21],
-"group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716":[12,2,0,3,18],
-"group__netif.html#ga22055759a25f5d6cea7e7deab0a07434":[12,2,0,3,9],
-"group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce":[12,2,0,3,24],
-"group__netif.html#ga34e37a1e8e358760dc1c43887922c7db":[12,2,0,3,22],
-"group__netif.html#ga3c82d1c742338828b2f4349a75bb84de":[12,2,0,3,12],
-"group__netif.html#ga3efc2b72f75936d50708247420c9d1d9":[12,2,0,3,10],
-"group__netif.html#ga5ee213cea065424c89c66f138c008da1":[12,2,0,3,7],
-"group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf":[12,2,0,3,20],
-"group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2":[12,2,0,3,15],
-"group__netif.html#ga94a4c24c988afc0a577387730f303b19":[12,2,0,3,6],
-"group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979":[12,2,0,3,17],
-"group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a":[12,2,0,3,13],
-"group__netif.html#gab2b9387389513a02027c62e246723808":[12,2,0,3,8],
-"group__netif.html#gac763a1f647fb9e8af4254418e813a6ae":[12,2,0,3,16],
-"group__netif.html#gac90f290edd005238d62aa94c4ac9dea3":[12,2,0,3,19],
-"group__netif.html#gadc8787b23ac0ee023979cbadf87813d4":[12,2,0,3,25],
-"group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea":[12,2,0,3,23],
-"group__netif.html#gaf19693be401a265a52d2a56c65753121":[12,2,0,3,26],
-"group__netif.html#gafcb3925fb117375739abf97f3a856bcd":[12,2,0,3,11],
-"group__netif__cd.html":[12,2,0,3,2],
-"group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5":[12,2,0,3,2,0],
-"group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978":[12,2,0,3,2,2],
-"group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f":[12,2,0,3,2,1],
-"group__netif__flags.html":[12,2,0,3,3],
-"group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8":[12,2,0,3,3,4],
-"group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc":[12,2,0,3,3,2],
-"group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676":[12,2,0,3,3,1],
-"group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508":[12,2,0,3,3,5],
-"group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e":[12,2,0,3,3,6],
-"group__netif__flags.html#gac9493b923d733c73f6006d9714826558":[12,2,0,3,3,3],
-"group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e":[12,2,0,3,3,0],
-"group__netif__ip4.html":[12,2,0,3,0],
-"group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53":[12,2,0,3,0,3],
-"group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca":[12,2,0,3,0,2],
-"group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520":[12,2,0,3,0,1],
-"group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1":[12,2,0,3,0,0],
-"group__netif__ip6.html":[12,2,0,3,1],
-"group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f":[12,2,0,3,1,3],
-"group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327":[12,2,0,3,1,0],
-"group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb":[12,2,0,3,1,2],
-"group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9":[12,2,0,3,1,1],
-"group__netif__mib2.html":[12,2,0,3,4],
-"group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed":[12,2,0,3,4,2],
-"group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba":[12,2,0,3,4,4],
-"group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f":[12,2,0,3,4,3],
-"group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0":[12,2,0,3,4,1],
-"group__netifapi.html":[12,2,1,1],
-"group__netifapi__autoip.html":[12,2,1,1,2],
-"group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2":[12,2,1,1,2,0],
-"group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d":[12,2,1,1,2,1],
-"group__netifapi__dhcp4.html":[12,2,1,1,1],
-"group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134":[12,2,1,1,1,2],
-"group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5":[12,2,1,1,1,5],
-"group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0":[12,2,1,1,1,0],
-"group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409":[12,2,1,1,1,1],
-"group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b":[12,2,1,1,1,3],
-"group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765":[12,2,1,1,1,4],
-"group__netifapi__netif.html":[12,2,1,1,0],
-"group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373":[12,2,1,1,0,0],
-"group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16":[12,2,1,1,0,2],
-"group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4":[12,2,1,1,0,3],
-"group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973":[12,2,1,1,0,9],
-"group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76":[12,2,1,1,0,5],
-"group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf":[12,2,1,1,0,1],
-"group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6":[12,2,1,1,0,7],
-"group__netifapi__netif.html#gac054a60a32447019913d34da63924853":[12,2,1,1,0,4],
-"group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519":[12,2,1,1,0,6],
-"group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089":[12,2,1,1,0,8],
-"group__netifs.html":[12,3],
-"group__pbuf.html":[12,1,2],
-"group__pbuf.html#ga031469589fa95ece3bf1c136d1509eac":[12,1,2,9],
-"group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448":[12,1,2,17],
-"group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974":[12,1,2,16],
-"group__pbuf.html#ga50abfe830a33a1a47a562febee66015d":[12,1,2,19],
-"group__pbuf.html#ga5bcdac7b3aef4d60460ee05dec51db5f":[12,1,2,5],
-"group__pbuf.html#ga6cff29c18a60a7f2828457fa61e3accb":[12,1,2,4],
-"group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6":[12,1,2,14],
-"group__pbuf.html#ga6da6c83929df1b736b107e89faa8a8a2":[12,1,2,15],
-"group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e":[12,1,2,20],
-"group__pbuf.html#ga82429084fe29015509c9b4a072707cd4":[12,1,2,6],
-"group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891":[12,1,2,7],
-"group__pbuf.html#ga839f342803b0cf89049744124c5a98ad":[12,1,2,24],
-"group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3":[12,1,2,0],
-"group__pbuf.html#ga8bb9c5d54a06995b1c67ce695ead9969":[12,1,2,3],
-"group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b":[12,1,2,13],
-"group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb":[12,1,2,2]
+"group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218":[13,0,4,0,1,16],
+"group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275":[13,0,4,0,1,0],
+"group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b":[13,0,4,0,1,2],
+"group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740":[13,0,4,0,1,3],
+"group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b":[13,0,4,0,1,9],
+"group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f":[13,0,4,0,1,13],
+"group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7":[13,0,4,0,1,11],
+"group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2":[13,0,4,0,1,5],
+"group__lwip__opts__stats.html#ga714006cd5c5b0eb333159d0f677616a0":[13,0,4,0,1,1],
+"group__lwip__opts__stats.html#ga753161114df60299a28d51c092c756cf":[13,0,4,0,1,15],
+"group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58":[13,0,4,0,1,17],
+"group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b":[13,0,4,0,1,4],
+"group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041":[13,0,4,0,1,12],
+"group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f":[13,0,4,0,1,7],
+"group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1":[13,0,4,0,1,10],
+"group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a":[13,0,4,0,1,8],
+"group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276":[13,0,4,0,1,18],
+"group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e":[13,0,4,0,1,14],
+"group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be":[13,0,4,0,1,6],
+"group__lwip__opts__tcp.html":[13,0,4,2,3],
+"group__lwip__opts__tcp.html#ga0dee0911197855bdf19ef79778c241a6":[13,0,4,2,3,13],
+"group__lwip__opts__tcp.html#ga1f57d3859c4556f785708e5dc440617e":[13,0,4,2,3,16],
+"group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd":[13,0,4,2,3,8],
+"group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77":[13,0,4,2,3,0],
+"group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7":[13,0,4,2,3,2],
+"group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223":[13,0,4,2,3,5],
+"group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6":[13,0,4,2,3,23],
+"group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef":[13,0,4,2,3,17],
+"group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d":[13,0,4,2,3,26],
+"group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698":[13,0,4,2,3,22],
+"group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7":[13,0,4,2,3,25],
+"group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd":[13,0,4,2,3,19],
+"group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530":[13,0,4,2,3,9],
+"group__lwip__opts__tcp.html#ga89ffd0d7d1529bdb26bfbad267d0ad75":[13,0,4,2,3,18],
+"group__lwip__opts__tcp.html#ga93cce3f47e33df11248c908d1775bacf":[13,0,4,2,3,11],
+"group__lwip__opts__tcp.html#ga98b23e7cbd3281915c50a485cb61899d":[13,0,4,2,3,12],
+"group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904":[13,0,4,2,3,20],
+"group__lwip__opts__tcp.html#ga9d6d3219bb5fc0bc760a64114de13c25":[13,0,4,2,3,15],
+"group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9":[13,0,4,2,3,3],
+"group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc":[13,0,4,2,3,4],
+"group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8":[13,0,4,2,3,1],
+"group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5":[13,0,4,2,3,10],
+"group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4":[13,0,4,2,3,24],
+"group__lwip__opts__tcp.html#gade23373901980c6e7a43cef813386ebe":[13,0,4,2,3,6],
+"group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec":[13,0,4,2,3,21],
+"group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b":[13,0,4,2,3,14],
+"group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f":[13,0,4,2,3,7],
+"group__lwip__opts__thread.html":[13,0,4,1,8],
+"group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335":[13,0,4,1,8,6],
+"group__lwip__opts__thread.html#ga1bd172938b9c8ba63156fcafc87e83c7":[13,0,4,1,8,2],
+"group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456":[13,0,4,1,8,4],
+"group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587":[13,0,4,1,8,12],
+"group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435":[13,0,4,1,8,13],
+"group__lwip__opts__thread.html#ga4ef8f046c957750056131310a1580df7":[13,0,4,1,8,1],
+"group__lwip__opts__thread.html#ga5d5a6e04abe2ec233c7acdb09f992461":[13,0,4,1,8,0],
+"group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb":[13,0,4,1,8,5],
+"group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb":[13,0,4,1,8,7],
+"group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06":[13,0,4,1,8,11],
+"group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0":[13,0,4,1,8,14],
+"group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e":[13,0,4,1,8,9],
+"group__lwip__opts__thread.html#gaca13123a5c8271558353e04123957616":[13,0,4,1,8,3],
+"group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258":[13,0,4,1,8,10],
+"group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675":[13,0,4,1,8,8],
+"group__lwip__opts__threadsafe__apis.html":[13,0,4,3],
+"group__lwip__opts__timers.html":[13,0,4,1,1],
+"group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c":[13,0,4,1,1,0],
+"group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815":[13,0,4,1,1,1],
+"group__lwip__opts__udp.html":[13,0,4,2,2],
+"group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61":[13,0,4,2,2,2],
+"group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa":[13,0,4,2,2,0],
+"group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096":[13,0,4,2,2,3],
+"group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3":[13,0,4,2,2,1],
+"group__lwip__os.html":[13,0,1],
+"group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1":[13,0,1,3],
+"group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db":[13,0,1,6],
+"group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666":[13,0,1,5],
+"group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8":[13,0,1,4],
+"group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a":[13,0,1,1],
+"group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd":[13,0,1,2],
+"group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df":[13,0,1,0],
+"group__lwip__os.html#gae510f195171bed8499ae94e264a92717":[13,0,1,7],
+"group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020":[13,0,1,8],
+"group__lwip__version.html":[13,0,3],
+"group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59":[13,0,3,2],
+"group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50":[13,0,3,6],
+"group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034":[13,0,3,4],
+"group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469":[13,0,3,1],
+"group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246":[13,0,3,3],
+"group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b":[13,0,3,0],
+"group__lwip__version.html#gab47e87bc38eef94486db402813183ba7":[13,0,3,7],
+"group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1":[13,0,3,5],
+"group__mdns.html":[13,4,3],
+"group__mdns.html#ga01c85202f4b85edc8b571f2f419db576":[13,4,3,5],
+"group__mdns.html#ga09b7a259f497648d8ef734b080f997c1":[13,4,3,9],
+"group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac":[13,4,3,16],
+"group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85":[13,4,3,6],
+"group__mdns.html#ga2130111662d044b32970ce9c763bd409":[13,4,3,4],
+"group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737":[13,4,3,14],
+"group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a":[13,4,3,7],
+"group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3":[13,4,3,8],
+"group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e":[13,4,3,3],
+"group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e":[13,4,3,11],
+"group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a":[13,4,3,13],
+"group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c":[13,4,3,10],
+"group__mdns.html#gab1e989a4c7305d754377c76052474beb":[13,4,3,12],
+"group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec":[13,4,3,1],
+"group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725":[13,4,3,15],
+"group__mdns.html#gaee5b489b77b74511517d41f7609ccd49":[13,4,3,2],
+"group__mdns__opts.html":[13,4,3,0],
+"group__mdns__opts.html#ga0f0adf7b1d742b4ea818c1b7f6b0c547":[13,4,3,0,5],
+"group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396":[13,4,3,0,7],
+"group__mdns__opts.html#ga17a9884af8169cf19d57d8005fc3d95e":[13,4,3,0,2],
+"group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9":[13,4,3,0,1],
+"group__mdns__opts.html#ga7f6853d01ad32eb6ce99ae55307a37d9":[13,4,3,0,6],
+"group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6":[13,4,3,0,3],
+"group__mdns__opts.html#ga827d1d2abd24a26638723cfd0a8b9efd":[13,4,3,0,4],
+"group__mdns__opts.html#gaaf489604dcdf94d2adcd723f6c7d7163":[13,4,3,0,0],
+"group__mempool.html":[13,1,1],
+"group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb":[13,1,1,1],
+"group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a":[13,1,1,0],
+"group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41":[13,1,1,3],
+"group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13":[13,1,1,4],
+"group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04":[13,1,1,2],
+"group__mld6.html":[13,2,0,2,1,1],
+"group__mld6.html#ga02a2259082f22c5989a3c929be95e641":[13,2,0,2,1,1,0],
+"group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940":[13,2,0,2,1,1,2],
+"group__mld6.html#ga53560ab6e47163e4888070830bf912a8":[13,2,0,2,1,1,1],
+"group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5":[13,2,0,2,1,1,3],
+"group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22":[13,2,0,2,1,1,4],
+"group__mqtt.html":[13,4,4],
+"group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f":[13,4,4,5],
+"group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f":[13,4,4,4],
+"group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29":[13,4,4,8],
+"group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6":[13,4,4,15],
+"group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029":[13,4,4,3],
+"group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f":[13,4,4,6],
+"group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d":[13,4,4,10],
+"group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5":[13,4,4,13],
+"group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882":[13,4,4,12],
+"group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd":[13,4,4,2],
+"group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7":[13,4,4,14],
+"group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd":[13,4,4,9],
+"group__mqtt.html#gade9850d716e81fde572cb012be795d2f":[13,4,4,16],
+"group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0":[13,4,4,11],
+"group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103":[13,4,4,18],
+"group__mqtt.html#gafdfa0e65b217e92835d35858924565cf":[13,4,4,17],
+"group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81":[13,4,4,7],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1":[13,4,4,10,0],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a":[13,4,4,10,2],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a":[13,4,4,10,4],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd":[13,4,4,10,6],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190":[13,4,4,10,1],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62":[13,4,4,10,7],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a":[13,4,4,10,3],
+"group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17":[13,4,4,10,5],
+"group__mqtt.html#ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f":[13,4,4,9,0],
+"group__mqtt__opts.html":[13,4,4,0],
+"group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e":[13,4,4,0,1],
+"group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a":[13,4,4,0,4],
+"group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b":[13,4,4,0,2],
+"group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805":[13,4,4,0,5],
+"group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b":[13,4,4,0,0],
+"group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f":[13,4,4,0,3],
+"group__netbiosns.html":[13,4,5],
+"group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b":[13,4,5,1],
+"group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806":[13,4,5,2],
+"group__netbiosns__opts.html":[13,4,5,0],
+"group__netbiosns__opts.html#ga468c2ae67a79ce082ee585a438f7373b":[13,4,5,0,1],
+"group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84":[13,4,5,0,0],
+"group__netbuf.html":[13,2,1,0,3],
+"group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b":[13,2,1,0,3,5],
+"group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01":[13,2,1,0,3,2],
+"group__netbuf.html#ga1525001cbea926fdae88b0ac40bd6525":[13,2,1,0,3,0],
+"group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51":[13,2,1,0,3,4],
+"group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602":[13,2,1,0,3,1],
+"group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d":[13,2,1,0,3,3],
+"group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2":[13,2,1,0,3,8],
+"group__netbuf.html#gade8afe4d5b849cec3784708d691be711":[13,2,1,0,3,6],
+"group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715":[13,2,1,0,3,7],
+"group__netconn.html":[13,2,1,0],
+"group__netconn__common.html":[13,2,1,0,0],
+"group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf":[13,2,1,0,0,11],
+"group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230":[13,2,1,0,0,4],
+"group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5":[13,2,1,0,0,5],
+"group__netconn__common.html#gaaba260d28d105fb4bce9185fd0300d91":[13,2,1,0,0,3],
+"group__netconn__common.html#gab2bd1d5e633e14e428cfc0ca908d5e0c":[13,2,1,0,0,1],
+"group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403":[13,2,1,0,0,7],
+"group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4":[13,2,1,0,0,8],
+"group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77":[13,2,1,0,0,6],
+"group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0":[13,2,1,0,0,10],
+"group__netconn__common.html#gae56911e2d92bebf43d73e116530e41f1":[13,2,1,0,0,2],
+"group__netconn__common.html#gaf001c7d5fbf97c04eb1d9ac7d14c9c31":[13,2,1,0,0,0],
+"group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5":[13,2,1,0,0,9],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a0d828a7e9c1614d4cae56602b09f39e9":[13,2,1,0,0,3,8],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a2c7f548d26f6c411f084b6c59247b60e":[13,2,1,0,0,3,7],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a34ee1c89f6705462590a4fe2c9772d9e":[13,2,1,0,0,3,5],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a655e1625cc7e6a93f1e3d2646f56a1e4":[13,2,1,0,0,3,3],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a6b8ec191d69f7e639f4ab40779069636":[13,2,1,0,0,3,2],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a75d14318b91af7a452230189f47e5e1a":[13,2,1,0,0,3,0],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91a7e0c3f566b3d4321b36b711b6b1ad6de":[13,2,1,0,0,3,4],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91aa9cabc9d90606b5c5939fcc02ac588c7":[13,2,1,0,0,3,6],
+"group__netconn__common.html#ggaaba260d28d105fb4bce9185fd0300d91ae7efa7c4e50b7b381531a2136cd5a013":[13,2,1,0,0,3,1],
+"group__netconn__tcp.html":[13,2,1,0,1],
+"group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69":[13,2,1,0,1,0],
+"group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624":[13,2,1,0,1,1],
+"group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490":[13,2,1,0,1,3],
+"group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63":[13,2,1,0,1,5],
+"group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d":[13,2,1,0,1,2],
+"group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294":[13,2,1,0,1,4],
+"group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf":[13,2,1,0,1,6],
+"group__netconn__udp.html":[13,2,1,0,2],
+"group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b":[13,2,1,0,2,2],
+"group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c":[13,2,1,0,2,4],
+"group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402":[13,2,1,0,2,0],
+"group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed":[13,2,1,0,2,1],
+"group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238":[13,2,1,0,2,3],
+"group__netdbapi.html":[13,2,2,1],
+"group__netif.html":[13,2,0,3],
+"group__netif.html#ga0e755cb6624d3365551eeed5430fa226":[13,2,0,3,16],
+"group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4":[13,2,0,3,23],
+"group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716":[13,2,0,3,20],
+"group__netif.html#ga22055759a25f5d6cea7e7deab0a07434":[13,2,0,3,11],
+"group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce":[13,2,0,3,26],
+"group__netif.html#ga3428b3f8195249c6cd8704a4db46b401":[13,2,0,3,7],
+"group__netif.html#ga34e37a1e8e358760dc1c43887922c7db":[13,2,0,3,24],
+"group__netif.html#ga3c82d1c742338828b2f4349a75bb84de":[13,2,0,3,14],
+"group__netif.html#ga3efc2b72f75936d50708247420c9d1d9":[13,2,0,3,12],
+"group__netif.html#ga5ee213cea065424c89c66f138c008da1":[13,2,0,3,9],
+"group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf":[13,2,0,3,22],
+"group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2":[13,2,0,3,17],
+"group__netif.html#ga94a4c24c988afc0a577387730f303b19":[13,2,0,3,6],
+"group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c":[13,2,0,3,8],
+"group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979":[13,2,0,3,19],
+"group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a":[13,2,0,3,15],
+"group__netif.html#gab2b9387389513a02027c62e246723808":[13,2,0,3,10],
+"group__netif.html#gac763a1f647fb9e8af4254418e813a6ae":[13,2,0,3,18],
+"group__netif.html#gac90f290edd005238d62aa94c4ac9dea3":[13,2,0,3,21],
+"group__netif.html#gadc8787b23ac0ee023979cbadf87813d4":[13,2,0,3,27],
+"group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea":[13,2,0,3,25],
+"group__netif.html#gaf19693be401a265a52d2a56c65753121":[13,2,0,3,28],
+"group__netif.html#gafcb3925fb117375739abf97f3a856bcd":[13,2,0,3,13],
+"group__netif__cd.html":[13,2,0,3,2],
+"group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5":[13,2,0,3,2,0],
+"group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978":[13,2,0,3,2,2],
+"group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f":[13,2,0,3,2,1],
+"group__netif__flags.html":[13,2,0,3,3],
+"group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8":[13,2,0,3,3,4],
+"group__netif__flags.html#ga76ad9d0cf9f029df0ab2a998c64040dc":[13,2,0,3,3,2],
+"group__netif__flags.html#ga92448dc510bc8d700c09e5c971ef0676":[13,2,0,3,3,1],
+"group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508":[13,2,0,3,3,5]
 };
diff --git a/doc/doxygen/output/html/navtreeindex5.js b/doc/doxygen/output/html/navtreeindex5.js
index cfedfd7..b8fb70a 100644
--- a/doc/doxygen/output/html/navtreeindex5.js
+++ b/doc/doxygen/output/html/navtreeindex5.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX5 =
 {
-"group__pbuf.html#gaba88511dee3df4b631fde691f421320d":[12,1,2,10],
-"group__pbuf.html#gabe4dfb2409c87a7c52c9a22a779f92e9":[12,1,2,21],
-"group__pbuf.html#gac2f1f58fd36042e82af46f5015720899":[12,1,2,11],
-"group__pbuf.html#gac6842a5d8268606f9608bae15d652a22":[12,1,2,8],
-"group__pbuf.html#gad1e31e370271335b197272af2724ca85":[12,1,2,22],
-"group__pbuf.html#gadded8d23ed42840f2eb7fef7244dde95":[12,1,2,12],
-"group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44":[12,1,2,23],
-"group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf":[12,1,2,1],
-"group__pbuf.html#gaf76863707dc02993eae116574b1ea03f":[12,1,2,18],
-"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9":[12,1,2,2,1],
-"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab":[12,1,2,2,0],
-"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e":[12,1,2,2,2],
-"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21":[12,1,2,2,3],
-"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2":[12,1,2,1,3],
-"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba":[12,1,2,1,4],
-"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5":[12,1,2,1,0],
-"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346":[12,1,2,1,2],
-"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13":[12,1,2,1,1],
-"group__perf.html":[12,0,2,5],
-"group__ppp.html":[12,3,3],
-"group__raw__raw.html":[12,2,0,4],
-"group__raw__raw.html#ga09427456070fb610cc7795d23dedc159":[12,2,0,4,9],
-"group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1":[12,2,0,4,10],
-"group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168":[12,2,0,4,2],
-"group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef":[12,2,0,4,3],
-"group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4":[12,2,0,4,0],
-"group__raw__raw.html#ga89697a092b3d72079f872a029e220eba":[12,2,0,4,5],
-"group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16":[12,2,0,4,7],
-"group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a":[12,2,0,4,1],
-"group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2":[12,2,0,4,4],
-"group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d":[12,2,0,4,8],
-"group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426":[12,2,0,4,6],
-"group__rfc7668if.html":[12,3,2],
-"group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197":[12,3,2,3],
-"group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0":[12,3,2,4],
-"group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e":[12,3,2,5],
-"group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde":[12,3,2,2],
-"group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d":[12,3,2,1],
-"group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c":[12,3,2,0],
-"group__sequential__api.html":[12,2,1],
-"group__sixlowpan.html":[12,3,1],
-"group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7":[12,3,1,0],
-"group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94":[12,3,1,2],
-"group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b":[12,3,1,5],
-"group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b":[12,3,1,1],
-"group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3":[12,3,1,3],
-"group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625":[12,3,1,4],
-"group__slipif.html":[12,3,4],
-"group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3":[12,3,4,3],
-"group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3":[12,3,4,0],
-"group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6":[12,3,4,1],
-"group__slipif.html#gabbee48569a513c90fe154632038eb6d6":[12,3,4,4],
-"group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946":[12,3,4,2],
-"group__smtp.html":[12,4,6],
-"group__smtp.html#ga06f6582701def2a62582373bb0be5788":[12,4,6,3],
-"group__smtp.html#ga1ccf4305461ec16cf41599341ec54983":[12,4,6,5],
-"group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f":[12,4,6,6],
-"group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899":[12,4,6,4],
-"group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243":[12,4,6,2],
-"group__smtp.html#gae43119480c4146df9eeff7ae80c767f7":[12,4,6,1],
-"group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e":[12,4,6,7],
-"group__smtp__opts.html":[12,4,6,0],
-"group__smtp__opts.html#ga021d8133159895a2dbf5fb0b243da9fa":[12,4,6,0,1],
-"group__smtp__opts.html#ga2e6c8313006592884e89bbcf353cf5ac":[12,4,6,0,8],
-"group__smtp__opts.html#ga4b1667149354b7819847cb4f5f1ff144":[12,4,6,0,0],
-"group__smtp__opts.html#ga7a83e686b109fa59557c13736aeeab3b":[12,4,6,0,7],
-"group__smtp__opts.html#ga9aa5f5529121a8266947f33c5e424ccc":[12,4,6,0,4],
-"group__smtp__opts.html#gab5559a7c976e72204d9391f655bcc07e":[12,4,6,0,2],
-"group__smtp__opts.html#gae7ea4f31c521947d5127e268ae02c317":[12,4,6,0,3],
-"group__smtp__opts.html#gaee3b273524a2253ce5fb44b240b0371b":[12,4,6,0,5],
-"group__smtp__opts.html#gafa0c84e5279b8eb8a5dbea6fe97aa099":[12,4,6,0,6],
-"group__snmp.html":[12,4,7],
-"group__snmp__core.html":[12,4,7,0],
-"group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8":[12,4,7,0,0],
-"group__snmp__core.html#ga29c76474971f25d038fd486447c70e21":[12,4,7,0,7],
-"group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1":[12,4,7,0,4],
-"group__snmp__core.html#ga341461766863cff46a44e5f431f2da01":[12,4,7,0,5],
-"group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5":[12,4,7,0,3],
-"group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8":[12,4,7,0,2],
-"group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e":[12,4,7,0,1],
-"group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a":[12,4,7,0,6],
-"group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b":[12,4,7,0,8],
-"group__snmp__mib2.html":[12,4,7,2],
-"group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2":[12,4,7,2,3],
-"group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a":[12,4,7,2,1],
-"group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5":[12,4,7,2,6],
-"group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267":[12,4,7,2,4],
-"group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc":[12,4,7,2,2],
-"group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7":[12,4,7,2,5],
-"group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e":[12,4,7,2,0],
-"group__snmp__opts.html":[12,4,7,3],
-"group__snmp__opts.html#ga09118b734e85df152af098744e888b34":[12,4,7,3,5],
-"group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242":[12,4,7,3,21],
-"group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd":[12,4,7,3,14],
-"group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683":[12,4,7,3,10],
-"group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9":[12,4,7,3,12],
-"group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db":[12,4,7,3,1],
-"group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41":[12,4,7,3,15],
-"group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3":[12,4,7,3,8],
-"group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08":[12,4,7,3,23],
-"group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98":[12,4,7,3,13],
-"group__snmp__opts.html#ga868bfef6efe05515c86291137a633479":[12,4,7,3,7],
-"group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f":[12,4,7,3,25],
-"group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261":[12,4,7,3,20],
-"group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f":[12,4,7,3,6],
-"group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d":[12,4,7,3,9],
-"group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b":[12,4,7,3,2],
-"group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02":[12,4,7,3,4],
-"group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16":[12,4,7,3,18],
-"group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90":[12,4,7,3,19],
-"group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b":[12,4,7,3,22],
-"group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2":[12,4,7,3,16],
-"group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73":[12,4,7,3,11],
-"group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078":[12,4,7,3,24],
-"group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c":[12,4,7,3,0],
-"group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0":[12,4,7,3,17],
-"group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464":[12,4,7,3,3],
-"group__snmp__traps.html":[12,4,7,1],
-"group__snmp__traps.html#ga0e044259289cb690197173f93c17607d":[12,4,7,1,5],
-"group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86":[12,4,7,1,10],
-"group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760":[12,4,7,1,8],
-"group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba":[12,4,7,1,3],
-"group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1":[12,4,7,1,6],
-"group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7":[12,4,7,1,2],
-"group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd":[12,4,7,1,4],
-"group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be":[12,4,7,1,1],
-"group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32":[12,4,7,1,9],
-"group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c":[12,4,7,1,7],
-"group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee":[12,4,7,1,0],
-"group__sntp.html":[12,4,8],
-"group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5":[12,4,8,1],
-"group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a":[12,4,8,7],
-"group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488":[12,4,8,8],
-"group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba":[12,4,8,5],
-"group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120":[12,4,8,6],
-"group__sntp.html#gab114c12154cf2c3e3a733724c6a77429":[12,4,8,4],
-"group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e":[12,4,8,3],
-"group__sntp.html#gae66404a551d5cef420cf844a71356fae":[12,4,8,2],
-"group__sntp__opts.html":[12,4,8,0],
-"group__sntp__opts.html#ga0d5b4f1e382d08f0df9dbe0c9da64006":[12,4,8,0,4],
-"group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7":[12,4,8,0,1],
-"group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa":[12,4,8,0,15],
-"group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91":[12,4,8,0,2],
-"group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08":[12,4,8,0,9],
-"group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3":[12,4,8,0,7],
-"group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2":[12,4,8,0,6],
-"group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446":[12,4,8,0,0],
-"group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba":[12,4,8,0,10],
-"group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c":[12,4,8,0,17],
-"group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade":[12,4,8,0,3],
-"group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63":[12,4,8,0,5],
-"group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b":[12,4,8,0,8],
-"group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75":[12,4,8,0,16],
-"group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f":[12,4,8,0,13],
-"group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2":[12,4,8,0,11],
-"group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699":[12,4,8,0,12],
-"group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6":[12,4,8,0,14],
-"group__socket.html":[12,2,2],
-"group__sys__layer.html":[12,0,2],
-"group__sys__mbox.html":[12,0,2,1,2],
-"group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172":[12,0,2,1,2,5],
-"group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8":[12,0,2,1,2,0],
-"group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d":[12,0,2,1,2,8],
-"group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555":[12,0,2,1,2,4],
-"group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195":[12,0,2,1,2,6],
-"group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc":[12,0,2,1,2,3],
-"group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f":[12,0,2,1,2,2],
-"group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a":[12,0,2,1,2,7],
-"group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c":[12,0,2,1,2,1],
-"group__sys__misc.html":[12,0,2,1,3],
-"group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a":[12,0,2,1,3,2],
-"group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e":[12,0,2,1,3,1],
-"group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448":[12,0,2,1,3,0],
-"group__sys__mutex.html":[12,0,2,1,1],
-"group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9":[12,0,2,1,1,0],
-"group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897":[12,0,2,1,1,2],
-"group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8":[12,0,2,1,1,3],
-"group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a":[12,0,2,1,1,1],
-"group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb":[12,0,2,1,1,4],
-"group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a":[12,0,2,1,1,5],
-"group__sys__nonstandard.html":[12,0,2,0],
-"group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a":[12,0,2,0,1],
-"group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a":[12,0,2,0,2],
-"group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e":[12,0,2,0,3],
-"group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284":[12,0,2,0,0],
-"group__sys__os.html":[12,0,2,1],
-"group__sys__prot.html":[12,0,2,3],
-"group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2":[12,0,2,3,2],
-"group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab":[12,0,2,3,1],
-"group__sys__prot.html#ga945395fa326214fc9736487242710a90":[12,0,2,3,0],
-"group__sys__sem.html":[12,0,2,1,0],
-"group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4":[12,0,2,1,0,5],
-"group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33":[12,0,2,1,0,3],
-"group__sys__sem.html#ga83b781f96c30e915c752065a757da283":[12,0,2,1,0,1],
-"group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f":[12,0,2,1,0,0],
-"group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875":[12,0,2,1,0,4],
-"group__sys__sem.html#gaf99da9e34a71855285c535183133dfde":[12,0,2,1,0,2],
-"group__sys__time.html":[12,0,2,2],
-"group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199":[12,0,2,2,0],
-"group__tcp__raw.html":[12,2,0,5],
-"group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f":[12,2,0,5,15],
-"group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808":[12,2,0,5,19],
-"group__tcp__raw.html#ga2e00c668b99d92113cd595647702be83":[12,2,0,5,13],
-"group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8":[12,2,0,5,5],
-"group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61":[12,2,0,5,1],
-"group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd":[12,2,0,5,20],
-"group__tcp__raw.html#ga619154658137a23839ca3b94882131ca":[12,2,0,5,4],
-"group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f":[12,2,0,5,7],
-"group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5":[12,2,0,5,21],
-"group__tcp__raw.html#ga77bb2ca7f053e73545d36b745f236d54":[12,2,0,5,11],
-"group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623":[12,2,0,5,8],
-"group__tcp__raw.html#ga8883f9735809f1679d744bc48f1c674a":[12,2,0,5,12],
-"group__tcp__raw.html#ga89f6955b7248c76a073cd1be461aeb5b":[12,2,0,5,14],
-"group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0":[12,2,0,5,17],
-"group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012":[12,2,0,5,9],
-"group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44":[12,2,0,5,18],
-"group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6":[12,2,0,5,3],
-"group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee":[12,2,0,5,6],
-"group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121":[12,2,0,5,10],
-"group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5":[12,2,0,5,16],
-"group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62":[12,2,0,5,2],
-"group__tcp__raw__extargs.html":[12,2,0,5,0],
-"group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316":[12,2,0,5,0,3],
-"group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616":[12,2,0,5,0,0],
-"group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318":[12,2,0,5,0,2],
-"group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855":[12,2,0,5,0,1],
-"group__tftp.html":[12,4,9],
-"group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3":[12,4,9,3],
-"group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec":[12,4,9,2],
-"group__tftp__opts.html":[12,4,9,0],
-"group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981":[12,4,9,0,0],
-"group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63":[12,4,9,0,5],
-"group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea":[12,4,9,0,6],
-"group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313":[12,4,9,0,3],
-"group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b":[12,4,9,0,1],
-"group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055":[12,4,9,0,2],
-"group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1":[12,4,9,0,4],
-"group__udp__raw.html":[12,2,0,6],
-"group__udp__raw.html#ga0601b0c0a2471fd7b6cfa217cc6c1eb7":[12,2,0,6,4],
-"group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646":[12,2,0,6,7],
-"group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8":[12,2,0,6,1],
-"group__udp__raw.html#ga83625967670477aa254643129a53971b":[12,2,0,6,2],
-"group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142":[12,2,0,6,10],
-"group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc":[12,2,0,6,3],
-"group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743":[12,2,0,6,9],
-"group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7":[12,2,0,6,11],
-"group__udp__raw.html#gaa426f09a4212893cf3308d9eeec0399a":[12,2,0,6,5],
-"group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc":[12,2,0,6,8],
-"group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e":[12,2,0,6,0],
-"group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027":[12,2,0,6,6]
+"group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e":[13,2,0,3,3,6],
+"group__netif__flags.html#gac9493b923d733c73f6006d9714826558":[13,2,0,3,3,3],
+"group__netif__flags.html#gaef64fe15c82bc7b235366923e517104e":[13,2,0,3,3,0],
+"group__netif__ip4.html":[13,2,0,3,0],
+"group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53":[13,2,0,3,0,3],
+"group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca":[13,2,0,3,0,2],
+"group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520":[13,2,0,3,0,1],
+"group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1":[13,2,0,3,0,0],
+"group__netif__ip6.html":[13,2,0,3,1],
+"group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f":[13,2,0,3,1,3],
+"group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327":[13,2,0,3,1,0],
+"group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb":[13,2,0,3,1,2],
+"group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9":[13,2,0,3,1,1],
+"group__netif__mib2.html":[13,2,0,3,4],
+"group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed":[13,2,0,3,4,2],
+"group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba":[13,2,0,3,4,4],
+"group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f":[13,2,0,3,4,3],
+"group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0":[13,2,0,3,4,1],
+"group__netifapi.html":[13,2,1,1],
+"group__netifapi__arp.html":[13,2,1,1,1],
+"group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8":[13,2,1,1,1,1],
+"group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119":[13,2,1,1,1,0],
+"group__netifapi__autoip.html":[13,2,1,1,3],
+"group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2":[13,2,1,1,3,0],
+"group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d":[13,2,1,1,3,1],
+"group__netifapi__dhcp4.html":[13,2,1,1,2],
+"group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134":[13,2,1,1,2,2],
+"group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5":[13,2,1,1,2,5],
+"group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0":[13,2,1,1,2,0],
+"group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409":[13,2,1,1,2,1],
+"group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b":[13,2,1,1,2,3],
+"group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765":[13,2,1,1,2,4],
+"group__netifapi__netif.html":[13,2,1,1,0],
+"group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373":[13,2,1,1,0,0],
+"group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16":[13,2,1,1,0,2],
+"group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4":[13,2,1,1,0,3],
+"group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973":[13,2,1,1,0,9],
+"group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76":[13,2,1,1,0,5],
+"group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf":[13,2,1,1,0,1],
+"group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6":[13,2,1,1,0,7],
+"group__netifapi__netif.html#gac054a60a32447019913d34da63924853":[13,2,1,1,0,4],
+"group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519":[13,2,1,1,0,6],
+"group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089":[13,2,1,1,0,8],
+"group__netifs.html":[13,3],
+"group__pbuf.html":[13,1,2],
+"group__pbuf.html#ga031469589fa95ece3bf1c136d1509eac":[13,1,2,9],
+"group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448":[13,1,2,17],
+"group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974":[13,1,2,16],
+"group__pbuf.html#ga50abfe830a33a1a47a562febee66015d":[13,1,2,19],
+"group__pbuf.html#ga5bcdac7b3aef4d60460ee05dec51db5f":[13,1,2,5],
+"group__pbuf.html#ga6cff29c18a60a7f2828457fa61e3accb":[13,1,2,4],
+"group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6":[13,1,2,14],
+"group__pbuf.html#ga6da6c83929df1b736b107e89faa8a8a2":[13,1,2,15],
+"group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e":[13,1,2,20],
+"group__pbuf.html#ga82429084fe29015509c9b4a072707cd4":[13,1,2,6],
+"group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891":[13,1,2,7],
+"group__pbuf.html#ga839f342803b0cf89049744124c5a98ad":[13,1,2,24],
+"group__pbuf.html#ga894d91d811fd986f3cc3da828fa7beb3":[13,1,2,0],
+"group__pbuf.html#ga8bb9c5d54a06995b1c67ce695ead9969":[13,1,2,3],
+"group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b":[13,1,2,13],
+"group__pbuf.html#gab7e0e32fcc292c0d7107721766ed92fb":[13,1,2,2],
+"group__pbuf.html#gaba88511dee3df4b631fde691f421320d":[13,1,2,10],
+"group__pbuf.html#gabe4dfb2409c87a7c52c9a22a779f92e9":[13,1,2,21],
+"group__pbuf.html#gac2f1f58fd36042e82af46f5015720899":[13,1,2,11],
+"group__pbuf.html#gac6842a5d8268606f9608bae15d652a22":[13,1,2,8],
+"group__pbuf.html#gad1e31e370271335b197272af2724ca85":[13,1,2,22],
+"group__pbuf.html#gadded8d23ed42840f2eb7fef7244dde95":[13,1,2,12],
+"group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44":[13,1,2,23],
+"group__pbuf.html#gaee1baa59bb2f85ba575b5a8619ac1ebf":[13,1,2,1],
+"group__pbuf.html#gaf76863707dc02993eae116574b1ea03f":[13,1,2,18],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac120b0fe39efe35bb682e4aa3b82e2c9":[13,1,2,2,1],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac5e9f28455bca98944a030d4b84ecfab":[13,1,2,2,0],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e":[13,1,2,2,2],
+"group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbae969347127387b9b59a23ccd24b76d21":[13,1,2,2,3],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa0ff039585f05f9208bcb66c2d37783e2":[13,1,2,1,3],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba":[13,1,2,1,4],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa2ded3594a3977f8bf9cf09552be327b5":[13,1,2,1,0],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfab4de441e737330558b609a990cd17346":[13,1,2,1,2],
+"group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfafcc1e506061ba69dfa142eb6b3da5f13":[13,1,2,1,1],
+"group__perf.html":[13,0,2,5],
+"group__ppp.html":[13,3,3],
+"group__raw__raw.html":[13,2,0,4],
+"group__raw__raw.html#ga09427456070fb610cc7795d23dedc159":[13,2,0,4,9],
+"group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1":[13,2,0,4,10],
+"group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168":[13,2,0,4,2],
+"group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef":[13,2,0,4,3],
+"group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4":[13,2,0,4,0],
+"group__raw__raw.html#ga89697a092b3d72079f872a029e220eba":[13,2,0,4,5],
+"group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16":[13,2,0,4,7],
+"group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a":[13,2,0,4,1],
+"group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2":[13,2,0,4,4],
+"group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d":[13,2,0,4,8],
+"group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426":[13,2,0,4,6],
+"group__rfc7668if.html":[13,3,2],
+"group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197":[13,3,2,3],
+"group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0":[13,3,2,4],
+"group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e":[13,3,2,5],
+"group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde":[13,3,2,2],
+"group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f":[13,3,2,0],
+"group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4":[13,3,2,1],
+"group__sequential__api.html":[13,2,1],
+"group__sixlowpan.html":[13,3,1],
+"group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7":[13,3,1,0],
+"group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94":[13,3,1,2],
+"group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b":[13,3,1,5],
+"group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b":[13,3,1,1],
+"group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3":[13,3,1,3],
+"group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625":[13,3,1,4],
+"group__slipif.html":[13,3,4],
+"group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3":[13,3,4,3],
+"group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3":[13,3,4,0],
+"group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6":[13,3,4,1],
+"group__slipif.html#gabbee48569a513c90fe154632038eb6d6":[13,3,4,4],
+"group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946":[13,3,4,2],
+"group__smtp.html":[13,4,6],
+"group__smtp.html#ga06f6582701def2a62582373bb0be5788":[13,4,6,3],
+"group__smtp.html#ga1ccf4305461ec16cf41599341ec54983":[13,4,6,5],
+"group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f":[13,4,6,6],
+"group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899":[13,4,6,4],
+"group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243":[13,4,6,2],
+"group__smtp.html#gae43119480c4146df9eeff7ae80c767f7":[13,4,6,1],
+"group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e":[13,4,6,7],
+"group__smtp__opts.html":[13,4,6,0],
+"group__smtp__opts.html#ga021d8133159895a2dbf5fb0b243da9fa":[13,4,6,0,1],
+"group__smtp__opts.html#ga2e6c8313006592884e89bbcf353cf5ac":[13,4,6,0,8],
+"group__smtp__opts.html#ga4b1667149354b7819847cb4f5f1ff144":[13,4,6,0,0],
+"group__smtp__opts.html#ga7a83e686b109fa59557c13736aeeab3b":[13,4,6,0,7],
+"group__smtp__opts.html#ga9aa5f5529121a8266947f33c5e424ccc":[13,4,6,0,4],
+"group__smtp__opts.html#gab5559a7c976e72204d9391f655bcc07e":[13,4,6,0,2],
+"group__smtp__opts.html#gae7ea4f31c521947d5127e268ae02c317":[13,4,6,0,3],
+"group__smtp__opts.html#gaee3b273524a2253ce5fb44b240b0371b":[13,4,6,0,5],
+"group__smtp__opts.html#gafa0c84e5279b8eb8a5dbea6fe97aa099":[13,4,6,0,6],
+"group__snmp.html":[13,4,7],
+"group__snmp__core.html":[13,4,7,0],
+"group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8":[13,4,7,0,0],
+"group__snmp__core.html#ga29c76474971f25d038fd486447c70e21":[13,4,7,0,8],
+"group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1":[13,4,7,0,4],
+"group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838":[13,4,7,0,7],
+"group__snmp__core.html#ga341461766863cff46a44e5f431f2da01":[13,4,7,0,5],
+"group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5":[13,4,7,0,3],
+"group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8":[13,4,7,0,2],
+"group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e":[13,4,7,0,1],
+"group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a":[13,4,7,0,6],
+"group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b":[13,4,7,0,9],
+"group__snmp__mib2.html":[13,4,7,2],
+"group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2":[13,4,7,2,3],
+"group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a":[13,4,7,2,1],
+"group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5":[13,4,7,2,6],
+"group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267":[13,4,7,2,4],
+"group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc":[13,4,7,2,2],
+"group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7":[13,4,7,2,5],
+"group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e":[13,4,7,2,0],
+"group__snmp__opts.html":[13,4,7,3],
+"group__snmp__opts.html#ga09118b734e85df152af098744e888b34":[13,4,7,3,5],
+"group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242":[13,4,7,3,21],
+"group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd":[13,4,7,3,14],
+"group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683":[13,4,7,3,10],
+"group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9":[13,4,7,3,12],
+"group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db":[13,4,7,3,1],
+"group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41":[13,4,7,3,15],
+"group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3":[13,4,7,3,8],
+"group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08":[13,4,7,3,23],
+"group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98":[13,4,7,3,13],
+"group__snmp__opts.html#ga868bfef6efe05515c86291137a633479":[13,4,7,3,7],
+"group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f":[13,4,7,3,25],
+"group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261":[13,4,7,3,20],
+"group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f":[13,4,7,3,6],
+"group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d":[13,4,7,3,9],
+"group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b":[13,4,7,3,2],
+"group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02":[13,4,7,3,4],
+"group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16":[13,4,7,3,18],
+"group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90":[13,4,7,3,19],
+"group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b":[13,4,7,3,22],
+"group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2":[13,4,7,3,16],
+"group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73":[13,4,7,3,11],
+"group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078":[13,4,7,3,24],
+"group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c":[13,4,7,3,0],
+"group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0":[13,4,7,3,17],
+"group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464":[13,4,7,3,3],
+"group__snmp__traps.html":[13,4,7,1],
+"group__snmp__traps.html#ga0e044259289cb690197173f93c17607d":[13,4,7,1,9],
+"group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86":[13,4,7,1,15],
+"group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c":[13,4,7,1,8],
+"group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760":[13,4,7,1,12],
+"group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba":[13,4,7,1,3],
+"group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1":[13,4,7,1,10],
+"group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455":[13,4,7,1,13],
+"group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210":[13,4,7,1,7],
+"group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7":[13,4,7,1,2],
+"group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be":[13,4,7,1,1],
+"group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32":[13,4,7,1,14],
+"group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275":[13,4,7,1,6],
+"group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c":[13,4,7,1,11],
+"group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692":[13,4,7,1,5],
+"group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee":[13,4,7,1,0],
+"group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359":[13,4,7,1,4],
+"group__sntp.html":[13,4,8],
+"group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5":[13,4,8,1],
+"group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a":[13,4,8,8],
+"group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e":[13,4,8,2],
+"group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488":[13,4,8,9],
+"group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba":[13,4,8,6],
+"group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120":[13,4,8,7],
+"group__sntp.html#gab114c12154cf2c3e3a733724c6a77429":[13,4,8,5],
+"group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e":[13,4,8,4],
+"group__sntp.html#gae66404a551d5cef420cf844a71356fae":[13,4,8,3],
+"group__sntp__opts.html":[13,4,8,0],
+"group__sntp__opts.html#ga0d5b4f1e382d08f0df9dbe0c9da64006":[13,4,8,0,4],
+"group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7":[13,4,8,0,1],
+"group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa":[13,4,8,0,15],
+"group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91":[13,4,8,0,2],
+"group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08":[13,4,8,0,9],
+"group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3":[13,4,8,0,7],
+"group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2":[13,4,8,0,6],
+"group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446":[13,4,8,0,0],
+"group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba":[13,4,8,0,10],
+"group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c":[13,4,8,0,17],
+"group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade":[13,4,8,0,3],
+"group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63":[13,4,8,0,5],
+"group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b":[13,4,8,0,8],
+"group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75":[13,4,8,0,16],
+"group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f":[13,4,8,0,13],
+"group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2":[13,4,8,0,11],
+"group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699":[13,4,8,0,12],
+"group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6":[13,4,8,0,14],
+"group__socket.html":[13,2,2],
+"group__sys__layer.html":[13,0,2],
+"group__sys__mbox.html":[13,0,2,1,2],
+"group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172":[13,0,2,1,2,5],
+"group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8":[13,0,2,1,2,0],
+"group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d":[13,0,2,1,2,8],
+"group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555":[13,0,2,1,2,4],
+"group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195":[13,0,2,1,2,6],
+"group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc":[13,0,2,1,2,3],
+"group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f":[13,0,2,1,2,2],
+"group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a":[13,0,2,1,2,7],
+"group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c":[13,0,2,1,2,1],
+"group__sys__misc.html":[13,0,2,1,3],
+"group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a":[13,0,2,1,3,2],
+"group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e":[13,0,2,1,3,1],
+"group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448":[13,0,2,1,3,0],
+"group__sys__mutex.html":[13,0,2,1,1],
+"group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9":[13,0,2,1,1,0],
+"group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897":[13,0,2,1,1,2],
+"group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8":[13,0,2,1,1,3],
+"group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a":[13,0,2,1,1,1],
+"group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb":[13,0,2,1,1,4],
+"group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a":[13,0,2,1,1,5],
+"group__sys__nonstandard.html":[13,0,2,0],
+"group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a":[13,0,2,0,1]
 };
diff --git a/doc/doxygen/output/html/navtreeindex6.js b/doc/doxygen/output/html/navtreeindex6.js
index 056220f..4e91760 100644
--- a/doc/doxygen/output/html/navtreeindex6.js
+++ b/doc/doxygen/output/html/navtreeindex6.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX6 =
 {
-"group__zepif.html":[12,3,5],
-"group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004":[12,3,5,0],
-"http__client_8c.html":[14,0,0,1,1,1],
-"http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1":[14,0,0,1,1,1,1],
-"http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a":[14,0,0,1,1,1,2],
-"http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a":[14,0,0,1,1,1,0],
-"http__client_8h.html":[14,0,0,3,1,0,2],
-"httpd_8c.html":[14,0,0,1,1,2],
-"httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a":[14,0,0,1,1,2,2],
-"httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300":[14,0,0,1,1,2,0],
-"httpd_8c.html#af281bc4a762d56243e0b85dd4197174a":[14,0,0,1,1,2,1],
-"httpd_8h.html":[14,0,0,3,1,0,3],
-"httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca":[14,0,0,3,1,0,3,0],
-"httpd__opts_8h.html":[14,0,0,3,1,0,4],
-"iana_8h.html":[14,0,0,3,1,2,6],
-"icmp6_8c.html":[14,0,0,2,1,2],
-"icmp6_8c.html#a358abb6555f6ca6b2b2b1412c9117bec":[14,0,0,2,1,2,4],
-"icmp6_8c.html#a3c0a84e0944263d92c9dc3ad094ffcb0":[14,0,0,2,1,2,2],
-"icmp6_8c.html#a6094fa333b2cbf1b1b062e72313ef146":[14,0,0,2,1,2,3],
-"icmp6_8c.html#a94bec819e11f51c8088ca338f2e36c3d":[14,0,0,2,1,2,1],
-"icmp6_8c.html#ab480867394952904b5607d62315bdbac":[14,0,0,2,1,2,0],
-"icmp6_8c.html#ad01e5bc4690a2c6aeb534237a5a9b593":[14,0,0,2,1,2,5],
-"icmp6_8h.html":[14,0,0,3,1,19],
-"icmp6_8h.html#a358abb6555f6ca6b2b2b1412c9117bec":[14,0,0,3,1,19,4],
-"icmp6_8h.html#a3c0a84e0944263d92c9dc3ad094ffcb0":[14,0,0,3,1,19,2],
-"icmp6_8h.html#a6094fa333b2cbf1b1b062e72313ef146":[14,0,0,3,1,19,3],
-"icmp6_8h.html#a94bec819e11f51c8088ca338f2e36c3d":[14,0,0,3,1,19,1],
-"icmp6_8h.html#ab480867394952904b5607d62315bdbac":[14,0,0,3,1,19,0],
-"icmp6_8h.html#ad01e5bc4690a2c6aeb534237a5a9b593":[14,0,0,3,1,19,5],
-"icmp_8c.html":[14,0,0,2,0,3],
-"icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119":[14,0,0,2,0,3,3],
-"icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e":[14,0,0,2,0,3,0],
-"icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1":[14,0,0,2,0,3,2],
-"icmp_8c.html#ae26c59eab4ce553964a0c9d43f534d06":[14,0,0,2,0,3,1],
-"icmp_8h.html":[14,0,0,3,1,18],
-"icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a":[14,0,0,3,1,18,1],
-"icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796":[14,0,0,3,1,18,1,1],
-"icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c":[14,0,0,3,1,18,1,0],
-"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5":[14,0,0,3,1,18,0],
-"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef":[14,0,0,3,1,18,0,2],
-"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3":[14,0,0,3,1,18,0,0],
-"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7":[14,0,0,3,1,18,0,1],
-"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f":[14,0,0,3,1,18,0,4],
-"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644":[14,0,0,3,1,18,0,3],
-"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13":[14,0,0,3,1,18,0,5],
-"icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119":[14,0,0,3,1,18,4],
-"icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1":[14,0,0,3,1,18,3],
-"icmp_8h.html#ae26c59eab4ce553964a0c9d43f534d06":[14,0,0,3,1,18,2],
-"ieee802154_8h.html":[14,0,0,3,2,4],
-"ieee_8h.html":[14,0,0,3,1,2,9],
-"if_8h.html":[14,0,0,3,0,0,1,0],
-"if__api_8c.html":[14,0,0,0,3],
-"if__api_8h.html":[14,0,0,3,1,20],
-"igmp_8c.html":[14,0,0,2,0,4],
-"igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a":[14,0,0,2,0,4,1],
-"igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1":[14,0,0,2,0,4,10],
-"igmp_8c.html#a695bd07cc4997aedb871b83456e18890":[14,0,0,2,0,4,6],
-"igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6":[14,0,0,2,0,4,8],
-"igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8":[14,0,0,2,0,4,0],
-"igmp_8c.html#af06eeba0e984aab4a67a836eab577726":[14,0,0,2,0,4,7],
-"igmp_8c.html#afc19bd532855a64c021be08172065f84":[14,0,0,2,0,4,9],
-"igmp_8h.html":[14,0,0,3,1,21],
-"igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a":[14,0,0,3,1,21,3],
-"igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1":[14,0,0,3,1,21,12],
-"igmp_8h.html#a695bd07cc4997aedb871b83456e18890":[14,0,0,3,1,21,8],
-"igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6":[14,0,0,3,1,21,10],
-"igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8":[14,0,0,3,1,21,2],
-"igmp_8h.html#af06eeba0e984aab4a67a836eab577726":[14,0,0,3,1,21,9],
-"igmp_8h.html#afc19bd532855a64c021be08172065f84":[14,0,0,3,1,21,11],
+"group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a":[13,0,2,0,2],
+"group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e":[13,0,2,0,4],
+"group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa":[13,0,2,0,3],
+"group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284":[13,0,2,0,0],
+"group__sys__os.html":[13,0,2,1],
+"group__sys__prot.html":[13,0,2,3],
+"group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2":[13,0,2,3,2],
+"group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab":[13,0,2,3,1],
+"group__sys__prot.html#ga945395fa326214fc9736487242710a90":[13,0,2,3,0],
+"group__sys__sem.html":[13,0,2,1,0],
+"group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4":[13,0,2,1,0,5],
+"group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33":[13,0,2,1,0,3],
+"group__sys__sem.html#ga83b781f96c30e915c752065a757da283":[13,0,2,1,0,1],
+"group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f":[13,0,2,1,0,0],
+"group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875":[13,0,2,1,0,4],
+"group__sys__sem.html#gaf99da9e34a71855285c535183133dfde":[13,0,2,1,0,2],
+"group__sys__time.html":[13,0,2,2],
+"group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199":[13,0,2,2,0],
+"group__tcp__raw.html":[13,2,0,5],
+"group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f":[13,2,0,5,15],
+"group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808":[13,2,0,5,19],
+"group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc":[13,2,0,5,20],
+"group__tcp__raw.html#ga2e00c668b99d92113cd595647702be83":[13,2,0,5,13],
+"group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8":[13,2,0,5,5],
+"group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61":[13,2,0,5,1],
+"group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd":[13,2,0,5,21],
+"group__tcp__raw.html#ga619154658137a23839ca3b94882131ca":[13,2,0,5,4],
+"group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f":[13,2,0,5,7],
+"group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5":[13,2,0,5,22],
+"group__tcp__raw.html#ga77bb2ca7f053e73545d36b745f236d54":[13,2,0,5,11],
+"group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623":[13,2,0,5,8],
+"group__tcp__raw.html#ga8883f9735809f1679d744bc48f1c674a":[13,2,0,5,12],
+"group__tcp__raw.html#ga89f6955b7248c76a073cd1be461aeb5b":[13,2,0,5,14],
+"group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0":[13,2,0,5,17],
+"group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012":[13,2,0,5,9],
+"group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44":[13,2,0,5,18],
+"group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6":[13,2,0,5,3],
+"group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee":[13,2,0,5,6],
+"group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121":[13,2,0,5,10],
+"group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5":[13,2,0,5,16],
+"group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62":[13,2,0,5,2],
+"group__tcp__raw__extargs.html":[13,2,0,5,0],
+"group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616":[13,2,0,5,0,0],
+"group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56":[13,2,0,5,0,1],
+"group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5":[13,2,0,5,0,3],
+"group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e":[13,2,0,5,0,2],
+"group__tftp.html":[13,4,9],
+"group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40":[13,4,9,4],
+"group__tftp.html#gaa6b743a64287206acb825bd60448e5f8":[13,4,9,3],
+"group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec":[13,4,9,2],
+"group__tftp__opts.html":[13,4,9,0],
+"group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981":[13,4,9,0,0],
+"group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63":[13,4,9,0,5],
+"group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea":[13,4,9,0,6],
+"group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313":[13,4,9,0,3],
+"group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b":[13,4,9,0,1],
+"group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055":[13,4,9,0,2],
+"group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1":[13,4,9,0,4],
+"group__udp__raw.html":[13,2,0,6],
+"group__udp__raw.html#ga0601b0c0a2471fd7b6cfa217cc6c1eb7":[13,2,0,6,4],
+"group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646":[13,2,0,6,7],
+"group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8":[13,2,0,6,1],
+"group__udp__raw.html#ga83625967670477aa254643129a53971b":[13,2,0,6,2],
+"group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142":[13,2,0,6,10],
+"group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc":[13,2,0,6,3],
+"group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743":[13,2,0,6,9],
+"group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7":[13,2,0,6,11],
+"group__udp__raw.html#gaa426f09a4212893cf3308d9eeec0399a":[13,2,0,6,5],
+"group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc":[13,2,0,6,8],
+"group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e":[13,2,0,6,0],
+"group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027":[13,2,0,6,6],
+"group__zepif.html":[13,3,5],
+"group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004":[13,3,5,0],
+"http__client_8c.html":[15,0,0,1,1,1],
+"http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1":[15,0,0,1,1,1,1],
+"http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a":[15,0,0,1,1,1,2],
+"http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a":[15,0,0,1,1,1,0],
+"http__client_8h.html":[15,0,0,3,1,0,2],
+"httpd_8c.html":[15,0,0,1,1,2],
+"httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a":[15,0,0,1,1,2,2],
+"httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300":[15,0,0,1,1,2,0],
+"httpd_8c.html#af281bc4a762d56243e0b85dd4197174a":[15,0,0,1,1,2,1],
+"httpd_8h.html":[15,0,0,3,1,0,3],
+"httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca":[15,0,0,3,1,0,3,0],
+"httpd__opts_8h.html":[15,0,0,3,1,0,4],
+"iana_8h.html":[15,0,0,3,1,2,7],
+"icmp6_8c.html":[15,0,0,2,1,2],
+"icmp6_8c.html#a358abb6555f6ca6b2b2b1412c9117bec":[15,0,0,2,1,2,4],
+"icmp6_8c.html#a3c0a84e0944263d92c9dc3ad094ffcb0":[15,0,0,2,1,2,2],
+"icmp6_8c.html#a6094fa333b2cbf1b1b062e72313ef146":[15,0,0,2,1,2,3],
+"icmp6_8c.html#a94bec819e11f51c8088ca338f2e36c3d":[15,0,0,2,1,2,1],
+"icmp6_8c.html#ab480867394952904b5607d62315bdbac":[15,0,0,2,1,2,0],
+"icmp6_8c.html#ad01e5bc4690a2c6aeb534237a5a9b593":[15,0,0,2,1,2,5],
+"icmp6_8h.html":[15,0,0,3,1,20],
+"icmp6_8h.html#a358abb6555f6ca6b2b2b1412c9117bec":[15,0,0,3,1,20,4],
+"icmp6_8h.html#a3c0a84e0944263d92c9dc3ad094ffcb0":[15,0,0,3,1,20,2],
+"icmp6_8h.html#a6094fa333b2cbf1b1b062e72313ef146":[15,0,0,3,1,20,3],
+"icmp6_8h.html#a94bec819e11f51c8088ca338f2e36c3d":[15,0,0,3,1,20,1],
+"icmp6_8h.html#ab480867394952904b5607d62315bdbac":[15,0,0,3,1,20,0],
+"icmp6_8h.html#ad01e5bc4690a2c6aeb534237a5a9b593":[15,0,0,3,1,20,5],
+"icmp_8c.html":[15,0,0,2,0,4],
+"icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119":[15,0,0,2,0,4,3],
+"icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e":[15,0,0,2,0,4,0],
+"icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1":[15,0,0,2,0,4,2],
+"icmp_8c.html#ae26c59eab4ce553964a0c9d43f534d06":[15,0,0,2,0,4,1],
+"icmp_8h.html":[15,0,0,3,1,19],
+"icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a":[15,0,0,3,1,19,1],
+"icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796":[15,0,0,3,1,19,1,1],
+"icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c":[15,0,0,3,1,19,1,0],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5":[15,0,0,3,1,19,0],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3c7bbd13b613990413ef167017dfbcef":[15,0,0,3,1,19,0,2],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a3cc3714544e123bdef2eadb1a4d320e3":[15,0,0,3,1,19,0,0],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a648ab915a76dfb7b9568e94de00da1e7":[15,0,0,3,1,19,0,1],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5a8be2bc49d42aa1a6ee1da93a8700ef5f":[15,0,0,3,1,19,0,4],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5ac973dd9b04e094043ccc4cf875ef5644":[15,0,0,3,1,19,0,3],
+"icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13":[15,0,0,3,1,19,0,5],
+"icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119":[15,0,0,3,1,19,4],
+"icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1":[15,0,0,3,1,19,3],
+"icmp_8h.html#ae26c59eab4ce553964a0c9d43f534d06":[15,0,0,3,1,19,2],
+"ieee802154_8h.html":[15,0,0,3,2,4],
+"ieee_8h.html":[15,0,0,3,1,2,10],
+"if_8h.html":[15,0,0,3,0,0,1,0],
+"if__api_8c.html":[15,0,0,0,3],
+"if__api_8h.html":[15,0,0,3,1,21],
+"igmp_8c.html":[15,0,0,2,0,5],
+"igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a":[15,0,0,2,0,5,1],
+"igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1":[15,0,0,2,0,5,10],
+"igmp_8c.html#a695bd07cc4997aedb871b83456e18890":[15,0,0,2,0,5,6],
+"igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6":[15,0,0,2,0,5,8],
+"igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8":[15,0,0,2,0,5,0],
+"igmp_8c.html#af06eeba0e984aab4a67a836eab577726":[15,0,0,2,0,5,7],
+"igmp_8c.html#afc19bd532855a64c021be08172065f84":[15,0,0,2,0,5,9],
+"igmp_8h.html":[15,0,0,3,1,22],
+"igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a":[15,0,0,3,1,22,3],
+"igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1":[15,0,0,3,1,22,12],
+"igmp_8h.html#a695bd07cc4997aedb871b83456e18890":[15,0,0,3,1,22,8],
+"igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6":[15,0,0,3,1,22,10],
+"igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8":[15,0,0,3,1,22,2],
+"igmp_8h.html#af06eeba0e984aab4a67a836eab577726":[15,0,0,3,1,22,9],
+"igmp_8h.html#afc19bd532855a64c021be08172065f84":[15,0,0,3,1,22,11],
 "index.html":[],
 "index.html":[0],
-"inet6_8c.html":[14,0,0,2,1,3],
-"inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3":[14,0,0,2,1,3,0],
-"inet__chksum_8c.html":[14,0,0,2,7],
-"inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88":[14,0,0,2,7,1],
-"inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865":[14,0,0,2,7,0],
-"inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b":[14,0,0,2,7,2],
-"inet__chksum_8h.html":[14,0,0,3,1,23],
-"inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18":[14,0,0,3,1,23,1],
-"inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88":[14,0,0,3,1,23,3],
-"inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01":[14,0,0,3,1,23,0],
-"inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865":[14,0,0,3,1,23,2],
-"inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b":[14,0,0,3,1,23,4],
-"init_8c.html":[14,0,0,2,8],
-"init_8h.html":[14,0,0,3,1,24],
-"ip4_8c.html":[14,0,0,2,0,5],
-"ip4_8c.html#a0d912e400875396792a12ea443ecc1cf":[14,0,0,2,0,5,5],
-"ip4_8c.html#a185c7d6380711847105430931692b267":[14,0,0,2,0,5,0],
-"ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7":[14,0,0,2,0,5,7],
-"ip4_8c.html#a5bbbec93cef9133ed07d8c2cd9bc80f3":[14,0,0,2,0,5,8],
-"ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f":[14,0,0,2,0,5,1],
-"ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917":[14,0,0,2,0,5,4],
-"ip4_8c.html#ac04e6e67e8f0aff18dd4cf8a2439f56e":[14,0,0,2,0,5,9],
-"ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8":[14,0,0,2,0,5,3],
-"ip4_8c.html#accd56b095730de4ad56728bfcb349940":[14,0,0,2,0,5,6],
-"ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b":[14,0,0,2,0,5,2],
-"ip4_8h.html":[14,0,0,3,1,26],
-"ip4_8h.html#a0d912e400875396792a12ea443ecc1cf":[14,0,0,3,1,26,4],
-"ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7":[14,0,0,3,1,26,6],
-"ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824":[14,0,0,3,1,26,0],
-"ip4_8h.html#a5bbbec93cef9133ed07d8c2cd9bc80f3":[14,0,0,3,1,26,7],
-"ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917":[14,0,0,3,1,26,3],
-"ip4_8h.html#ac04e6e67e8f0aff18dd4cf8a2439f56e":[14,0,0,3,1,26,8],
-"ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8":[14,0,0,3,1,26,2],
-"ip4_8h.html#accd56b095730de4ad56728bfcb349940":[14,0,0,3,1,26,5],
-"ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b":[14,0,0,3,1,26,1],
-"ip4__addr_8c.html":[14,0,0,2,0,6],
-"ip4__addr_8c.html#a2c05f9138da41115978409e547df9670":[14,0,0,2,0,6,5],
-"ip4__addr_8c.html#a3abcfd31a756ccc91ceef5e59216f2d4":[14,0,0,2,0,6,4],
-"ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421":[14,0,0,2,0,6,0],
-"ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071":[14,0,0,2,0,6,1],
-"ip4__addr_8c.html#af01e406c5f44a325d779c4b4282a1744":[14,0,0,2,0,6,3],
-"ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a":[14,0,0,2,0,6,2],
-"ip4__addr_8h.html":[14,0,0,3,1,27],
-"ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1":[14,0,0,3,1,27,13],
-"ip4__addr_8h.html#a2c05f9138da41115978409e547df9670":[14,0,0,3,1,27,24],
-"ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5":[14,0,0,3,1,27,2],
-"ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88":[14,0,0,3,1,27,7],
-"ip4__addr_8h.html#a3abcfd31a756ccc91ceef5e59216f2d4":[14,0,0,3,1,27,23],
-"ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e":[14,0,0,3,1,27,18],
-"ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051":[14,0,0,3,1,27,5],
-"ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974":[14,0,0,3,1,27,1],
-"ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c":[14,0,0,3,1,27,10],
-"ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e":[14,0,0,3,1,27,16],
-"ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9":[14,0,0,3,1,27,3],
-"ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a":[14,0,0,3,1,27,9],
-"ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea":[14,0,0,3,1,27,12],
-"ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421":[14,0,0,3,1,27,19],
-"ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071":[14,0,0,3,1,27,20],
-"ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544":[14,0,0,3,1,27,17],
-"ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a":[14,0,0,3,1,27,15],
-"ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b":[14,0,0,3,1,27,4],
-"ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2":[14,0,0,3,1,27,14],
-"ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520":[14,0,0,3,1,27,11],
-"ip4__addr_8h.html#af01e406c5f44a325d779c4b4282a1744":[14,0,0,3,1,27,22],
-"ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a":[14,0,0,3,1,27,21],
-"ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567":[14,0,0,3,1,27,8],
-"ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514":[14,0,0,3,1,27,6],
-"ip4__frag_8c.html":[14,0,0,2,0,7],
-"ip4__frag_8c.html#a510934accf149433bdcf683993e79080":[14,0,0,2,0,7,2],
-"ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c":[14,0,0,2,0,7,3],
-"ip4__frag_8c.html#aa73b0bc1e6e38c47548319af47f51052":[14,0,0,2,0,7,4],
-"ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88":[14,0,0,2,0,7,5],
-"ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe":[14,0,0,2,0,7,1],
-"ip4__frag_8h.html":[14,0,0,3,1,28],
-"ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c":[14,0,0,3,1,28,2],
-"ip4__frag_8h.html#aa73b0bc1e6e38c47548319af47f51052":[14,0,0,3,1,28,3],
-"ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88":[14,0,0,3,1,28,4],
-"ip6_8c.html":[14,0,0,2,1,4],
-"ip6_8c.html#a519686a2c3beb689bf1d3380c4e5efb1":[14,0,0,2,1,4,5],
-"ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56":[14,0,0,2,1,4,4],
-"ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094":[14,0,0,2,1,4,0],
-"ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e":[14,0,0,2,1,4,1],
-"ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4":[14,0,0,2,1,4,3],
-"ip6_8c.html#aec695e64536ac744e616c997deb84cda":[14,0,0,2,1,4,2],
-"ip6_8h.html":[14,0,0,3,1,29],
-"ip6_8h.html#a519686a2c3beb689bf1d3380c4e5efb1":[14,0,0,3,1,29,5],
-"ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56":[14,0,0,3,1,29,4],
-"ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094":[14,0,0,3,1,29,0],
-"ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e":[14,0,0,3,1,29,1],
-"ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4":[14,0,0,3,1,29,3],
-"ip6_8h.html#aec695e64536ac744e616c997deb84cda":[14,0,0,3,1,29,2],
-"ip6__addr_8c.html":[14,0,0,2,1,5],
-"ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e":[14,0,0,2,1,5,0],
-"ip6__addr_8c.html#ab153e5b58a5674e5e1bacdbbc0934c44":[14,0,0,2,1,5,1],
-"ip6__addr_8c.html#ac0470fb6b6fdbf986a20e523870e6f2e":[14,0,0,2,1,5,2],
-"ip6__addr_8h.html":[14,0,0,3,1,30],
-"ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292":[14,0,0,3,1,30,22],
-"ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3":[14,0,0,3,1,30,14],
-"ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3":[14,0,0,3,1,30,7],
-"ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8":[14,0,0,3,1,30,11],
-"ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd":[14,0,0,3,1,30,18],
-"ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71":[14,0,0,3,1,30,5],
-"ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3":[14,0,0,3,1,30,1],
-"ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e":[14,0,0,3,1,30,25],
-"ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c":[14,0,0,3,1,30,6],
-"ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6":[14,0,0,3,1,30,4],
-"ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b":[14,0,0,3,1,30,15],
-"ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2":[14,0,0,3,1,30,16],
-"ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073":[14,0,0,3,1,30,13],
-"ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921":[14,0,0,3,1,30,3],
-"ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad":[14,0,0,3,1,30,19],
-"ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762":[14,0,0,3,1,30,24],
-"ip6__addr_8h.html#ab153e5b58a5674e5e1bacdbbc0934c44":[14,0,0,3,1,30,26],
-"ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb":[14,0,0,3,1,30,8],
-"ip6__addr_8h.html#ac0470fb6b6fdbf986a20e523870e6f2e":[14,0,0,3,1,30,27],
-"ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342":[14,0,0,3,1,30,17],
-"ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322":[14,0,0,3,1,30,12],
-"ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2":[14,0,0,3,1,30,21],
-"ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c":[14,0,0,3,1,30,2],
-"ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b":[14,0,0,3,1,30,20],
-"ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1":[14,0,0,3,1,30,10],
-"ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4":[14,0,0,3,1,30,9],
-"ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c":[14,0,0,3,1,30,23],
-"ip6__frag_8c.html":[14,0,0,2,1,6],
-"ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37":[14,0,0,2,1,6,3],
-"ip6__frag_8c.html#a510934accf149433bdcf683993e79080":[14,0,0,2,1,6,2],
-"ip6__frag_8c.html#aa29dd0a8b5622216643581f243cd423a":[14,0,0,2,1,6,4],
-"ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe":[14,0,0,2,1,6,1],
-"ip6__frag_8h.html":[14,0,0,3,1,31],
-"ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7":[14,0,0,3,1,31,3],
-"ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37":[14,0,0,3,1,31,4],
-"ip6__frag_8h.html#aa29dd0a8b5622216643581f243cd423a":[14,0,0,3,1,31,5],
-"ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2":[14,0,0,3,1,31,2],
-"ip6__zone_8h.html":[14,0,0,3,1,32],
-"ip_8c.html":[14,0,0,2,9],
-"ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c":[14,0,0,2,9,4],
-"ip_8h.html":[14,0,0,3,1,25],
-"ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93":[14,0,0,3,1,25,27],
-"ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0":[14,0,0,3,1,25,4],
-"ip_8h.html#a26e077f52de4a97ff89c02415c084518":[14,0,0,3,1,25,16],
-"ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720":[14,0,0,3,1,25,1],
-"ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2":[14,0,0,3,1,25,10],
-"ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063":[14,0,0,3,1,25,28],
-"ip_8h.html#a3ce482b7e08282effd670001198ecd87":[14,0,0,3,1,25,2],
-"ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc":[14,0,0,3,1,25,25],
-"ip_8h.html#a4e35b7692c228c98e738892f0a215647":[14,0,0,3,1,25,14],
-"ip_8h.html#a4e35b7692c228c98e738892f0a215647":[14,0,0,3,1,25,15],
-"ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26":[14,0,0,3,1,25,18],
-"ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53":[14,0,0,3,1,25,24],
-"ip_8h.html#a9135977868017c3deeec86b525e13997":[14,0,0,3,1,25,7],
-"ip_8h.html#a9135977868017c3deeec86b525e13997":[14,0,0,3,1,25,8],
-"ip_8h.html#aabecef3c7653a9767c79245c44fcab9f":[14,0,0,3,1,25,13],
-"ip_8h.html#aac608b92f8f226c3574d6bb855f12496":[14,0,0,3,1,25,22],
-"ip_8h.html#abc56623d434a204298a4e98352af1c9d":[14,0,0,3,1,25,12],
-"ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245":[14,0,0,3,1,25,6],
-"ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c":[14,0,0,3,1,25,30],
-"ip_8h.html#accbc01f37dd426a66de41693a5450207":[14,0,0,3,1,25,20],
-"ip_8h.html#ad2a62f96b9431a79f0258dc13058b160":[14,0,0,3,1,25,3],
-"ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4":[14,0,0,3,1,25,11],
-"ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f":[14,0,0,3,1,25,9],
-"ip_8h.html#af9bf74750c9d7a219ee88d240300fe69":[14,0,0,3,1,25,5],
-"ip__addr_8h.html":[14,0,0,3,1,33],
-"lowpan6_8c.html":[14,0,0,4,4],
-"lowpan6_8c.html#ab33dc87f30aeda871845854511de9931":[14,0,0,4,4,2],
-"lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7":[14,0,0,4,4,8],
-"lowpan6_8h.html":[14,0,0,3,2,5],
-"lowpan6_8h.html#aa258ae16a937c40333c8f97a7f236797":[14,0,0,3,2,5,0],
-"lowpan6_8h.html#ab33dc87f30aeda871845854511de9931":[14,0,0,3,2,5,1],
-"lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7":[14,0,0,3,2,5,7],
-"lowpan6__ble_8c.html":[14,0,0,4,5],
-"lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593":[14,0,0,4,5,8],
-"lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0":[14,0,0,4,5,9],
-"lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2":[14,0,0,4,5,7],
-"lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a":[14,0,0,4,5,10],
-"lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2":[14,0,0,4,5,6],
-"lowpan6__ble_8h.html":[14,0,0,3,2,6],
-"lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593":[14,0,0,3,2,6,8],
-"lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0":[14,0,0,3,2,6,9],
-"lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2":[14,0,0,3,2,6,7]
+"inet6_8c.html":[15,0,0,2,1,3],
+"inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3":[15,0,0,2,1,3,0],
+"inet__chksum_8c.html":[15,0,0,2,7],
+"inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88":[15,0,0,2,7,1],
+"inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865":[15,0,0,2,7,0],
+"inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b":[15,0,0,2,7,2],
+"inet__chksum_8h.html":[15,0,0,3,1,24],
+"inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18":[15,0,0,3,1,24,1],
+"inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88":[15,0,0,3,1,24,3],
+"inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01":[15,0,0,3,1,24,0],
+"inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865":[15,0,0,3,1,24,2],
+"inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b":[15,0,0,3,1,24,4],
+"init_8c.html":[15,0,0,2,8],
+"init_8h.html":[15,0,0,3,1,25],
+"ip4_8c.html":[15,0,0,2,0,6],
+"ip4_8c.html#a0d912e400875396792a12ea443ecc1cf":[15,0,0,2,0,6,5],
+"ip4_8c.html#a185c7d6380711847105430931692b267":[15,0,0,2,0,6,0],
+"ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7":[15,0,0,2,0,6,7],
+"ip4_8c.html#a5bbbec93cef9133ed07d8c2cd9bc80f3":[15,0,0,2,0,6,8],
+"ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f":[15,0,0,2,0,6,1],
+"ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917":[15,0,0,2,0,6,4],
+"ip4_8c.html#ac04e6e67e8f0aff18dd4cf8a2439f56e":[15,0,0,2,0,6,9],
+"ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8":[15,0,0,2,0,6,3],
+"ip4_8c.html#accd56b095730de4ad56728bfcb349940":[15,0,0,2,0,6,6],
+"ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b":[15,0,0,2,0,6,2],
+"ip4_8h.html":[15,0,0,3,1,27],
+"ip4_8h.html#a0d912e400875396792a12ea443ecc1cf":[15,0,0,3,1,27,4],
+"ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7":[15,0,0,3,1,27,6],
+"ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824":[15,0,0,3,1,27,0],
+"ip4_8h.html#a5bbbec93cef9133ed07d8c2cd9bc80f3":[15,0,0,3,1,27,7],
+"ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917":[15,0,0,3,1,27,3],
+"ip4_8h.html#ac04e6e67e8f0aff18dd4cf8a2439f56e":[15,0,0,3,1,27,8],
+"ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8":[15,0,0,3,1,27,2],
+"ip4_8h.html#accd56b095730de4ad56728bfcb349940":[15,0,0,3,1,27,5],
+"ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b":[15,0,0,3,1,27,1],
+"ip4__addr_8c.html":[15,0,0,2,0,7],
+"ip4__addr_8c.html#a2c05f9138da41115978409e547df9670":[15,0,0,2,0,7,5],
+"ip4__addr_8c.html#a3abcfd31a756ccc91ceef5e59216f2d4":[15,0,0,2,0,7,4],
+"ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421":[15,0,0,2,0,7,0],
+"ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071":[15,0,0,2,0,7,1],
+"ip4__addr_8c.html#af01e406c5f44a325d779c4b4282a1744":[15,0,0,2,0,7,3],
+"ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a":[15,0,0,2,0,7,2],
+"ip4__addr_8h.html":[15,0,0,3,1,28],
+"ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1":[15,0,0,3,1,28,15],
+"ip4__addr_8h.html#a2c05f9138da41115978409e547df9670":[15,0,0,3,1,28,26],
+"ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5":[15,0,0,3,1,28,3],
+"ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88":[15,0,0,3,1,28,9],
+"ip4__addr_8h.html#a3abcfd31a756ccc91ceef5e59216f2d4":[15,0,0,3,1,28,25],
+"ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e":[15,0,0,3,1,28,20],
+"ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051":[15,0,0,3,1,28,6],
+"ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974":[15,0,0,3,1,28,1],
+"ip4__addr_8h.html#a59494c562c62fdf62a6c9c6a66a50fb3":[15,0,0,3,1,28,2],
+"ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c":[15,0,0,3,1,28,12],
+"ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e":[15,0,0,3,1,28,18],
+"ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9":[15,0,0,3,1,28,4],
+"ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a":[15,0,0,3,1,28,11],
+"ip4__addr_8h.html#a95d05df9201602fc873a97fb61fd1134":[15,0,0,3,1,28,7],
+"ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea":[15,0,0,3,1,28,14],
+"ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421":[15,0,0,3,1,28,21],
+"ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071":[15,0,0,3,1,28,22],
+"ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544":[15,0,0,3,1,28,19],
+"ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a":[15,0,0,3,1,28,17],
+"ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b":[15,0,0,3,1,28,5],
+"ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2":[15,0,0,3,1,28,16],
+"ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520":[15,0,0,3,1,28,13],
+"ip4__addr_8h.html#af01e406c5f44a325d779c4b4282a1744":[15,0,0,3,1,28,24],
+"ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a":[15,0,0,3,1,28,23],
+"ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567":[15,0,0,3,1,28,10],
+"ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514":[15,0,0,3,1,28,8],
+"ip4__frag_8c.html":[15,0,0,2,0,8],
+"ip4__frag_8c.html#a510934accf149433bdcf683993e79080":[15,0,0,2,0,8,2],
+"ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c":[15,0,0,2,0,8,3],
+"ip4__frag_8c.html#aa73b0bc1e6e38c47548319af47f51052":[15,0,0,2,0,8,4],
+"ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88":[15,0,0,2,0,8,5],
+"ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe":[15,0,0,2,0,8,1],
+"ip4__frag_8h.html":[15,0,0,3,1,29],
+"ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c":[15,0,0,3,1,29,2],
+"ip4__frag_8h.html#aa73b0bc1e6e38c47548319af47f51052":[15,0,0,3,1,29,3],
+"ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88":[15,0,0,3,1,29,4],
+"ip6_8c.html":[15,0,0,2,1,4],
+"ip6_8c.html#a519686a2c3beb689bf1d3380c4e5efb1":[15,0,0,2,1,4,5],
+"ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56":[15,0,0,2,1,4,4],
+"ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094":[15,0,0,2,1,4,0],
+"ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e":[15,0,0,2,1,4,1],
+"ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4":[15,0,0,2,1,4,3],
+"ip6_8c.html#aec695e64536ac744e616c997deb84cda":[15,0,0,2,1,4,2],
+"ip6_8h.html":[15,0,0,3,1,30],
+"ip6_8h.html#a519686a2c3beb689bf1d3380c4e5efb1":[15,0,0,3,1,30,5],
+"ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56":[15,0,0,3,1,30,4],
+"ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094":[15,0,0,3,1,30,0],
+"ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e":[15,0,0,3,1,30,1],
+"ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4":[15,0,0,3,1,30,3],
+"ip6_8h.html#aec695e64536ac744e616c997deb84cda":[15,0,0,3,1,30,2],
+"ip6__addr_8c.html":[15,0,0,2,1,5],
+"ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e":[15,0,0,2,1,5,0],
+"ip6__addr_8c.html#ab153e5b58a5674e5e1bacdbbc0934c44":[15,0,0,2,1,5,1],
+"ip6__addr_8c.html#ac0470fb6b6fdbf986a20e523870e6f2e":[15,0,0,2,1,5,2],
+"ip6__addr_8h.html":[15,0,0,3,1,31],
+"ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292":[15,0,0,3,1,31,26],
+"ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3":[15,0,0,3,1,31,14],
+"ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3":[15,0,0,3,1,31,7],
+"ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8":[15,0,0,3,1,31,11],
+"ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd":[15,0,0,3,1,31,22],
+"ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71":[15,0,0,3,1,31,5],
+"ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3":[15,0,0,3,1,31,1],
+"ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e":[15,0,0,3,1,31,30],
+"ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c":[15,0,0,3,1,31,6],
+"ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6":[15,0,0,3,1,31,4]
 };
diff --git a/doc/doxygen/output/html/navtreeindex7.js b/doc/doxygen/output/html/navtreeindex7.js
index 67ed31e..9564b90 100644
--- a/doc/doxygen/output/html/navtreeindex7.js
+++ b/doc/doxygen/output/html/navtreeindex7.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX7 =
 {
-"lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a":[14,0,0,3,2,6,10],
-"lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2":[14,0,0,3,2,6,6],
-"lowpan6__common_8c.html":[14,0,0,4,6],
-"lowpan6__common_8h.html":[14,0,0,3,2,7],
-"lowpan6__opts_8h.html":[14,0,0,3,2,8],
-"lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa":[14,0,0,3,2,8,3],
-"lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8":[14,0,0,3,2,8,8],
-"lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a":[14,0,0,3,2,8,4],
-"lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1":[14,0,0,3,2,8,9],
-"lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207":[14,0,0,3,2,8,2],
-"lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0":[14,0,0,3,2,8,7],
-"lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58":[14,0,0,3,2,8,5],
-"lowpan6__opts_8h.html#ad20840e31a0a6eeec8666e4d4a979f43":[14,0,0,3,2,8,1],
-"lowpan6__opts_8h.html#ae5bb9b8d695caec08930073edc7c6175":[14,0,0,3,2,8,0],
-"lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754":[14,0,0,3,2,8,6],
-"lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8":[14,0,0,3,2,8,10],
-"lwip_2errno_8h.html":[14,0,0,3,1,15],
-"lwip_2etharp_8h.html":[14,0,0,3,1,16],
-"lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c":[14,0,0,3,1,16,4],
-"lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d":[14,0,0,3,1,16,7],
-"lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15":[14,0,0,3,1,16,9],
-"lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6":[14,0,0,3,1,16,6],
-"lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26":[14,0,0,3,1,16,10],
-"lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e":[14,0,0,3,1,16,2],
-"lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37":[14,0,0,3,1,16,1],
-"lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8":[14,0,0,3,1,16,5],
-"lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c":[14,0,0,3,1,16,8],
-"lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05":[14,0,0,3,1,16,3],
-"lwip_2inet_8h.html":[14,0,0,3,1,22],
-"lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c":[14,0,0,3,1,22,0],
-"lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea":[14,0,0,3,1,22,5],
-"lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986":[14,0,0,3,1,22,3],
-"lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37":[14,0,0,3,1,22,1],
-"lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab":[14,0,0,3,1,22,2],
-"lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378":[14,0,0,3,1,22,4],
-"lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3":[14,0,0,3,1,22,6],
-"lwip_2netdb_8h.html":[14,0,0,3,1,39],
-"lwip_2netdb_8h.html#a0bb00f48d6ba1e8c55b7d85c8e3a19a7":[14,0,0,3,1,39,0],
-"lwip_2netdb_8h.html#a2a1ce3f2040007303d36c0b682b5ac10":[14,0,0,3,1,39,5],
-"lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5":[14,0,0,3,1,39,1],
-"lwip_2netdb_8h.html#abe6a6a103a2f6fa4e13098e455ac7bb3":[14,0,0,3,1,39,3],
-"lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165":[14,0,0,3,1,39,2],
-"lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d":[14,0,0,3,1,39,4],
-"lwip_2prot_2etharp_8h.html":[14,0,0,3,1,2,4],
-"lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419":[14,0,0,3,1,2,4,2],
-"lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030":[14,0,0,3,1,2,4,3],
-"lwip_2prot_2ethernet_8h.html":[14,0,0,3,1,2,5],
-"lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee":[14,0,0,3,1,2,5,3],
-"lwip_2prot_2ethernet_8h.html#a8ebe93c6ad2d743e6c952539257679b6":[14,0,0,3,1,2,5,5],
-"lwip_2prot_2ethernet_8h.html#afaf6cbccf9477c3505660e3a17860e07":[14,0,0,3,1,2,5,4],
-"lwiperf_8c.html":[14,0,0,1,2,0],
-"lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a":[14,0,0,1,2,0,3],
-"lwiperf_8c.html#a1e652bca1f12cfe6187a567d6b3be6a2":[14,0,0,1,2,0,5],
-"lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673":[14,0,0,1,2,0,4],
-"lwiperf_8c.html#a96ae8ebbc5d13657a641ed174ae22e5b":[14,0,0,1,2,0,6],
-"lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902":[14,0,0,1,2,0,2],
-"lwiperf_8h.html":[14,0,0,3,1,0,5],
-"lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd":[14,0,0,3,1,0,5,0],
-"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c":[14,0,0,3,1,0,5,1],
-"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede":[14,0,0,3,1,0,5,1,1],
-"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964":[14,0,0,3,1,0,5,1,2],
-"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110":[14,0,0,3,1,0,5,1,0],
-"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6":[14,0,0,3,1,0,5,2],
-"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40":[14,0,0,3,1,0,5,2,4],
-"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b":[14,0,0,3,1,0,5,2,1],
-"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5":[14,0,0,3,1,0,5,2,0],
-"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb":[14,0,0,3,1,0,5,2,2],
-"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5":[14,0,0,3,1,0,5,2,3],
-"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d":[14,0,0,3,1,0,5,2,5],
-"mdns_8c.html":[14,0,0,1,3,0],
-"mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1":[14,0,0,1,3,0,15],
-"mdns_8c.html#a17db69fa887515374452b945e959bbf9":[14,0,0,1,3,0,6],
-"mdns_8c.html#a52d8f70432ae998814f16b18431213cd":[14,0,0,1,3,0,7],
-"mdns_8c.html#ab5f49d9356a76879e0e6a14eb0643b23":[14,0,0,1,3,0,8],
-"mdns_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e":[14,0,0,1,3,0,5],
-"mdns_8h.html":[14,0,0,3,1,0,6],
-"mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1":[14,0,0,3,1,0,6,9],
-"mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536":[14,0,0,3,1,0,6,1],
-"mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83":[14,0,0,3,1,0,6,2],
-"mdns__opts_8h.html":[14,0,0,3,1,0,7],
-"mdns__priv_8h.html":[14,0,0,3,1,0,8],
-"mdns__priv_8h.html#a17db69fa887515374452b945e959bbf9":[14,0,0,3,1,0,8,1],
-"mdns__priv_8h.html#a52d8f70432ae998814f16b18431213cd":[14,0,0,3,1,0,8,2],
-"mdns__priv_8h.html#ab5f49d9356a76879e0e6a14eb0643b23":[14,0,0,3,1,0,8,3],
-"mdns__priv_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e":[14,0,0,3,1,0,8,0],
-"mem_8c.html":[14,0,0,2,10],
-"mem_8c.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7":[14,0,0,2,10,2],
-"mem_8c.html#a278694c2333c9826f21ddd2c2d220f66":[14,0,0,2,10,1],
-"mem_8c.html#a44a136e3b70c36abb6f8dc060c778113":[14,0,0,2,10,4],
-"mem_8c.html#a65169147c44e9db60d997819af9b455c":[14,0,0,2,10,3],
-"mem_8c.html#ab0915b39bd096766771ef4cf719bfb40":[14,0,0,2,10,6],
-"mem_8c.html#ae2190f95ae9c46bb99ec0be4f4e4e5e4":[14,0,0,2,10,5],
-"mem_8c.html#aeb811c25ce74d9ff398ccbb29874bba9":[14,0,0,2,10,7],
-"mem_8h.html":[14,0,0,3,1,34],
-"mem_8h.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7":[14,0,0,3,1,34,0],
-"mem_8h.html#a2ba2d1e6fc284b1850eedb673eba96b0":[14,0,0,3,1,34,4],
-"mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a":[14,0,0,3,1,34,1],
-"mem_8h.html#a44a136e3b70c36abb6f8dc060c778113":[14,0,0,3,1,34,2],
-"mem_8h.html#a52ce222aebe4b7dce7f25cd536b6e650":[14,0,0,3,1,34,3],
-"mem__priv_8h.html":[14,0,0,3,1,1,2],
-"mem_err.html":[5],
-"memp_8c.html":[14,0,0,2,11],
-"memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5":[14,0,0,2,11,1],
-"memp_8c.html#a6416303426d05526bed33f241fa6ecd7":[14,0,0,2,11,3],
-"memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2":[14,0,0,2,11,2],
-"memp_8c.html#ab6bfb9562c3a77e329a888e59ef0ace3":[14,0,0,2,11,5],
-"memp_8c.html#ac49689457203bfb872adf5428f96a3e7":[14,0,0,2,11,4],
-"memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f":[14,0,0,2,11,0],
-"memp_8h.html":[14,0,0,3,1,35],
-"memp_8h.html#a85a164b1f7764951cc685ea525114e57":[14,0,0,3,1,35,5],
-"memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2":[14,0,0,3,1,35,7],
-"memp_8h.html#ac49689457203bfb872adf5428f96a3e7":[14,0,0,3,1,35,8],
-"memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f":[14,0,0,3,1,35,6],
-"memp__priv_8h.html":[14,0,0,3,1,1,3],
-"memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5":[14,0,0,3,1,1,3,1],
-"memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7":[14,0,0,3,1,1,3,2],
-"memp__priv_8h.html#ab6bfb9562c3a77e329a888e59ef0ace3":[14,0,0,3,1,1,3,3],
-"memp__std_8h.html":[14,0,0,3,1,1,4],
-"mld6_8c.html":[14,0,0,2,1,7],
-"mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686":[14,0,0,2,1,7,6],
-"mld6_8c.html#a496197eef3f8b4c2a0fd49734aee07d6":[14,0,0,2,1,7,5],
-"mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274":[14,0,0,2,1,7,8],
-"mld6_8c.html#a7c190ca25432d466b28f607c3574a841":[14,0,0,2,1,7,0],
-"mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198":[14,0,0,2,1,7,7],
-"mld6_8h.html":[14,0,0,3,1,36],
-"mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686":[14,0,0,3,1,36,8],
-"mld6_8h.html#a496197eef3f8b4c2a0fd49734aee07d6":[14,0,0,3,1,36,7],
-"mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274":[14,0,0,3,1,36,10],
-"mld6_8h.html#a7c190ca25432d466b28f607c3574a841":[14,0,0,3,1,36,2],
-"mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198":[14,0,0,3,1,36,9],
-"mqtt_8c.html":[14,0,0,1,4,0],
-"mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b":[14,0,0,1,4,0,0],
-"mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12":[14,0,0,1,4,0,4],
-"mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d":[14,0,0,1,4,0,1],
-"mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1":[14,0,0,1,4,0,5],
-"mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3":[14,0,0,1,4,0,3],
-"mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa":[14,0,0,1,4,0,2],
-"mqtt_8h.html":[14,0,0,3,1,0,9],
-"mqtt__opts_8h.html":[14,0,0,3,1,0,10],
-"mqtt__priv_8h.html":[14,0,0,3,1,0,11],
-"multithreading.html":[9],
-"nd6_8c.html":[14,0,0,2,1,8],
-"nd6_8c.html#a27224542b8ffab81c2ed9f47752bb51e":[14,0,0,2,1,8,0],
-"nd6_8c.html#a4959990cae26a3996f638ec996f046df":[14,0,0,2,1,8,7],
-"nd6_8c.html#a64d7956cf2b0d45025b02661f3f62377":[14,0,0,2,1,8,2],
-"nd6_8c.html#a73d3192204da20be193e3c00c4a0cb54":[14,0,0,2,1,8,8],
-"nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe":[14,0,0,2,1,8,9],
-"nd6_8c.html#a84f9f52cab7ae37b4dd343536156dc73":[14,0,0,2,1,8,1],
-"nd6_8c.html#abbb92837e715be0e7d99513a84995831":[14,0,0,2,1,8,6],
-"nd6_8c.html#ae447c204ebbf71e6ebbc5ed727a73eb9":[14,0,0,2,1,8,5],
-"nd6_8c.html#af226438f4f9b4aa7c3a2bbdf3c1e948c":[14,0,0,2,1,8,4],
-"nd6_8c.html#af4a71e18bb01efb89f9181676784efa7":[14,0,0,2,1,8,3],
-"nd6_8h.html":[14,0,0,3,1,37],
-"nd6_8h.html#a27224542b8ffab81c2ed9f47752bb51e":[14,0,0,3,1,37,2],
-"nd6_8h.html#a2fec65c0785551bad3a282ddee4062ac":[14,0,0,3,1,37,0],
-"nd6_8h.html#a3250c1e32713635d588cf25865ebed56":[14,0,0,3,1,37,1],
-"nd6_8h.html#a4959990cae26a3996f638ec996f046df":[14,0,0,3,1,37,9],
-"nd6_8h.html#a64d7956cf2b0d45025b02661f3f62377":[14,0,0,3,1,37,4],
-"nd6_8h.html#a73d3192204da20be193e3c00c4a0cb54":[14,0,0,3,1,37,10],
-"nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe":[14,0,0,3,1,37,11],
-"nd6_8h.html#a84f9f52cab7ae37b4dd343536156dc73":[14,0,0,3,1,37,3],
-"nd6_8h.html#abbb92837e715be0e7d99513a84995831":[14,0,0,3,1,37,8],
-"nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9":[14,0,0,3,1,37,7],
-"nd6_8h.html#af226438f4f9b4aa7c3a2bbdf3c1e948c":[14,0,0,3,1,37,6],
-"nd6_8h.html#af4a71e18bb01efb89f9181676784efa7":[14,0,0,3,1,37,5],
-"nd6__priv_8h.html":[14,0,0,3,1,1,5],
-"netbiosns_8c.html":[14,0,0,1,5,0],
-"netbiosns_8c.html#a35d43ea3290f6412e45598b610f03cf1":[14,0,0,1,5,0,8],
-"netbiosns_8c.html#a4b83658c5bbb9ac90aca4351086a9a00":[14,0,0,1,5,0,7],
-"netbiosns_8c.html#ae00d45caef5a670e3aedde2788b3f212":[14,0,0,1,5,0,6],
-"netbiosns_8c.html#af09685abf1739c802bc8772b35b7fb1c":[14,0,0,1,5,0,5],
-"netbiosns_8h.html":[14,0,0,3,1,0,12],
-"netbiosns__opts_8h.html":[14,0,0,3,1,0,13],
-"netbuf_8c.html":[14,0,0,0,4],
-"netbuf_8h.html":[14,0,0,3,1,38],
-"netbuf_8h.html#ab38abb4213df4c00b9b3ab844322a090":[14,0,0,3,1,38,2],
-"netbuf_8h.html#ab75db64a9e84eb67a382c30e382d417c":[14,0,0,3,1,38,1],
-"netdb_8c.html":[14,0,0,0,5],
-"netdb_8c.html#a2a1ce3f2040007303d36c0b682b5ac10":[14,0,0,0,5,7],
-"netdb_8c.html#a768ab8ead892d6454709680340cd070e":[14,0,0,0,5,2],
-"netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5":[14,0,0,0,5,3],
-"netdb_8c.html#abe6a6a103a2f6fa4e13098e455ac7bb3":[14,0,0,0,5,5],
-"netdb_8c.html#acfc1e988534c0e497599b904739f92fe":[14,0,0,0,5,1],
-"netdb_8c.html#af356989c172a51187e22b557f22d4165":[14,0,0,0,5,4],
-"netdb_8c.html#afa229e90916f6c8d6308828f45351d2d":[14,0,0,0,5,6],
-"netif_2ethernet_8h.html":[14,0,0,3,2,3],
-"netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365":[14,0,0,3,2,3,0],
-"netif_8c.html":[14,0,0,2,12],
-"netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc":[14,0,0,2,12,8],
-"netif_8c.html#a0fbaed78253d21e1b54e65651da3e327":[14,0,0,2,12,16],
-"netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c":[14,0,0,2,12,32],
-"netif_8c.html#a3d0925cbce550ed461907aee816713ba":[14,0,0,2,12,31],
-"netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c":[14,0,0,2,12,11],
-"netif_8h.html":[14,0,0,3,1,40],
-"netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6":[14,0,0,3,1,40,10],
-"netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc":[14,0,0,3,1,40,48],
-"netif_8h.html#a0fbaed78253d21e1b54e65651da3e327":[14,0,0,3,1,40,56],
-"netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c":[14,0,0,3,1,40,72],
-"netif_8h.html#a22400d2202581b4a7273cded712adf49":[14,0,0,3,1,40,7],
-"netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5":[14,0,0,3,1,40,31],
-"netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a":[14,0,0,3,1,40,27],
-"netif_8h.html#a343a5b14136a51957d552527384674b3":[14,0,0,3,1,40,37],
-"netif_8h.html#a3d0925cbce550ed461907aee816713ba":[14,0,0,3,1,40,71],
-"netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436":[14,0,0,3,1,40,38],
-"netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a":[14,0,0,3,1,40,9],
-"netif_8h.html#a5ad7308195c0581680dd62fb148501cd":[14,0,0,3,1,40,12],
-"netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2":[14,0,0,3,1,40,15],
-"netif_8h.html#a71cad3277efe29191eef3348f4bf21f7":[14,0,0,3,1,40,30],
-"netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c":[14,0,0,3,1,40,51],
-"netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8":[14,0,0,3,1,40,24],
-"netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067":[14,0,0,3,1,40,36],
-"netif_8h.html#a8fb4317a77ee2e3848be80db15618666":[14,0,0,3,1,40,11],
-"netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0":[14,0,0,3,1,40,39],
-"netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f":[14,0,0,3,1,40,39,1],
-"netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e":[14,0,0,3,1,40,39,0],
-"netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e":[14,0,0,3,1,40,32],
-"netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed":[14,0,0,3,1,40,33],
-"netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41":[14,0,0,3,1,40,26],
-"netif_8h.html#ad747072771a887443ab33f90a12077d4":[14,0,0,3,1,40,8],
-"netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2":[14,0,0,3,1,40,13],
-"netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9":[14,0,0,3,1,40,14],
-"netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32":[14,0,0,3,1,40,6],
-"netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468":[14,0,0,3,1,40,34],
-"netifapi_8c.html":[14,0,0,0,6],
-"netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8":[14,0,0,0,6,1],
-"netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7":[14,0,0,0,6,3],
-"netifapi_8c.html#a62b0bdbb3783eb27aa73485081306119":[14,0,0,0,6,0],
-"netifapi_8h.html":[14,0,0,3,1,41],
-"netifapi_8h.html#a037c3d05c19b4d467b6ce06eb4639ee8":[14,0,0,3,1,41,15],
-"netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7":[14,0,0,3,1,41,17],
-"netifapi_8h.html#a62b0bdbb3783eb27aa73485081306119":[14,0,0,3,1,41,14],
-"opt_8h.html":[14,0,0,3,1,42],
-"optimization.html":[10],
-"pages.html":[],
-"pbuf_8c.html":[14,0,0,2,13],
-"pbuf_8c.html#a0f81deff4a0e6e8e0ff161a7b9871449":[14,0,0,2,13,18],
-"pbuf_8c.html#a32dc14bd88dcafa25e627ab18e801815":[14,0,0,2,13,0],
-"pbuf_8c.html#a5df7ac5ae59012fe9aeddba375a72190":[14,0,0,2,13,7],
-"pbuf_8c.html#a9ba3f7b705309ceadb147692fd5a1c7d":[14,0,0,2,13,27],
-"pbuf_8c.html#ab0a834127db093fcb6ffc48d966de318":[14,0,0,2,13,15],
-"pbuf_8c.html#aca0cd8b3f08fbb5e35bc91a663083cc1":[14,0,0,2,13,25],
-"pbuf_8c.html#ace8aac12c3ebe16262c2202bd5eb02ab":[14,0,0,2,13,13],
-"pbuf_8c.html#ad0e64d6fbc423593461063da97da9ce6":[14,0,0,2,13,19],
-"pbuf_8c.html#ad4ef8c5fbbd1447db04f8f73923e7dee":[14,0,0,2,13,1],
-"pbuf_8h.html":[14,0,0,3,1,43],
-"pbuf_8h.html#a018a6499e357f8a1373321f802a82930":[14,0,0,3,1,43,10],
-"pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b":[14,0,0,3,1,43,17],
-"pbuf_8h.html#a27480c41c34021d4417691d327163626":[14,0,0,3,1,43,41],
-"pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815":[14,0,0,3,1,43,22],
-"pbuf_8h.html#a36a915aa2f6a188baa2862881407971e":[14,0,0,3,1,43,11]
+"ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b":[15,0,0,3,1,31,15],
+"ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2":[15,0,0,3,1,31,19],
+"ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073":[15,0,0,3,1,31,13],
+"ip6__addr_8h.html#a811d8a2aa6417ae22a7a46b27d9ead26":[15,0,0,3,1,31,28],
+"ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921":[15,0,0,3,1,31,3],
+"ip6__addr_8h.html#a9a983c7d613ab45e37aaf66c067a0c7a":[15,0,0,3,1,31,17],
+"ip6__addr_8h.html#a9ea0b6b837baff1e1e62cccd4f17d50e":[15,0,0,3,1,31,16],
+"ip6__addr_8h.html#aa324ac65d537997ebaaed78bd40f6da9":[15,0,0,3,1,31,21],
+"ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad":[15,0,0,3,1,31,23],
+"ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762":[15,0,0,3,1,31,29],
+"ip6__addr_8h.html#ab153e5b58a5674e5e1bacdbbc0934c44":[15,0,0,3,1,31,31],
+"ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb":[15,0,0,3,1,31,8],
+"ip6__addr_8h.html#ac0470fb6b6fdbf986a20e523870e6f2e":[15,0,0,3,1,31,32],
+"ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342":[15,0,0,3,1,31,20],
+"ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322":[15,0,0,3,1,31,12],
+"ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2":[15,0,0,3,1,31,25],
+"ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c":[15,0,0,3,1,31,2],
+"ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b":[15,0,0,3,1,31,24],
+"ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1":[15,0,0,3,1,31,10],
+"ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4":[15,0,0,3,1,31,9],
+"ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c":[15,0,0,3,1,31,27],
+"ip6__addr_8h.html#afc9d2b8d0a05f2ff23ab3b7fd3bf8229":[15,0,0,3,1,31,18],
+"ip6__frag_8c.html":[15,0,0,2,1,6],
+"ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37":[15,0,0,2,1,6,3],
+"ip6__frag_8c.html#a510934accf149433bdcf683993e79080":[15,0,0,2,1,6,2],
+"ip6__frag_8c.html#aa29dd0a8b5622216643581f243cd423a":[15,0,0,2,1,6,4],
+"ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe":[15,0,0,2,1,6,1],
+"ip6__frag_8h.html":[15,0,0,3,1,32],
+"ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7":[15,0,0,3,1,32,3],
+"ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37":[15,0,0,3,1,32,4],
+"ip6__frag_8h.html#aa29dd0a8b5622216643581f243cd423a":[15,0,0,3,1,32,5],
+"ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2":[15,0,0,3,1,32,2],
+"ip6__zone_8h.html":[15,0,0,3,1,33],
+"ip_8c.html":[15,0,0,2,9],
+"ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c":[15,0,0,2,9,4],
+"ip_8h.html":[15,0,0,3,1,26],
+"ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93":[15,0,0,3,1,26,27],
+"ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0":[15,0,0,3,1,26,4],
+"ip_8h.html#a26e077f52de4a97ff89c02415c084518":[15,0,0,3,1,26,16],
+"ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720":[15,0,0,3,1,26,1],
+"ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2":[15,0,0,3,1,26,10],
+"ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063":[15,0,0,3,1,26,28],
+"ip_8h.html#a3ce482b7e08282effd670001198ecd87":[15,0,0,3,1,26,2],
+"ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc":[15,0,0,3,1,26,25],
+"ip_8h.html#a4e35b7692c228c98e738892f0a215647":[15,0,0,3,1,26,14],
+"ip_8h.html#a4e35b7692c228c98e738892f0a215647":[15,0,0,3,1,26,15],
+"ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26":[15,0,0,3,1,26,18],
+"ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53":[15,0,0,3,1,26,24],
+"ip_8h.html#a9135977868017c3deeec86b525e13997":[15,0,0,3,1,26,7],
+"ip_8h.html#a9135977868017c3deeec86b525e13997":[15,0,0,3,1,26,8],
+"ip_8h.html#aabecef3c7653a9767c79245c44fcab9f":[15,0,0,3,1,26,13],
+"ip_8h.html#aac608b92f8f226c3574d6bb855f12496":[15,0,0,3,1,26,22],
+"ip_8h.html#abc56623d434a204298a4e98352af1c9d":[15,0,0,3,1,26,12],
+"ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245":[15,0,0,3,1,26,6],
+"ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c":[15,0,0,3,1,26,30],
+"ip_8h.html#accbc01f37dd426a66de41693a5450207":[15,0,0,3,1,26,20],
+"ip_8h.html#ad2a62f96b9431a79f0258dc13058b160":[15,0,0,3,1,26,3],
+"ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4":[15,0,0,3,1,26,11],
+"ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f":[15,0,0,3,1,26,9],
+"ip_8h.html#af9bf74750c9d7a219ee88d240300fe69":[15,0,0,3,1,26,5],
+"ip__addr_8h.html":[15,0,0,3,1,34],
+"lowpan6_8c.html":[15,0,0,4,4],
+"lowpan6_8c.html#ab33dc87f30aeda871845854511de9931":[15,0,0,4,4,2],
+"lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7":[15,0,0,4,4,8],
+"lowpan6_8h.html":[15,0,0,3,2,5],
+"lowpan6_8h.html#aa258ae16a937c40333c8f97a7f236797":[15,0,0,3,2,5,0],
+"lowpan6_8h.html#ab33dc87f30aeda871845854511de9931":[15,0,0,3,2,5,1],
+"lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7":[15,0,0,3,2,5,7],
+"lowpan6__ble_8c.html":[15,0,0,4,5],
+"lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593":[15,0,0,4,5,8],
+"lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0":[15,0,0,4,5,9],
+"lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2":[15,0,0,4,5,7],
+"lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a":[15,0,0,4,5,10],
+"lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2":[15,0,0,4,5,6],
+"lowpan6__ble_8h.html":[15,0,0,3,2,6],
+"lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593":[15,0,0,3,2,6,8],
+"lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0":[15,0,0,3,2,6,9],
+"lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2":[15,0,0,3,2,6,7],
+"lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a":[15,0,0,3,2,6,10],
+"lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2":[15,0,0,3,2,6,6],
+"lowpan6__common_8c.html":[15,0,0,4,6],
+"lowpan6__common_8h.html":[15,0,0,3,2,7],
+"lowpan6__opts_8h.html":[15,0,0,3,2,8],
+"lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa":[15,0,0,3,2,8,3],
+"lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8":[15,0,0,3,2,8,8],
+"lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a":[15,0,0,3,2,8,4],
+"lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1":[15,0,0,3,2,8,9],
+"lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207":[15,0,0,3,2,8,2],
+"lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0":[15,0,0,3,2,8,7],
+"lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58":[15,0,0,3,2,8,5],
+"lowpan6__opts_8h.html#ad20840e31a0a6eeec8666e4d4a979f43":[15,0,0,3,2,8,1],
+"lowpan6__opts_8h.html#ae5bb9b8d695caec08930073edc7c6175":[15,0,0,3,2,8,0],
+"lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754":[15,0,0,3,2,8,6],
+"lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8":[15,0,0,3,2,8,10],
+"lwip_2errno_8h.html":[15,0,0,3,1,16],
+"lwip_2etharp_8h.html":[15,0,0,3,1,17],
+"lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c":[15,0,0,3,1,17,6],
+"lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d":[15,0,0,3,1,17,9],
+"lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15":[15,0,0,3,1,17,11],
+"lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6":[15,0,0,3,1,17,8],
+"lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26":[15,0,0,3,1,17,12],
+"lwip_2etharp_8h.html#a7c41ba8b145fa4d06f8d6af3df44c4ff":[15,0,0,3,1,17,3],
+"lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e":[15,0,0,3,1,17,2],
+"lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37":[15,0,0,3,1,17,1],
+"lwip_2etharp_8h.html#aac7d5048a81ef1c63b18d769700f4899":[15,0,0,3,1,17,4],
+"lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8":[15,0,0,3,1,17,7],
+"lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c":[15,0,0,3,1,17,10],
+"lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05":[15,0,0,3,1,17,5],
+"lwip_2inet_8h.html":[15,0,0,3,1,23],
+"lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c":[15,0,0,3,1,23,0],
+"lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea":[15,0,0,3,1,23,5],
+"lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986":[15,0,0,3,1,23,3],
+"lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37":[15,0,0,3,1,23,1],
+"lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab":[15,0,0,3,1,23,2],
+"lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378":[15,0,0,3,1,23,4],
+"lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3":[15,0,0,3,1,23,6],
+"lwip_2netdb_8h.html":[15,0,0,3,1,40],
+"lwip_2netdb_8h.html#a0bb00f48d6ba1e8c55b7d85c8e3a19a7":[15,0,0,3,1,40,0],
+"lwip_2netdb_8h.html#a2a1ce3f2040007303d36c0b682b5ac10":[15,0,0,3,1,40,5],
+"lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5":[15,0,0,3,1,40,1],
+"lwip_2netdb_8h.html#abe6a6a103a2f6fa4e13098e455ac7bb3":[15,0,0,3,1,40,3],
+"lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165":[15,0,0,3,1,40,2],
+"lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d":[15,0,0,3,1,40,4],
+"lwip_2prot_2etharp_8h.html":[15,0,0,3,1,2,5],
+"lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419":[15,0,0,3,1,2,5,2],
+"lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030":[15,0,0,3,1,2,5,3],
+"lwip_2prot_2ethernet_8h.html":[15,0,0,3,1,2,6],
+"lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee":[15,0,0,3,1,2,6,3],
+"lwip_2prot_2ethernet_8h.html#a8ebe93c6ad2d743e6c952539257679b6":[15,0,0,3,1,2,6,5],
+"lwip_2prot_2ethernet_8h.html#afaf6cbccf9477c3505660e3a17860e07":[15,0,0,3,1,2,6,4],
+"lwiperf_8c.html":[15,0,0,1,2,0],
+"lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a":[15,0,0,1,2,0,3],
+"lwiperf_8c.html#a1e652bca1f12cfe6187a567d6b3be6a2":[15,0,0,1,2,0,5],
+"lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673":[15,0,0,1,2,0,4],
+"lwiperf_8c.html#a96ae8ebbc5d13657a641ed174ae22e5b":[15,0,0,1,2,0,6],
+"lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902":[15,0,0,1,2,0,2],
+"lwiperf_8h.html":[15,0,0,3,1,0,5],
+"lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd":[15,0,0,3,1,0,5,0],
+"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c":[15,0,0,3,1,0,5,1],
+"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede":[15,0,0,3,1,0,5,1,1],
+"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964":[15,0,0,3,1,0,5,1,2],
+"lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110":[15,0,0,3,1,0,5,1,0],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6":[15,0,0,3,1,0,5,2],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40":[15,0,0,3,1,0,5,2,4],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b":[15,0,0,3,1,0,5,2,1],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5":[15,0,0,3,1,0,5,2,0],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb":[15,0,0,3,1,0,5,2,2],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5":[15,0,0,3,1,0,5,2,3],
+"lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d":[15,0,0,3,1,0,5,2,5],
+"mdns_8c.html":[15,0,0,1,3,0],
+"mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1":[15,0,0,1,3,0,12],
+"mdns_8c.html#a482d6bf710af4424b71ee57034edbdbe":[15,0,0,1,3,0,2],
+"mdns_8c.html#aa31b798a5fb96b6ef0dde5d4f32371af":[15,0,0,1,3,0,3],
+"mdns_8c.html#af15fa5b6331bec605f68f53cb87f58fa":[15,0,0,1,3,0,20],
+"mdns_8c.html#af24e590bf9c225a2efc0b55fac14809d":[15,0,0,1,3,0,1],
+"mdns_8h.html":[15,0,0,3,1,0,6],
+"mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1":[15,0,0,3,1,0,6,12],
+"mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83":[15,0,0,3,1,0,6,3],
+"mdns_8h.html#a6d658e2c5228b224b89488663d2b72f7":[15,0,0,3,1,0,6,2],
+"mdns__domain_8c.html":[15,0,0,1,3,1],
+"mdns__domain_8c.html#a0aff096695eebacb2668d2762722860c":[15,0,0,1,3,1,10],
+"mdns__domain_8c.html#a17db69fa887515374452b945e959bbf9":[15,0,0,1,3,1,8],
+"mdns__domain_8c.html#a191d9b70a66083f40aaa022c2ed88b12":[15,0,0,1,3,1,1],
+"mdns__domain_8c.html#a29ddb0a6ba0edcf34104ec1f6322968b":[15,0,0,1,3,1,5],
+"mdns__domain_8c.html#a52d8f70432ae998814f16b18431213cd":[15,0,0,1,3,1,11],
+"mdns__domain_8c.html#a642449cbf0074f1a2504e72158e75859":[15,0,0,1,3,1,7],
+"mdns__domain_8c.html#a7221cb1a83ed6dcfb3a2b1365154b43d":[15,0,0,1,3,1,2],
+"mdns__domain_8c.html#a7485d75976b73354668a5a54bc8658ed":[15,0,0,1,3,1,0],
+"mdns__domain_8c.html#a92de54d2f384a4e4ffa85e529cc05411":[15,0,0,1,3,1,13],
+"mdns__domain_8c.html#a9cde39039e0e1e21b4851d840d733926":[15,0,0,1,3,1,4],
+"mdns__domain_8c.html#ab5f49d9356a76879e0e6a14eb0643b23":[15,0,0,1,3,1,12],
+"mdns__domain_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e":[15,0,0,1,3,1,6],
+"mdns__domain_8c.html#ac2d8951e2435f93fdc889f6a71e0c8a6":[15,0,0,1,3,1,3],
+"mdns__domain_8c.html#af228d1cf8d779c714a016702db095db6":[15,0,0,1,3,1,9],
+"mdns__domain_8h.html":[15,0,0,3,1,0,7],
+"mdns__domain_8h.html#a0aff096695eebacb2668d2762722860c":[15,0,0,3,1,0,7,10],
+"mdns__domain_8h.html#a17db69fa887515374452b945e959bbf9":[15,0,0,3,1,0,7,8],
+"mdns__domain_8h.html#a191d9b70a66083f40aaa022c2ed88b12":[15,0,0,3,1,0,7,1],
+"mdns__domain_8h.html#a29ddb0a6ba0edcf34104ec1f6322968b":[15,0,0,3,1,0,7,5],
+"mdns__domain_8h.html#a52d8f70432ae998814f16b18431213cd":[15,0,0,3,1,0,7,11],
+"mdns__domain_8h.html#a642449cbf0074f1a2504e72158e75859":[15,0,0,3,1,0,7,7],
+"mdns__domain_8h.html#a7221cb1a83ed6dcfb3a2b1365154b43d":[15,0,0,3,1,0,7,2],
+"mdns__domain_8h.html#a7485d75976b73354668a5a54bc8658ed":[15,0,0,3,1,0,7,0],
+"mdns__domain_8h.html#a92de54d2f384a4e4ffa85e529cc05411":[15,0,0,3,1,0,7,13],
+"mdns__domain_8h.html#a9cde39039e0e1e21b4851d840d733926":[15,0,0,3,1,0,7,4],
+"mdns__domain_8h.html#ab5f49d9356a76879e0e6a14eb0643b23":[15,0,0,3,1,0,7,12],
+"mdns__domain_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e":[15,0,0,3,1,0,7,6],
+"mdns__domain_8h.html#ac2d8951e2435f93fdc889f6a71e0c8a6":[15,0,0,3,1,0,7,3],
+"mdns__domain_8h.html#af228d1cf8d779c714a016702db095db6":[15,0,0,3,1,0,7,9],
+"mdns__opts_8h.html":[15,0,0,3,1,0,8],
+"mdns__out_8c.html":[15,0,0,1,3,2],
+"mdns__out_8c.html#a10f6f22640ac837a233bf43334dfb02a":[15,0,0,1,3,2,16],
+"mdns__out_8c.html#a1f7dc9536f124263573518e6e8e1a162":[15,0,0,1,3,2,11],
+"mdns__out_8c.html#a2713348b1b314d5e880442f2c130e1dc":[15,0,0,1,3,2,13],
+"mdns__out_8c.html#a2b7a721b19fa33813133bc97f503c199":[15,0,0,1,3,2,12],
+"mdns__out_8c.html#a2dd35cb1e1fae888c05c2b7f8bd717cc":[15,0,0,1,3,2,15],
+"mdns__out_8c.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f":[15,0,0,1,3,2,2],
+"mdns__out_8c.html#a5a051eb81d6bd37365973d1215af23ba":[15,0,0,1,3,2,0],
+"mdns__out_8c.html#a5de741fd85c3675e3d2161727dd9a220":[15,0,0,1,3,2,4],
+"mdns__out_8c.html#a6195808be1840daa8a100b5954a30cfe":[15,0,0,1,3,2,14],
+"mdns__out_8c.html#a790ea0aba2d252f96c23748ea0c033a7":[15,0,0,1,3,2,6],
+"mdns__out_8c.html#a7b637b6f41976f35f7b48e7f2904829b":[15,0,0,1,3,2,5],
+"mdns__out_8c.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f":[15,0,0,1,3,2,7],
+"mdns__out_8c.html#acbf59dca94f241c1b58c7df1ec4b85e1":[15,0,0,1,3,2,8],
+"mdns__out_8c.html#add64c83f753842f2ceb40079217c66a1":[15,0,0,1,3,2,1],
+"mdns__out_8c.html#ae4a0ae6a039210f60f666999f9b807f7":[15,0,0,1,3,2,3],
+"mdns__out_8c.html#ae8c9d2bd89d6ca7e8668ba708925d2e8":[15,0,0,1,3,2,10],
+"mdns__out_8c.html#af3e118eb80760a958265f6a4c59b2e49":[15,0,0,1,3,2,9],
+"mdns__out_8h.html":[15,0,0,3,1,0,9],
+"mdns__out_8h.html#a10f6f22640ac837a233bf43334dfb02a":[15,0,0,3,1,0,9,17],
+"mdns__out_8h.html#a1f7dc9536f124263573518e6e8e1a162":[15,0,0,3,1,0,9,12],
+"mdns__out_8h.html#a2713348b1b314d5e880442f2c130e1dc":[15,0,0,3,1,0,9,14],
+"mdns__out_8h.html#a2b7a721b19fa33813133bc97f503c199":[15,0,0,3,1,0,9,13],
+"mdns__out_8h.html#a2dd35cb1e1fae888c05c2b7f8bd717cc":[15,0,0,3,1,0,9,16],
+"mdns__out_8h.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f":[15,0,0,3,1,0,9,3],
+"mdns__out_8h.html#a5a051eb81d6bd37365973d1215af23ba":[15,0,0,3,1,0,9,1],
+"mdns__out_8h.html#a5de741fd85c3675e3d2161727dd9a220":[15,0,0,3,1,0,9,5],
+"mdns__out_8h.html#a6195808be1840daa8a100b5954a30cfe":[15,0,0,3,1,0,9,15],
+"mdns__out_8h.html#a790ea0aba2d252f96c23748ea0c033a7":[15,0,0,3,1,0,9,7],
+"mdns__out_8h.html#a7b637b6f41976f35f7b48e7f2904829b":[15,0,0,3,1,0,9,6],
+"mdns__out_8h.html#ab3297d69b0effb5eb01a9b8c5a708ea9":[15,0,0,3,1,0,9,0],
+"mdns__out_8h.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f":[15,0,0,3,1,0,9,8],
+"mdns__out_8h.html#acbf59dca94f241c1b58c7df1ec4b85e1":[15,0,0,3,1,0,9,9],
+"mdns__out_8h.html#add64c83f753842f2ceb40079217c66a1":[15,0,0,3,1,0,9,2],
+"mdns__out_8h.html#ae4a0ae6a039210f60f666999f9b807f7":[15,0,0,3,1,0,9,4],
+"mdns__out_8h.html#ae8c9d2bd89d6ca7e8668ba708925d2e8":[15,0,0,3,1,0,9,11],
+"mdns__out_8h.html#af3e118eb80760a958265f6a4c59b2e49":[15,0,0,3,1,0,9,10],
+"mdns__priv_8h.html":[15,0,0,3,1,0,10],
+"mdns__priv_8h.html#aa31b798a5fb96b6ef0dde5d4f32371af":[15,0,0,3,1,0,10,6],
+"mdns__priv_8h.html#af15fa5b6331bec605f68f53cb87f58fa":[15,0,0,3,1,0,10,7],
+"mem_8c.html":[15,0,0,2,10],
+"mem_8c.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7":[15,0,0,2,10,2],
+"mem_8c.html#a278694c2333c9826f21ddd2c2d220f66":[15,0,0,2,10,1],
+"mem_8c.html#a44a136e3b70c36abb6f8dc060c778113":[15,0,0,2,10,4],
+"mem_8c.html#a65169147c44e9db60d997819af9b455c":[15,0,0,2,10,3],
+"mem_8c.html#ab0915b39bd096766771ef4cf719bfb40":[15,0,0,2,10,6],
+"mem_8c.html#ae2190f95ae9c46bb99ec0be4f4e4e5e4":[15,0,0,2,10,5],
+"mem_8c.html#aeb811c25ce74d9ff398ccbb29874bba9":[15,0,0,2,10,7],
+"mem_8h.html":[15,0,0,3,1,35],
+"mem_8h.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7":[15,0,0,3,1,35,0],
+"mem_8h.html#a2ba2d1e6fc284b1850eedb673eba96b0":[15,0,0,3,1,35,4],
+"mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a":[15,0,0,3,1,35,1],
+"mem_8h.html#a44a136e3b70c36abb6f8dc060c778113":[15,0,0,3,1,35,2],
+"mem_8h.html#a52ce222aebe4b7dce7f25cd536b6e650":[15,0,0,3,1,35,3],
+"mem__priv_8h.html":[15,0,0,3,1,1,2],
+"mem_err.html":[6],
+"memp_8c.html":[15,0,0,2,11],
+"memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5":[15,0,0,2,11,1],
+"memp_8c.html#a6416303426d05526bed33f241fa6ecd7":[15,0,0,2,11,3],
+"memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2":[15,0,0,2,11,2]
 };
diff --git a/doc/doxygen/output/html/navtreeindex8.js b/doc/doxygen/output/html/navtreeindex8.js
index c21217b..b33dc46 100644
--- a/doc/doxygen/output/html/navtreeindex8.js
+++ b/doc/doxygen/output/html/navtreeindex8.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX8 =
 {
-"pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f":[14,0,0,3,1,43,4],
-"pbuf_8h.html#a49ab2c0662378f268ed8209bd54aaedf":[14,0,0,3,1,43,18],
-"pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f":[14,0,0,3,1,43,5],
-"pbuf_8h.html#a5df7ac5ae59012fe9aeddba375a72190":[14,0,0,3,1,43,29],
-"pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9":[14,0,0,3,1,43,3],
-"pbuf_8h.html#a6772c16662bbb78597399add086500c0":[14,0,0,3,1,43,7],
-"pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce":[14,0,0,3,1,43,19],
-"pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca":[14,0,0,3,1,43,14],
-"pbuf_8h.html#a9ba3f7b705309ceadb147692fd5a1c7d":[14,0,0,3,1,43,49],
-"pbuf_8h.html#aa1f62ba9dc5d462e67e33c4be64c601a":[14,0,0,3,1,43,16],
-"pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00":[14,0,0,3,1,43,40],
-"pbuf_8h.html#aad686ef346759a221abdb45f64649816":[14,0,0,3,1,43,15],
-"pbuf_8h.html#ab0a834127db093fcb6ffc48d966de318":[14,0,0,3,1,43,37],
-"pbuf_8h.html#ab65da7cd8f7449b3b2e57d7fa1a74ef4":[14,0,0,3,1,43,47],
-"pbuf_8h.html#ab8ad153151a8c157335d9c0cedc007e6":[14,0,0,3,1,43,9],
-"pbuf_8h.html#ac0d56cde47aca24ef410d730d7c89887":[14,0,0,3,1,43,8],
-"pbuf_8h.html#ac54b0f161128a32c7419c33b893a5106":[14,0,0,3,1,43,13],
-"pbuf_8h.html#ace8aac12c3ebe16262c2202bd5eb02ab":[14,0,0,3,1,43,35],
-"pbuf_8h.html#ad4ef8c5fbbd1447db04f8f73923e7dee":[14,0,0,3,1,43,23],
-"pbuf_8h.html#af78a7e1815dc0e31884d095b666d997f":[14,0,0,3,1,43,6],
-"pitfalls.html":[4],
-"pppapi_8c.html":[14,0,0,4,0,0],
-"pppol2tp_8c.html":[14,0,0,4,0,1],
-"pppol2tp_8h.html":[14,0,0,3,2,0,0],
-"pppos_8c.html":[14,0,0,4,0,2],
-"pppos_8h.html":[14,0,0,3,2,0,1],
-"prot_2autoip_8h.html":[14,0,0,3,1,2,0],
-"prot_2dhcp6_8h.html":[14,0,0,3,1,2,2],
-"prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175":[14,0,0,3,1,2,2,2],
-"prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36":[14,0,0,3,1,2,2,1],
-"prot_2dhcp_8h.html":[14,0,0,3,1,2,1],
-"prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06":[14,0,0,3,1,2,1,1],
-"prot_2dns_8h.html":[14,0,0,3,1,2,3],
-"prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276":[14,0,0,3,1,2,3,1],
-"prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317":[14,0,0,3,1,2,3,2],
-"prot_2icmp6_8h.html":[14,0,0,3,1,2,8],
-"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf":[14,0,0,3,1,2,8,2],
-"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532":[14,0,0,3,1,2,8,2,1],
-"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0":[14,0,0,3,1,2,8,2,4],
-"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c":[14,0,0,3,1,2,8,2,6],
-"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78":[14,0,0,3,1,2,8,2,0],
-"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a":[14,0,0,3,1,2,8,2,3],
-"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e":[14,0,0,3,1,2,8,2,2],
-"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763":[14,0,0,3,1,2,8,2,5],
-"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023":[14,0,0,3,1,2,8,3],
-"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9":[14,0,0,3,1,2,8,3,0],
-"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932":[14,0,0,3,1,2,8,3,2],
-"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8":[14,0,0,3,1,2,8,3,1],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858":[14,0,0,3,1,2,8,5],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7":[14,0,0,3,1,2,8,5,11],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe":[14,0,0,3,1,2,8,5,14],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207":[14,0,0,3,1,2,8,5,16],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d":[14,0,0,3,1,2,8,5,1],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3":[14,0,0,3,1,2,8,5,15],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0":[14,0,0,3,1,2,8,5,17],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d":[14,0,0,3,1,2,8,5,22],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4":[14,0,0,3,1,2,8,5,18],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26":[14,0,0,3,1,2,8,5,3],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780":[14,0,0,3,1,2,8,5,12],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0":[14,0,0,3,1,2,8,5,10],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6":[14,0,0,3,1,2,8,5,20],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7":[14,0,0,3,1,2,8,5,0],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f":[14,0,0,3,1,2,8,5,6],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a":[14,0,0,3,1,2,8,5,8],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4":[14,0,0,3,1,2,8,5,4],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375":[14,0,0,3,1,2,8,5,9],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951":[14,0,0,3,1,2,8,5,13],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3":[14,0,0,3,1,2,8,5,7],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b":[14,0,0,3,1,2,8,5,5],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5":[14,0,0,3,1,2,8,5,21],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe":[14,0,0,3,1,2,8,5,2],
-"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc":[14,0,0,3,1,2,8,5,19],
-"prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e":[14,0,0,3,1,2,8,4],
-"prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880":[14,0,0,3,1,2,8,4,0],
-"prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f":[14,0,0,3,1,2,8,4,1],
-"prot_2icmp_8h.html":[14,0,0,3,1,2,7],
-"prot_2igmp_8h.html":[14,0,0,3,1,2,10],
-"prot_2ip4_8h.html":[14,0,0,3,1,2,12],
-"prot_2ip6_8h.html":[14,0,0,3,1,2,13],
-"prot_2ip_8h.html":[14,0,0,3,1,2,11],
-"prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374":[14,0,0,3,1,2,11,0],
-"prot_2mld6_8h.html":[14,0,0,3,1,2,14],
-"prot_2nd6_8h.html":[14,0,0,3,1,2,15],
-"prot_2nd6_8h.html#a0225d4c8911efdbdbc2b40de208906c2":[14,0,0,3,1,2,15,5],
-"prot_2nd6_8h.html#a3188b9704a8ca598f54b87c3db73272e":[14,0,0,3,1,2,15,6],
-"prot_2nd6_8h.html#a68ce8550a20cd30093d6e79e1ca51842":[14,0,0,3,1,2,15,9],
-"prot_2nd6_8h.html#a7fb1b330719d83b7525374f4beca51bc":[14,0,0,3,1,2,15,10],
-"prot_2nd6_8h.html#aab6c15c9bea51fbdcc660f718bb403a8":[14,0,0,3,1,2,15,4],
-"prot_2nd6_8h.html#aeaa575c1a66ccaa2dc62ff2c0bd71619":[14,0,0,3,1,2,15,7],
-"prot_2nd6_8h.html#aff2e03766ee1fa15263c4aeda5097d28":[14,0,0,3,1,2,15,8],
-"prot_2tcp_8h.html":[14,0,0,3,1,2,16],
-"prot_2udp_8h.html":[14,0,0,3,1,2,17],
-"raw_8c.html":[14,0,0,2,14],
-"raw_8c.html#a03c4582d9ecf687e1f31d597c7889553":[14,0,0,2,14,4],
-"raw_8c.html#a61dc42f18e34800643000e48be6543ab":[14,0,0,2,14,5],
-"raw_8h.html":[14,0,0,3,1,44],
-"raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd":[14,0,0,3,1,44,1],
-"raw__priv_8h.html":[14,0,0,3,1,1,6],
-"raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553":[14,0,0,3,1,1,6,2],
-"raw__priv_8h.html#a2580ec946c4196127888d5405257866b":[14,0,0,3,1,1,6,1],
-"raw__priv_8h.html#a50dd44a4fb984a1975e15dd073d34e8d":[14,0,0,3,1,1,6,0],
-"raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab":[14,0,0,3,1,1,6,3],
-"slipif_8c.html":[14,0,0,4,7],
-"slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc":[14,0,0,4,7,1],
-"slipif_8c.html#accf448f9dabb0f33ef46b40355691cab":[14,0,0,4,7,0],
-"slipif_8h.html":[14,0,0,3,2,9],
-"slipif_8h.html#a198967c11f79cffc32192710294e8826":[14,0,0,3,2,9,1],
-"slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668":[14,0,0,3,2,9,0],
-"smtp_8c.html":[14,0,0,1,6,0],
-"smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae":[14,0,0,1,6,0,5],
-"smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e":[14,0,0,1,6,0,1],
-"smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6":[14,0,0,1,6,0,2],
-"smtp_8c.html#a73855e673457f748b6bcba49aab9b035":[14,0,0,1,6,0,4],
-"smtp_8c.html#ad853ab316a3b866b87c0454053febfe3":[14,0,0,1,6,0,3],
-"snmp_8h.html":[14,0,0,3,1,45],
-"snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c":[14,0,0,3,1,45,0],
-"snmp__asn1_8c.html":[14,0,0,1,7,0],
-"snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6":[14,0,0,1,7,0,9],
-"snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d":[14,0,0,1,7,0,6],
-"snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6":[14,0,0,1,7,0,10],
-"snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e":[14,0,0,1,7,0,2],
-"snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb":[14,0,0,1,7,0,3],
-"snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4":[14,0,0,1,7,0,13],
-"snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496":[14,0,0,1,7,0,4],
-"snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908":[14,0,0,1,7,0,1],
-"snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f":[14,0,0,1,7,0,11],
-"snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2":[14,0,0,1,7,0,12],
-"snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218":[14,0,0,1,7,0,7],
-"snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f":[14,0,0,1,7,0,8],
-"snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51":[14,0,0,1,7,0,5],
-"snmp__asn1_8c.html#af8e905a214936995d235789f359cf015":[14,0,0,1,7,0,0],
-"snmp__asn1_8h.html":[14,0,0,1,7,1],
-"snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6":[14,0,0,1,7,1,9],
-"snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d":[14,0,0,1,7,1,6],
-"snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6":[14,0,0,1,7,1,10],
-"snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e":[14,0,0,1,7,1,2],
-"snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb":[14,0,0,1,7,1,3],
-"snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4":[14,0,0,1,7,1,13],
-"snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496":[14,0,0,1,7,1,4],
-"snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908":[14,0,0,1,7,1,1],
-"snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f":[14,0,0,1,7,1,11],
-"snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2":[14,0,0,1,7,1,12],
-"snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218":[14,0,0,1,7,1,7],
-"snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f":[14,0,0,1,7,1,8],
-"snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51":[14,0,0,1,7,1,5],
-"snmp__asn1_8h.html#af8e905a214936995d235789f359cf015":[14,0,0,1,7,1,0],
-"snmp__core_8c.html":[14,0,0,1,7,2],
-"snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77":[14,0,0,1,7,2,20],
-"snmp__core_8c.html#a18126b2b13f267306c27e851e9379983":[14,0,0,1,7,2,9],
-"snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507":[14,0,0,1,7,2,22],
-"snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39":[14,0,0,1,7,2,18],
-"snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6":[14,0,0,1,7,2,13],
-"snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1":[14,0,0,1,7,2,4],
-"snmp__core_8c.html#a5275903be5948b1c28bfadb365823504":[14,0,0,1,7,2,17],
-"snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27":[14,0,0,1,7,2,6],
-"snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93":[14,0,0,1,7,2,12],
-"snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84":[14,0,0,1,7,2,19],
-"snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904":[14,0,0,1,7,2,14],
-"snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213":[14,0,0,1,7,2,10],
-"snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de":[14,0,0,1,7,2,0],
-"snmp__core_8c.html#a8ba7d922d9eaac8cd024aed1413901f6":[14,0,0,1,7,2,8],
-"snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e":[14,0,0,1,7,2,7],
-"snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a":[14,0,0,1,7,2,11],
-"snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09":[14,0,0,1,7,2,21],
-"snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e":[14,0,0,1,7,2,16],
-"snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc":[14,0,0,1,7,2,1],
-"snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03":[14,0,0,1,7,2,2],
-"snmp__core_8c.html#af041ab415e8063097c79be2b892174f8":[14,0,0,1,7,2,15],
-"snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9":[14,0,0,1,7,2,5],
-"snmp__core_8h.html":[14,0,0,3,1,0,15],
-"snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77":[14,0,0,3,1,0,15,30],
-"snmp__core_8h.html#a18126b2b13f267306c27e851e9379983":[14,0,0,3,1,0,15,19],
-"snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507":[14,0,0,3,1,0,15,32],
-"snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39":[14,0,0,3,1,0,15,28],
-"snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6":[14,0,0,3,1,0,15,23],
-"snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1":[14,0,0,3,1,0,15,15],
-"snmp__core_8h.html#a5275903be5948b1c28bfadb365823504":[14,0,0,3,1,0,15,27],
-"snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27":[14,0,0,3,1,0,15,17],
-"snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93":[14,0,0,3,1,0,15,22],
-"snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84":[14,0,0,3,1,0,15,29],
-"snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904":[14,0,0,3,1,0,15,24],
-"snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213":[14,0,0,3,1,0,15,20],
-"snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de":[14,0,0,3,1,0,15,12],
-"snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e":[14,0,0,3,1,0,15,18],
-"snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a":[14,0,0,3,1,0,15,21],
-"snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72":[14,0,0,3,1,0,15,9],
-"snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09":[14,0,0,3,1,0,15,31],
-"snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589":[14,0,0,3,1,0,15,11],
-"snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e":[14,0,0,3,1,0,15,26],
-"snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc":[14,0,0,3,1,0,15,13],
-"snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760":[14,0,0,3,1,0,15,10],
-"snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03":[14,0,0,3,1,0,15,14],
-"snmp__core_8h.html#af041ab415e8063097c79be2b892174f8":[14,0,0,3,1,0,15,25],
-"snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9":[14,0,0,3,1,0,15,16],
-"snmp__mib2_8c.html":[14,0,0,1,7,3],
-"snmp__mib2_8h.html":[14,0,0,3,1,0,16],
-"snmp__mib2__icmp_8c.html":[14,0,0,1,7,4],
-"snmp__mib2__interfaces_8c.html":[14,0,0,1,7,5],
-"snmp__mib2__ip_8c.html":[14,0,0,1,7,6],
-"snmp__mib2__snmp_8c.html":[14,0,0,1,7,7],
-"snmp__mib2__system_8c.html":[14,0,0,1,7,8],
-"snmp__mib2__tcp_8c.html":[14,0,0,1,7,9],
-"snmp__mib2__udp_8c.html":[14,0,0,1,7,10],
-"snmp__msg_8c.html":[14,0,0,1,7,11],
-"snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04":[14,0,0,1,7,11,10],
-"snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b":[14,0,0,1,7,11,9],
-"snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5":[14,0,0,1,7,11,7],
-"snmp__msg_8c.html#ac6f810ab812c44c6ca1df1fdf926a9f6":[14,0,0,1,7,11,8],
-"snmp__msg_8h.html":[14,0,0,1,7,12],
-"snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04":[14,0,0,1,7,12,3],
-"snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5":[14,0,0,1,7,12,1],
-"snmp__msg_8h.html#ac6f810ab812c44c6ca1df1fdf926a9f6":[14,0,0,1,7,12,2],
-"snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a":[14,0,0,1,7,12,4],
-"snmp__netconn_8c.html":[14,0,0,1,7,13],
-"snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5":[14,0,0,1,7,13,0],
-"snmp__opts_8h.html":[14,0,0,3,1,0,17],
-"snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b":[14,0,0,3,1,0,17,1],
-"snmp__pbuf__stream_8c.html":[14,0,0,1,7,14],
-"snmp__pbuf__stream_8h.html":[14,0,0,1,7,15],
-"snmp__raw_8c.html":[14,0,0,1,7,16],
-"snmp__scalar_8c.html":[14,0,0,1,7,17],
-"snmp__scalar_8h.html":[14,0,0,3,1,0,18],
-"snmp__table_8c.html":[14,0,0,1,7,18],
-"snmp__table_8h.html":[14,0,0,3,1,0,19],
-"snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5":[14,0,0,3,1,0,19,3],
-"snmp__threadsync_8c.html":[14,0,0,1,7,19],
-"snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6":[14,0,0,1,7,19,0],
-"snmp__threadsync_8h.html":[14,0,0,3,1,0,20],
-"snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2":[14,0,0,3,1,0,20,3],
-"snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6":[14,0,0,3,1,0,20,4],
-"snmp__traps_8c.html":[14,0,0,1,7,20],
-"snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b":[14,0,0,1,7,20,9],
-"snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a":[14,0,0,1,7,20,10],
-"snmpv3_8c.html":[14,0,0,1,7,21],
-"snmpv3_8h.html":[14,0,0,3,1,0,21],
-"snmpv3__mbedtls_8c.html":[14,0,0,1,7,22],
-"snmpv3__priv_8h.html":[14,0,0,1,7,23],
-"sntp_8c.html":[14,0,0,1,8,0],
-"sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f":[14,0,0,1,8,0,4],
-"sntp_8h.html":[14,0,0,3,1,0,22],
-"sntp__opts_8h.html":[14,0,0,3,1,0,23],
-"socket_8h.html":[14,0,0,3,0,0,2,0],
-"sockets_8c.html":[14,0,0,0,7],
-"sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0":[14,0,0,0,7,6],
-"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9":[14,0,0,0,7,1],
-"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1":[14,0,0,0,7,1,2],
-"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7":[14,0,0,0,7,1,0],
-"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d":[14,0,0,0,7,1,1],
-"sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7":[14,0,0,0,7,5],
-"sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b":[14,0,0,0,7,3]
+"memp_8c.html#ab6bfb9562c3a77e329a888e59ef0ace3":[15,0,0,2,11,5],
+"memp_8c.html#ac49689457203bfb872adf5428f96a3e7":[15,0,0,2,11,4],
+"memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f":[15,0,0,2,11,0],
+"memp_8h.html":[15,0,0,3,1,36],
+"memp_8h.html#a85a164b1f7764951cc685ea525114e57":[15,0,0,3,1,36,5],
+"memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2":[15,0,0,3,1,36,7],
+"memp_8h.html#ac49689457203bfb872adf5428f96a3e7":[15,0,0,3,1,36,8],
+"memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f":[15,0,0,3,1,36,6],
+"memp__priv_8h.html":[15,0,0,3,1,1,3],
+"memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5":[15,0,0,3,1,1,3,1],
+"memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7":[15,0,0,3,1,1,3,2],
+"memp__priv_8h.html#ab6bfb9562c3a77e329a888e59ef0ace3":[15,0,0,3,1,1,3,3],
+"memp__std_8h.html":[15,0,0,3,1,1,4],
+"mld6_8c.html":[15,0,0,2,1,7],
+"mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686":[15,0,0,2,1,7,6],
+"mld6_8c.html#a496197eef3f8b4c2a0fd49734aee07d6":[15,0,0,2,1,7,5],
+"mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274":[15,0,0,2,1,7,8],
+"mld6_8c.html#a7c190ca25432d466b28f607c3574a841":[15,0,0,2,1,7,0],
+"mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198":[15,0,0,2,1,7,7],
+"mld6_8h.html":[15,0,0,3,1,37],
+"mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686":[15,0,0,3,1,37,8],
+"mld6_8h.html#a496197eef3f8b4c2a0fd49734aee07d6":[15,0,0,3,1,37,7],
+"mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274":[15,0,0,3,1,37,10],
+"mld6_8h.html#a7c190ca25432d466b28f607c3574a841":[15,0,0,3,1,37,2],
+"mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198":[15,0,0,3,1,37,9],
+"mqtt_8c.html":[15,0,0,1,4,0],
+"mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b":[15,0,0,1,4,0,0],
+"mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12":[15,0,0,1,4,0,4],
+"mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d":[15,0,0,1,4,0,1],
+"mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1":[15,0,0,1,4,0,5],
+"mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3":[15,0,0,1,4,0,3],
+"mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa":[15,0,0,1,4,0,2],
+"mqtt_8h.html":[15,0,0,3,1,0,11],
+"mqtt__opts_8h.html":[15,0,0,3,1,0,12],
+"mqtt__priv_8h.html":[15,0,0,3,1,0,13],
+"multithreading.html":[10],
+"nd6_8c.html":[15,0,0,2,1,8],
+"nd6_8c.html#a27224542b8ffab81c2ed9f47752bb51e":[15,0,0,2,1,8,0],
+"nd6_8c.html#a4959990cae26a3996f638ec996f046df":[15,0,0,2,1,8,7],
+"nd6_8c.html#a64d7956cf2b0d45025b02661f3f62377":[15,0,0,2,1,8,2],
+"nd6_8c.html#a73d3192204da20be193e3c00c4a0cb54":[15,0,0,2,1,8,8],
+"nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe":[15,0,0,2,1,8,9],
+"nd6_8c.html#a84f9f52cab7ae37b4dd343536156dc73":[15,0,0,2,1,8,1],
+"nd6_8c.html#abbb92837e715be0e7d99513a84995831":[15,0,0,2,1,8,6],
+"nd6_8c.html#ae447c204ebbf71e6ebbc5ed727a73eb9":[15,0,0,2,1,8,5],
+"nd6_8c.html#af226438f4f9b4aa7c3a2bbdf3c1e948c":[15,0,0,2,1,8,4],
+"nd6_8c.html#af4a71e18bb01efb89f9181676784efa7":[15,0,0,2,1,8,3],
+"nd6_8h.html":[15,0,0,3,1,38],
+"nd6_8h.html#a27224542b8ffab81c2ed9f47752bb51e":[15,0,0,3,1,38,2],
+"nd6_8h.html#a2fec65c0785551bad3a282ddee4062ac":[15,0,0,3,1,38,0],
+"nd6_8h.html#a3250c1e32713635d588cf25865ebed56":[15,0,0,3,1,38,1],
+"nd6_8h.html#a4959990cae26a3996f638ec996f046df":[15,0,0,3,1,38,9],
+"nd6_8h.html#a64d7956cf2b0d45025b02661f3f62377":[15,0,0,3,1,38,4],
+"nd6_8h.html#a73d3192204da20be193e3c00c4a0cb54":[15,0,0,3,1,38,10],
+"nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe":[15,0,0,3,1,38,11],
+"nd6_8h.html#a84f9f52cab7ae37b4dd343536156dc73":[15,0,0,3,1,38,3],
+"nd6_8h.html#abbb92837e715be0e7d99513a84995831":[15,0,0,3,1,38,8],
+"nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9":[15,0,0,3,1,38,7],
+"nd6_8h.html#af226438f4f9b4aa7c3a2bbdf3c1e948c":[15,0,0,3,1,38,6],
+"nd6_8h.html#af4a71e18bb01efb89f9181676784efa7":[15,0,0,3,1,38,5],
+"nd6__priv_8h.html":[15,0,0,3,1,1,5],
+"netbiosns_8c.html":[15,0,0,1,5,0],
+"netbiosns_8c.html#a35d43ea3290f6412e45598b610f03cf1":[15,0,0,1,5,0,8],
+"netbiosns_8c.html#a4b83658c5bbb9ac90aca4351086a9a00":[15,0,0,1,5,0,7],
+"netbiosns_8c.html#ae00d45caef5a670e3aedde2788b3f212":[15,0,0,1,5,0,6],
+"netbiosns_8c.html#af09685abf1739c802bc8772b35b7fb1c":[15,0,0,1,5,0,5],
+"netbiosns_8h.html":[15,0,0,3,1,0,14],
+"netbiosns__opts_8h.html":[15,0,0,3,1,0,15],
+"netbuf_8c.html":[15,0,0,0,4],
+"netbuf_8h.html":[15,0,0,3,1,39],
+"netbuf_8h.html#ab38abb4213df4c00b9b3ab844322a090":[15,0,0,3,1,39,2],
+"netbuf_8h.html#ab75db64a9e84eb67a382c30e382d417c":[15,0,0,3,1,39,1],
+"netdb_8c.html":[15,0,0,0,5],
+"netdb_8c.html#a2a1ce3f2040007303d36c0b682b5ac10":[15,0,0,0,5,6],
+"netdb_8c.html#a768ab8ead892d6454709680340cd070e":[15,0,0,0,5,1],
+"netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5":[15,0,0,0,5,2],
+"netdb_8c.html#abe6a6a103a2f6fa4e13098e455ac7bb3":[15,0,0,0,5,4],
+"netdb_8c.html#af356989c172a51187e22b557f22d4165":[15,0,0,0,5,3],
+"netdb_8c.html#afa229e90916f6c8d6308828f45351d2d":[15,0,0,0,5,5],
+"netif_2ethernet_8h.html":[15,0,0,3,2,3],
+"netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365":[15,0,0,3,2,3,0],
+"netif_8c.html":[15,0,0,2,12],
+"netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc":[15,0,0,2,12,8],
+"netif_8c.html#a0fbaed78253d21e1b54e65651da3e327":[15,0,0,2,12,16],
+"netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c":[15,0,0,2,12,32],
+"netif_8c.html#a3d0925cbce550ed461907aee816713ba":[15,0,0,2,12,31],
+"netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c":[15,0,0,2,12,11],
+"netif_8h.html":[15,0,0,3,1,41],
+"netif_8h.html#a046c4816e37c3c4b84b3634eeeea7029":[15,0,0,3,1,41,26],
+"netif_8h.html#a0a674553c18b429b53397372ea82fcaf":[15,0,0,3,1,41,25],
+"netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6":[15,0,0,3,1,41,11],
+"netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc":[15,0,0,3,1,41,53],
+"netif_8h.html#a0fbaed78253d21e1b54e65651da3e327":[15,0,0,3,1,41,61],
+"netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c":[15,0,0,3,1,41,77],
+"netif_8h.html#a22400d2202581b4a7273cded712adf49":[15,0,0,3,1,41,8],
+"netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5":[15,0,0,3,1,41,36],
+"netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a":[15,0,0,3,1,41,30],
+"netif_8h.html#a343a5b14136a51957d552527384674b3":[15,0,0,3,1,41,42],
+"netif_8h.html#a3d0925cbce550ed461907aee816713ba":[15,0,0,3,1,41,76],
+"netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436":[15,0,0,3,1,41,43],
+"netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a":[15,0,0,3,1,41,10],
+"netif_8h.html#a5ad7308195c0581680dd62fb148501cd":[15,0,0,3,1,41,13],
+"netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2":[15,0,0,3,1,41,16],
+"netif_8h.html#a716576f3485524d44ef0843839ef0564":[15,0,0,3,1,41,6],
+"netif_8h.html#a71cad3277efe29191eef3348f4bf21f7":[15,0,0,3,1,41,35],
+"netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c":[15,0,0,3,1,41,56],
+"netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8":[15,0,0,3,1,41,27],
+"netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067":[15,0,0,3,1,41,41],
+"netif_8h.html#a8fb4317a77ee2e3848be80db15618666":[15,0,0,3,1,41,12],
+"netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0":[15,0,0,3,1,41,44],
+"netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a4186fbaf94be956ea1a3b02cd1cccb1f":[15,0,0,3,1,41,44,1],
+"netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0a7ad3406353906deb4e64ebeed349e07e":[15,0,0,3,1,41,44,0],
+"netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e":[15,0,0,3,1,41,37],
+"netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed":[15,0,0,3,1,41,38],
+"netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41":[15,0,0,3,1,41,29],
+"netif_8h.html#ad747072771a887443ab33f90a12077d4":[15,0,0,3,1,41,9],
+"netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2":[15,0,0,3,1,41,14],
+"netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9":[15,0,0,3,1,41,15],
+"netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32":[15,0,0,3,1,41,7],
+"netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468":[15,0,0,3,1,41,39],
+"netifapi_8c.html":[15,0,0,0,6],
+"netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7":[15,0,0,0,6,3],
+"netifapi_8h.html":[15,0,0,3,1,42],
+"netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7":[15,0,0,3,1,42,17],
+"opt_8h.html":[15,0,0,3,1,43],
+"optimization.html":[11],
+"pages.html":[],
+"pbuf_8c.html":[15,0,0,2,13],
+"pbuf_8c.html#a0f81deff4a0e6e8e0ff161a7b9871449":[15,0,0,2,13,18],
+"pbuf_8c.html#a32dc14bd88dcafa25e627ab18e801815":[15,0,0,2,13,0],
+"pbuf_8c.html#a5df7ac5ae59012fe9aeddba375a72190":[15,0,0,2,13,7],
+"pbuf_8c.html#a9ba3f7b705309ceadb147692fd5a1c7d":[15,0,0,2,13,27],
+"pbuf_8c.html#ab0a834127db093fcb6ffc48d966de318":[15,0,0,2,13,15],
+"pbuf_8c.html#aca0cd8b3f08fbb5e35bc91a663083cc1":[15,0,0,2,13,25],
+"pbuf_8c.html#ace8aac12c3ebe16262c2202bd5eb02ab":[15,0,0,2,13,13],
+"pbuf_8c.html#ad0e64d6fbc423593461063da97da9ce6":[15,0,0,2,13,19],
+"pbuf_8c.html#ad4ef8c5fbbd1447db04f8f73923e7dee":[15,0,0,2,13,1],
+"pbuf_8h.html":[15,0,0,3,1,44],
+"pbuf_8h.html#a018a6499e357f8a1373321f802a82930":[15,0,0,3,1,44,10],
+"pbuf_8h.html#a02789ca67766def65000b58f7fe7d03b":[15,0,0,3,1,44,17],
+"pbuf_8h.html#a27480c41c34021d4417691d327163626":[15,0,0,3,1,44,41],
+"pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815":[15,0,0,3,1,44,22],
+"pbuf_8h.html#a36a915aa2f6a188baa2862881407971e":[15,0,0,3,1,44,11],
+"pbuf_8h.html#a426883d928f8f3e8fd066e616159d78f":[15,0,0,3,1,44,4],
+"pbuf_8h.html#a49ab2c0662378f268ed8209bd54aaedf":[15,0,0,3,1,44,18],
+"pbuf_8h.html#a567a0dfa01b0e5540f9416a200ed163f":[15,0,0,3,1,44,5],
+"pbuf_8h.html#a5df7ac5ae59012fe9aeddba375a72190":[15,0,0,3,1,44,29],
+"pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9":[15,0,0,3,1,44,3],
+"pbuf_8h.html#a6772c16662bbb78597399add086500c0":[15,0,0,3,1,44,7],
+"pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce":[15,0,0,3,1,44,19],
+"pbuf_8h.html#a97d4db8e0f127f61af0016c184c865ca":[15,0,0,3,1,44,14],
+"pbuf_8h.html#a9ba3f7b705309ceadb147692fd5a1c7d":[15,0,0,3,1,44,49],
+"pbuf_8h.html#aa1f62ba9dc5d462e67e33c4be64c601a":[15,0,0,3,1,44,16],
+"pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00":[15,0,0,3,1,44,40],
+"pbuf_8h.html#aad686ef346759a221abdb45f64649816":[15,0,0,3,1,44,15],
+"pbuf_8h.html#ab0a834127db093fcb6ffc48d966de318":[15,0,0,3,1,44,37],
+"pbuf_8h.html#ab65da7cd8f7449b3b2e57d7fa1a74ef4":[15,0,0,3,1,44,47],
+"pbuf_8h.html#ab8ad153151a8c157335d9c0cedc007e6":[15,0,0,3,1,44,9],
+"pbuf_8h.html#ac0d56cde47aca24ef410d730d7c89887":[15,0,0,3,1,44,8],
+"pbuf_8h.html#ac54b0f161128a32c7419c33b893a5106":[15,0,0,3,1,44,13],
+"pbuf_8h.html#ace8aac12c3ebe16262c2202bd5eb02ab":[15,0,0,3,1,44,35],
+"pbuf_8h.html#ad4ef8c5fbbd1447db04f8f73923e7dee":[15,0,0,3,1,44,23],
+"pbuf_8h.html#af78a7e1815dc0e31884d095b666d997f":[15,0,0,3,1,44,6],
+"pitfalls.html":[5],
+"pppapi_8c.html":[15,0,0,4,0,0],
+"pppol2tp_8c.html":[15,0,0,4,0,1],
+"pppol2tp_8h.html":[15,0,0,3,2,0,0],
+"pppos_8c.html":[15,0,0,4,0,2],
+"pppos_8h.html":[15,0,0,3,2,0,1],
+"prot_2acd_8h.html":[15,0,0,3,1,2,0],
+"prot_2autoip_8h.html":[15,0,0,3,1,2,1],
+"prot_2dhcp6_8h.html":[15,0,0,3,1,2,3],
+"prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175":[15,0,0,3,1,2,3,2],
+"prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36":[15,0,0,3,1,2,3,1],
+"prot_2dhcp_8h.html":[15,0,0,3,1,2,2],
+"prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06":[15,0,0,3,1,2,2,1],
+"prot_2dns_8h.html":[15,0,0,3,1,2,4],
+"prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276":[15,0,0,3,1,2,4,1],
+"prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317":[15,0,0,3,1,2,4,2],
+"prot_2icmp6_8h.html":[15,0,0,3,1,2,9],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccf":[15,0,0,3,1,2,9,2],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa251961b990d0fbaf2c643f047c4f2532":[15,0,0,3,1,2,9,2,1],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa28cc924ec6eaa761acb76ccef4adcba0":[15,0,0,3,1,2,9,2,4],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa2aeed278149fb071a34beec89df03b5c":[15,0,0,3,1,2,9,2,6],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa695bb4d92f32b504a9483ff137235a78":[15,0,0,3,1,2,9,2,0],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfa789ef8158d8750b0fa5a14ec9ecaa23a":[15,0,0,3,1,2,9,2,3],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfabdb01a67c61da588872f5799ef75aa6e":[15,0,0,3,1,2,9,2,2],
+"prot_2icmp6_8h.html#a11fe21b0a8c1bc73ee887a96bf416ccfac3c255282e0b49b5bbb3cd8f435bb763":[15,0,0,3,1,2,9,2,5],
+"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023":[15,0,0,3,1,2,9,3],
+"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a4aa4a79306a69fd4f60ad445cde4c2a9":[15,0,0,3,1,2,9,3,0],
+"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023a53884832d00d3c8f8de62cfdb4646932":[15,0,0,3,1,2,9,3,2],
+"prot_2icmp6_8h.html#a3a817e777ebcfd705e8e5a1b4c5ae023acbcc58901e2345ffc31df4098de60ff8":[15,0,0,3,1,2,9,3,1],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858":[15,0,0,3,1,2,9,5],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a04228a1d11f9f88bd165f3430188bfe7":[15,0,0,3,1,2,9,5,11],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0d8d8717c6c34053d1101932c23929fe":[15,0,0,3,1,2,9,5,14],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a0f6702d62de5f873e0afe7431d878207":[15,0,0,3,1,2,9,5,16],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1d52ef5024a5822bd622bcb0b9da323d":[15,0,0,3,1,2,9,5,1],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a1f99d333f425c28d3840e029cc9c46f3":[15,0,0,3,1,2,9,5,15],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a29281016d3bb58e3bfd90417bbce7aa0":[15,0,0,3,1,2,9,5,17],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a2c12d3244d837bd243ea647ec530600d":[15,0,0,3,1,2,9,5,22],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a425f4e64a7d1570228adbbe450650ab4":[15,0,0,3,1,2,9,5,18],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a63114feac8140031b74424d4a7cf6b26":[15,0,0,3,1,2,9,5,3],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a670d95494c9282f646ac442d81d9a780":[15,0,0,3,1,2,9,5,12],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a906dd689f0aa9b4796f49f299d4e3eb0":[15,0,0,3,1,2,9,5,10],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858a9c9c358ebd5eb683a66819fd9ecf98c6":[15,0,0,3,1,2,9,5,20],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aad9d4f207459e4bbd0c33a25adf6fdd7":[15,0,0,3,1,2,9,5,0],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858abe61415e020b996220337f0cd002a28f":[15,0,0,3,1,2,9,5,6],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac6b91695c06bfc7fb2360310d7b8e78a":[15,0,0,3,1,2,9,5,8],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ac7020c08a7b03ae2a198e4a8dcd31bd4":[15,0,0,3,1,2,9,5,4],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ad9794ae12b9ca196cc4fafaf6d834375":[15,0,0,3,1,2,9,5,9],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae4ae04be7df3a2cce614af0a5cdae951":[15,0,0,3,1,2,9,5,13],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858ae649aa45c97b885f28771688957528a3":[15,0,0,3,1,2,9,5,7],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858aed14d280e5911098af914a94bd3ab22b":[15,0,0,3,1,2,9,5,5],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858af8ebe97c4f68b54c9ef0c43e98211df5":[15,0,0,3,1,2,9,5,21],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afae9848904bc4b4b4aa716a7a9a2d7fe":[15,0,0,3,1,2,9,5,2],
+"prot_2icmp6_8h.html#a6e10428d8f6102013b30013065716858afb12a9d774f53deb15ec23041548f6fc":[15,0,0,3,1,2,9,5,19],
+"prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869e":[15,0,0,3,1,2,9,4],
+"prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eacccbb5e776df1b35af4149e593240880":[15,0,0,3,1,2,9,4,0],
+"prot_2icmp6_8h.html#ad06bbf4ee72635ece968db41cbe6869eaec493420d61c80a21981b1aa32befe1f":[15,0,0,3,1,2,9,4,1],
+"prot_2icmp_8h.html":[15,0,0,3,1,2,8],
+"prot_2igmp_8h.html":[15,0,0,3,1,2,11],
+"prot_2ip4_8h.html":[15,0,0,3,1,2,13],
+"prot_2ip6_8h.html":[15,0,0,3,1,2,14],
+"prot_2ip_8h.html":[15,0,0,3,1,2,12],
+"prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374":[15,0,0,3,1,2,12,0],
+"prot_2mld6_8h.html":[15,0,0,3,1,2,15],
+"prot_2nd6_8h.html":[15,0,0,3,1,2,16],
+"prot_2nd6_8h.html#a0225d4c8911efdbdbc2b40de208906c2":[15,0,0,3,1,2,16,5],
+"prot_2nd6_8h.html#a3188b9704a8ca598f54b87c3db73272e":[15,0,0,3,1,2,16,6],
+"prot_2nd6_8h.html#a68ce8550a20cd30093d6e79e1ca51842":[15,0,0,3,1,2,16,9],
+"prot_2nd6_8h.html#a7fb1b330719d83b7525374f4beca51bc":[15,0,0,3,1,2,16,10],
+"prot_2nd6_8h.html#aab6c15c9bea51fbdcc660f718bb403a8":[15,0,0,3,1,2,16,4],
+"prot_2nd6_8h.html#aeaa575c1a66ccaa2dc62ff2c0bd71619":[15,0,0,3,1,2,16,7],
+"prot_2nd6_8h.html#aff2e03766ee1fa15263c4aeda5097d28":[15,0,0,3,1,2,16,8],
+"prot_2tcp_8h.html":[15,0,0,3,1,2,17],
+"prot_2udp_8h.html":[15,0,0,3,1,2,18],
+"raw_8c.html":[15,0,0,2,14],
+"raw_8c.html#a03c4582d9ecf687e1f31d597c7889553":[15,0,0,2,14,4],
+"raw_8c.html#a61dc42f18e34800643000e48be6543ab":[15,0,0,2,14,5],
+"raw_8h.html":[15,0,0,3,1,45],
+"raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd":[15,0,0,3,1,45,1],
+"raw__priv_8h.html":[15,0,0,3,1,1,6],
+"raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553":[15,0,0,3,1,1,6,2],
+"raw__priv_8h.html#a2580ec946c4196127888d5405257866b":[15,0,0,3,1,1,6,1],
+"raw__priv_8h.html#a50dd44a4fb984a1975e15dd073d34e8d":[15,0,0,3,1,1,6,0],
+"raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab":[15,0,0,3,1,1,6,3],
+"slipif_8c.html":[15,0,0,4,7],
+"slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc":[15,0,0,4,7,1],
+"slipif_8c.html#accf448f9dabb0f33ef46b40355691cab":[15,0,0,4,7,0],
+"slipif_8h.html":[15,0,0,3,2,9]
 };
diff --git a/doc/doxygen/output/html/navtreeindex9.js b/doc/doxygen/output/html/navtreeindex9.js
index ffe3d1d..9b6e4da 100644
--- a/doc/doxygen/output/html/navtreeindex9.js
+++ b/doc/doxygen/output/html/navtreeindex9.js
@@ -1,253 +1,253 @@
 var NAVTREEINDEX9 =
 {
-"sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1":[14,0,0,0,7,4],
-"sockets_8c.html#ae84296093574ec746f8f88321356388f":[14,0,0,0,7,2],
-"sockets_8h.html":[14,0,0,3,1,46],
-"sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0":[14,0,0,3,1,46,5],
-"sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa":[14,0,0,3,1,46,0],
-"sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7":[14,0,0,3,1,46,4],
-"sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b":[14,0,0,3,1,46,2],
-"sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1":[14,0,0,3,1,46,3],
-"sockets_8h.html#ae84296093574ec746f8f88321356388f":[14,0,0,3,1,46,1],
-"sockets__priv_8h.html":[14,0,0,3,1,1,7],
-"sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196":[14,0,0,3,1,1,7,2],
-"stats_8c.html":[14,0,0,2,15],
-"stats_8c.html#a614735db0145db9ba944ede600d1d19b":[14,0,0,2,15,1],
-"stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d":[14,0,0,2,15,0],
-"stats_8h.html":[14,0,0,3,1,47],
-"stats_8h.html#a614735db0145db9ba944ede600d1d19b":[14,0,0,3,1,47,8],
-"stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d":[14,0,0,3,1,47,7],
-"struct__lwiperf__settings.html":[13,0,0],
-"struct__lwiperf__state__tcp.html":[13,0,1],
-"structapi__msg.html":[13,0,2],
-"structapi__msg.html#a01eaa41b1bbdc92e78ba3712d28cb613":[13,0,2,7],
-"structapi__msg.html#a1ceb9822ba49ba439e30d98492593612":[13,0,2,12],
-"structapi__msg.html#a40624c398d1939bfee54bffa708a363e":[13,0,2,6],
-"structapi__msg.html#a46007ce4f08d3e396f068ab80c9a9ae1":[13,0,2,8],
-"structapi__msg.html#a4bd9382dd42b18120803e246a0203353":[13,0,2,9],
-"structapi__msg.html#a50e8d6dfa0ba30ae7e39c336bf68742c":[13,0,2,10],
-"structapi__msg.html#a5aa22dbd74fd7ba2fa5eb8bc8aae529f":[13,0,2,11],
-"structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444":[13,0,2,14],
-"structapi__msg.html#a87ce87e5931c8f748293946d3b250791":[13,0,2,2],
-"structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f":[13,0,2,4],
-"structapi__msg.html#aa3d64205c25e953b168447e6aa21ee9e":[13,0,2,5],
-"structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05":[13,0,2,1],
-"structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2":[13,0,2,13],
-"structapi__msg.html#abec5e33802d69f1b601543d60699f028":[13,0,2,3],
-"structapi__msg.html#ac0637c6f4dbb3f64f95d5181d55e663c":[13,0,2,15],
-"structapi__msg.html#af9817721045b7ebe98ad484730e5e9cc":[13,0,2,0],
-"structautoip.html":[13,0,3],
-"structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7":[13,0,3,1],
-"structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55":[13,0,3,0],
-"structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853":[13,0,3,4],
-"structautoip.html#a51af55190548e378e310aeaddfa1fdef":[13,0,3,3],
-"structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf":[13,0,3,5],
-"structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25":[13,0,3,2],
-"structbridgeif__initdata__s.html":[12,3,0,2],
-"structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f":[12,3,0,2,3],
-"structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6":[12,3,0,2,2],
-"structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc":[12,3,0,2,0],
-"structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f":[12,3,0,2,1],
-"structdhcp6__msg.html":[13,0,5],
-"structdhcp__msg.html":[13,0,6],
-"structdns__answer.html":[13,0,7],
-"structdns__api__msg.html":[13,0,8],
-"structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2":[13,0,8,4],
-"structdns__api__msg.html#a217814594564077d21b0f2696280b2a8":[13,0,8,0],
-"structdns__api__msg.html#a6536d91adb146555461359bd451b30de":[13,0,8,2],
-"structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53":[13,0,8,3],
-"structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493":[13,0,8,1],
-"structdns__hdr.html":[13,0,9],
-"structdns__query.html":[13,0,10],
-"structdns__req__entry.html":[13,0,11],
-"structdns__table__entry.html":[13,0,12],
-"structeth__addr.html":[13,0,13],
-"structeth__hdr.html":[13,0,14],
-"structeth__vlan__hdr.html":[13,0,15],
-"structetharp__hdr.html":[13,0,16],
-"structetharp__q__entry.html":[13,0,17],
-"structgethostbyname__r__helper.html":[13,0,18],
-"structicmp6__echo__hdr.html":[13,0,19],
-"structicmp6__hdr.html":[13,0,20],
-"structicmp__echo__hdr.html":[13,0,21],
-"structieee__802154__hdr.html":[13,0,22],
-"structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10":[13,0,22,2],
-"structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869":[13,0,22,3],
-"structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33":[13,0,22,0],
-"structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937":[13,0,22,4],
-"structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2":[13,0,22,5],
-"structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd":[13,0,22,1],
-"structigmp__group.html":[13,0,23],
-"structigmp__group.html#a8e2227e486652603fcd7f88681d4c75b":[13,0,23,4],
-"structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874":[13,0,23,2],
-"structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78":[13,0,23,3],
-"structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852":[13,0,23,5],
-"structigmp__group.html#add0d24f719ad4b598abad254689ad911":[13,0,23,1],
-"structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854":[13,0,23,0],
-"structigmp__msg.html":[13,0,24],
-"structip4__addr.html":[13,0,25],
-"structip4__addr__packed.html":[13,0,26],
-"structip4__addr__wordaligned.html":[13,0,27],
-"structip6__addr.html":[13,0,28],
-"structip6__addr__packed.html":[13,0,29],
-"structip6__hdr.html":[13,0,30],
-"structip6__hdr.html#a9d225109d601ae8b34bab6ca3528fa94":[13,0,30,2],
-"structip6__hdr.html#abe3d612d4570864c922e18ed838292f6":[13,0,30,1],
-"structip6__hdr.html#ad3b638f503a3f7e7724cf4c7b2c0a0b5":[13,0,30,3],
-"structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef":[13,0,30,4],
-"structip6__hdr.html#af9cbfa5fa280a7a982a1c6268fa13a5a":[13,0,30,0],
-"structip6__reass__helper.html":[13,0,31],
-"structip6__reassdata.html":[13,0,32],
-"structip__addr.html":[12,1,0,2],
-"structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a":[12,1,0,2,0],
-"structip__globals.html":[13,0,34],
-"structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0":[13,0,34,5],
-"structip__globals.html#a0b4e54250c692c638408de54593d2aa1":[13,0,34,4],
-"structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a":[13,0,34,3],
-"structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4":[13,0,34,1],
-"structip__globals.html#a7803dc5950d143e4433a0df689989bab":[13,0,34,6],
-"structip__globals.html#a7da899c663b1d560b61d92ba6d544701":[13,0,34,0],
-"structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41":[13,0,34,2],
-"structip__reass__helper.html":[13,0,35],
-"structip__reassdata.html":[13,0,36],
-"structlowpan6__ieee802154__data.html":[13,0,37],
-"structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f":[13,0,37,0],
-"structlowpan6__ieee802154__data.html#a190c9c06dfe1075abb7399f99553b507":[13,0,37,1],
-"structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c":[13,0,37,3],
-"structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35":[13,0,37,2],
-"structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c":[13,0,37,4],
-"structlowpan6__link__addr.html":[13,0,38],
-"structlowpan6__reass__helper.html":[13,0,39],
-"structlwip__cyclic__timer.html":[13,0,40],
-"structlwip__select__cb.html":[13,0,41],
-"structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99":[13,0,41,7],
-"structlwip__select__cb.html#a21a98e316bb7001d8750b20f5a7d0aa7":[13,0,41,4],
-"structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed":[13,0,41,0],
-"structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba":[13,0,41,3],
-"structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e":[13,0,41,5],
-"structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a":[13,0,41,1],
-"structlwip__select__cb.html#aa89638b1c2c6b2c88030560861aba04c":[13,0,41,8],
-"structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482":[13,0,41,6],
-"structlwip__select__cb.html#ae39fc1bef3938380d15085e0141639de":[13,0,41,2],
-"structlwip__sock.html":[13,0,42],
-"structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4":[13,0,42,0],
-"structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8":[13,0,42,5],
-"structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e":[13,0,42,1],
-"structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1":[13,0,42,2],
-"structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38":[13,0,42,4],
-"structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a":[13,0,42,3],
-"structmdns__host.html":[13,0,43],
-"structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b":[13,0,43,0],
-"structmdns__host.html#a560447b364854eb5480e137e09d3cd24":[13,0,43,1],
-"structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed":[13,0,43,4],
-"structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922":[13,0,43,2],
-"structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61":[13,0,43,3],
-"structmdns__outpacket.html":[13,0,44],
-"structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c":[13,0,44,9],
-"structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035":[13,0,44,2],
-"structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4":[13,0,44,4],
-"structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d":[13,0,44,11],
-"structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9":[13,0,44,8],
-"structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5":[13,0,44,12],
-"structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195":[13,0,44,3],
-"structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad":[13,0,44,1],
-"structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348":[13,0,44,10],
-"structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce":[13,0,44,0],
-"structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430":[13,0,44,7],
-"structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f":[13,0,44,5],
-"structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65":[13,0,44,6],
-"structmdns__packet.html":[13,0,45],
-"structmdns__packet.html#a09211e78f7f773c492b5856d31423699":[13,0,45,5],
-"structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00":[13,0,45,9],
-"structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45":[13,0,45,4],
-"structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68":[13,0,45,3],
-"structmdns__packet.html#a56ba495a1458a21982e65d746468849d":[13,0,45,1],
-"structmdns__packet.html#a8659b4f582be0df84b6ae91308737377":[13,0,45,7],
-"structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7":[13,0,45,0],
-"structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a":[13,0,45,8],
-"structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989":[13,0,45,2],
-"structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437":[13,0,45,6],
-"structmdns__rr__info.html":[13,0,46],
-"structmdns__service.html":[13,0,47],
-"structmdns__service.html#a35daff90a18d19b14f23fa02df424f94":[13,0,47,6],
-"structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad":[13,0,47,4],
-"structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14":[13,0,47,0],
-"structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c":[13,0,47,5],
-"structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d":[13,0,47,3],
-"structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c":[13,0,47,2],
-"structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784":[13,0,47,1],
-"structmem.html":[13,0,48],
-"structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf":[13,0,48,0],
-"structmem.html#a9d7722ed10adf965fa98563d502f98ac":[13,0,48,1],
-"structmem.html#aa76b6a39425617435978dce903f0d456":[13,0,48,2],
-"structmemp__desc.html":[13,0,49],
-"structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500":[13,0,49,3],
-"structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3":[13,0,49,2],
-"structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7":[13,0,49,1],
-"structmemp__desc.html#a9aec58adcbcd88167247296ca4346558":[13,0,49,0],
-"structmemp__desc.html#a9d6b758ce5c3b47a67a7568d38fb3926":[13,0,49,4],
-"structmld__group.html":[13,0,50],
-"structmld__group.html#a21f31e845cb11d2aca4ae7120736f69a":[13,0,50,4],
-"structmld__group.html#a781abf78d835627ded1202166b44b88e":[13,0,50,0],
-"structmld__group.html#a9273a345a5754241bf26ddc835d27ddc":[13,0,50,3],
-"structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b":[13,0,50,2],
-"structmld__group.html#addc67094f83c9352fe039c392c480f9e":[13,0,50,5],
-"structmld__group.html#ae9cfd3f126257aa3aff4a24e05c04059":[13,0,50,1],
-"structmld__header.html":[13,0,51],
-"structmqtt__client__s.html":[13,0,52],
-"structmqtt__client__s.html#a1897eeefe64f9e2d2d953adca858f439":[13,0,52,7],
-"structmqtt__client__s.html#a26dc9112351c042594a41703197925a7":[13,0,52,3],
-"structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef":[13,0,52,2],
-"structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c":[13,0,52,6],
-"structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824":[13,0,52,4],
-"structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5":[13,0,52,5],
-"structmqtt__client__s.html#ab4100f6e0867c212d5923f10024f2e32":[13,0,52,8],
-"structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a":[13,0,52,1],
-"structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6":[13,0,52,0],
-"structmqtt__connect__client__info__t.html":[12,4,4,1],
-"structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9":[12,4,4,1,6],
-"structmqtt__connect__client__info__t.html#a32e77415460752ba0484eb3ba0faf0c8":[12,4,4,1,8],
-"structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4":[12,4,4,1,4],
-"structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3":[12,4,4,1,7],
-"structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b":[12,4,4,1,1],
-"structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7":[12,4,4,1,5],
-"structmqtt__connect__client__info__t.html#ac80262a7456812e9eefffd8c3b9ac21a":[12,4,4,1,3],
-"structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a":[12,4,4,1,0],
-"structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5":[12,4,4,1,2],
-"structmqtt__request__t.html":[13,0,54],
-"structmqtt__request__t.html#a32a4b14b0b8b5b8ce8db1074e53f4a79":[13,0,54,0],
-"structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073":[13,0,54,3],
-"structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b":[13,0,54,1],
-"structmqtt__request__t.html#af2dc3cd85cdad25b9b3e1534ecc0cb58":[13,0,54,2],
-"structmqtt__ringbuf__t.html":[13,0,55],
-"structna__header.html":[13,0,56],
-"structnd6__neighbor__cache__entry.html":[13,0,57],
-"structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df":[13,0,57,0],
-"structnd6__q__entry.html":[13,0,58],
-"structnetbios__answer.html":[13,0,59],
-"structnetbios__answer.html#a0069c9ae014881298828660787fa945e":[13,0,59,5],
-"structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea":[13,0,59,11],
-"structnetbios__answer.html#a151dce0f0bf626b2a54fbb75775237ba":[13,0,59,24],
-"structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408":[13,0,59,17],
-"structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4":[13,0,59,1],
-"structnetbios__answer.html#a31ec9ea28b5801b9bb5f1b240d3412de":[13,0,59,18],
-"structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e":[13,0,59,8],
-"structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2":[13,0,59,22],
-"structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d":[13,0,59,6],
-"structnetbios__answer.html#a58aba600ed34b7c689606c296ef57c8c":[13,0,59,3],
-"structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42":[13,0,59,14],
-"structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d":[13,0,59,15],
-"structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683":[13,0,59,2],
-"structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f":[13,0,59,21],
-"structnetbios__answer.html#a9cf85c173fe0d99c1c4e7e09aaeed9b8":[13,0,59,4],
-"structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b":[13,0,59,19],
-"structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd":[13,0,59,12],
-"structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321":[13,0,59,16],
-"structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8":[13,0,59,9],
-"structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2":[13,0,59,7],
-"structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c":[13,0,59,20],
-"structnetbios__answer.html#abf746cd54add594216ddc3683c741406":[13,0,59,0],
-"structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491":[13,0,59,13],
-"structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787":[13,0,59,23],
-"structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219":[13,0,59,10]
+"slipif_8h.html#a198967c11f79cffc32192710294e8826":[15,0,0,3,2,9,1],
+"slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668":[15,0,0,3,2,9,0],
+"smtp_8c.html":[15,0,0,1,6,0],
+"smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae":[15,0,0,1,6,0,5],
+"smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e":[15,0,0,1,6,0,1],
+"smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6":[15,0,0,1,6,0,2],
+"smtp_8c.html#a73855e673457f748b6bcba49aab9b035":[15,0,0,1,6,0,4],
+"smtp_8c.html#ad853ab316a3b866b87c0454053febfe3":[15,0,0,1,6,0,3],
+"snmp_8h.html":[15,0,0,3,1,46],
+"snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c":[15,0,0,3,1,46,0],
+"snmp__asn1_8c.html":[15,0,0,1,7,0],
+"snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6":[15,0,0,1,7,0,9],
+"snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d":[15,0,0,1,7,0,6],
+"snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6":[15,0,0,1,7,0,10],
+"snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e":[15,0,0,1,7,0,2],
+"snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb":[15,0,0,1,7,0,3],
+"snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4":[15,0,0,1,7,0,13],
+"snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496":[15,0,0,1,7,0,4],
+"snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908":[15,0,0,1,7,0,1],
+"snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f":[15,0,0,1,7,0,11],
+"snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2":[15,0,0,1,7,0,12],
+"snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218":[15,0,0,1,7,0,7],
+"snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f":[15,0,0,1,7,0,8],
+"snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51":[15,0,0,1,7,0,5],
+"snmp__asn1_8c.html#af8e905a214936995d235789f359cf015":[15,0,0,1,7,0,0],
+"snmp__asn1_8h.html":[15,0,0,1,7,1],
+"snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6":[15,0,0,1,7,1,9],
+"snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d":[15,0,0,1,7,1,6],
+"snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6":[15,0,0,1,7,1,10],
+"snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e":[15,0,0,1,7,1,2],
+"snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb":[15,0,0,1,7,1,3],
+"snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4":[15,0,0,1,7,1,13],
+"snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496":[15,0,0,1,7,1,4],
+"snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908":[15,0,0,1,7,1,1],
+"snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f":[15,0,0,1,7,1,11],
+"snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2":[15,0,0,1,7,1,12],
+"snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218":[15,0,0,1,7,1,7],
+"snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f":[15,0,0,1,7,1,8],
+"snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51":[15,0,0,1,7,1,5],
+"snmp__asn1_8h.html#af8e905a214936995d235789f359cf015":[15,0,0,1,7,1,0],
+"snmp__core_8c.html":[15,0,0,1,7,2],
+"snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77":[15,0,0,1,7,2,20],
+"snmp__core_8c.html#a18126b2b13f267306c27e851e9379983":[15,0,0,1,7,2,9],
+"snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507":[15,0,0,1,7,2,22],
+"snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39":[15,0,0,1,7,2,18],
+"snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6":[15,0,0,1,7,2,13],
+"snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1":[15,0,0,1,7,2,4],
+"snmp__core_8c.html#a5275903be5948b1c28bfadb365823504":[15,0,0,1,7,2,17],
+"snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27":[15,0,0,1,7,2,6],
+"snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93":[15,0,0,1,7,2,12],
+"snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84":[15,0,0,1,7,2,19],
+"snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904":[15,0,0,1,7,2,14],
+"snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213":[15,0,0,1,7,2,10],
+"snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de":[15,0,0,1,7,2,0],
+"snmp__core_8c.html#a8ba7d922d9eaac8cd024aed1413901f6":[15,0,0,1,7,2,8],
+"snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e":[15,0,0,1,7,2,7],
+"snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a":[15,0,0,1,7,2,11],
+"snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09":[15,0,0,1,7,2,21],
+"snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e":[15,0,0,1,7,2,16],
+"snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc":[15,0,0,1,7,2,1],
+"snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03":[15,0,0,1,7,2,2],
+"snmp__core_8c.html#af041ab415e8063097c79be2b892174f8":[15,0,0,1,7,2,15],
+"snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9":[15,0,0,1,7,2,5],
+"snmp__core_8h.html":[15,0,0,3,1,0,17],
+"snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77":[15,0,0,3,1,0,17,30],
+"snmp__core_8h.html#a18126b2b13f267306c27e851e9379983":[15,0,0,3,1,0,17,19],
+"snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507":[15,0,0,3,1,0,17,32],
+"snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39":[15,0,0,3,1,0,17,28],
+"snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6":[15,0,0,3,1,0,17,23],
+"snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1":[15,0,0,3,1,0,17,15],
+"snmp__core_8h.html#a5275903be5948b1c28bfadb365823504":[15,0,0,3,1,0,17,27],
+"snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27":[15,0,0,3,1,0,17,17],
+"snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93":[15,0,0,3,1,0,17,22],
+"snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84":[15,0,0,3,1,0,17,29],
+"snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904":[15,0,0,3,1,0,17,24],
+"snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213":[15,0,0,3,1,0,17,20],
+"snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de":[15,0,0,3,1,0,17,12],
+"snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e":[15,0,0,3,1,0,17,18],
+"snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a":[15,0,0,3,1,0,17,21],
+"snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72":[15,0,0,3,1,0,17,9],
+"snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09":[15,0,0,3,1,0,17,31],
+"snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589":[15,0,0,3,1,0,17,11],
+"snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e":[15,0,0,3,1,0,17,26],
+"snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc":[15,0,0,3,1,0,17,13],
+"snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760":[15,0,0,3,1,0,17,10],
+"snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03":[15,0,0,3,1,0,17,14],
+"snmp__core_8h.html#af041ab415e8063097c79be2b892174f8":[15,0,0,3,1,0,17,25],
+"snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9":[15,0,0,3,1,0,17,16],
+"snmp__mib2_8c.html":[15,0,0,1,7,3],
+"snmp__mib2_8h.html":[15,0,0,3,1,0,18],
+"snmp__mib2__icmp_8c.html":[15,0,0,1,7,4],
+"snmp__mib2__interfaces_8c.html":[15,0,0,1,7,5],
+"snmp__mib2__ip_8c.html":[15,0,0,1,7,6],
+"snmp__mib2__snmp_8c.html":[15,0,0,1,7,7],
+"snmp__mib2__system_8c.html":[15,0,0,1,7,8],
+"snmp__mib2__tcp_8c.html":[15,0,0,1,7,9],
+"snmp__mib2__udp_8c.html":[15,0,0,1,7,10],
+"snmp__msg_8c.html":[15,0,0,1,7,11],
+"snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04":[15,0,0,1,7,11,11],
+"snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b":[15,0,0,1,7,11,10],
+"snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5":[15,0,0,1,7,11,8],
+"snmp__msg_8c.html#ac6f810ab812c44c6ca1df1fdf926a9f6":[15,0,0,1,7,11,9],
+"snmp__msg_8h.html":[15,0,0,1,7,12],
+"snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04":[15,0,0,1,7,12,3],
+"snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5":[15,0,0,1,7,12,1],
+"snmp__msg_8h.html#ac6f810ab812c44c6ca1df1fdf926a9f6":[15,0,0,1,7,12,2],
+"snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a":[15,0,0,1,7,12,4],
+"snmp__netconn_8c.html":[15,0,0,1,7,13],
+"snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5":[15,0,0,1,7,13,0],
+"snmp__opts_8h.html":[15,0,0,3,1,0,19],
+"snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b":[15,0,0,3,1,0,19,1],
+"snmp__pbuf__stream_8c.html":[15,0,0,1,7,14],
+"snmp__pbuf__stream_8h.html":[15,0,0,1,7,15],
+"snmp__raw_8c.html":[15,0,0,1,7,16],
+"snmp__scalar_8c.html":[15,0,0,1,7,17],
+"snmp__scalar_8h.html":[15,0,0,3,1,0,20],
+"snmp__table_8c.html":[15,0,0,1,7,18],
+"snmp__table_8h.html":[15,0,0,3,1,0,21],
+"snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5":[15,0,0,3,1,0,21,3],
+"snmp__threadsync_8c.html":[15,0,0,1,7,19],
+"snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6":[15,0,0,1,7,19,0],
+"snmp__threadsync_8h.html":[15,0,0,3,1,0,22],
+"snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2":[15,0,0,3,1,0,22,3],
+"snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6":[15,0,0,3,1,0,22,4],
+"snmp__traps_8c.html":[15,0,0,1,7,20],
+"snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b":[15,0,0,1,7,20,14],
+"snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a":[15,0,0,1,7,20,15],
+"snmpv3_8c.html":[15,0,0,1,7,21],
+"snmpv3_8h.html":[15,0,0,3,1,0,23],
+"snmpv3__mbedtls_8c.html":[15,0,0,1,7,22],
+"snmpv3__priv_8h.html":[15,0,0,1,7,23],
+"sntp_8c.html":[15,0,0,1,8,0],
+"sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f":[15,0,0,1,8,0,4],
+"sntp_8h.html":[15,0,0,3,1,0,24],
+"sntp__opts_8h.html":[15,0,0,3,1,0,25],
+"socket_8h.html":[15,0,0,3,0,0,2,0],
+"sockets_8c.html":[15,0,0,0,7],
+"sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0":[15,0,0,0,7,6],
+"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9":[15,0,0,0,7,1],
+"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1":[15,0,0,0,7,1,2],
+"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7":[15,0,0,0,7,1,0],
+"sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d":[15,0,0,0,7,1,1],
+"sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7":[15,0,0,0,7,5],
+"sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b":[15,0,0,0,7,3],
+"sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1":[15,0,0,0,7,4],
+"sockets_8c.html#ae84296093574ec746f8f88321356388f":[15,0,0,0,7,2],
+"sockets_8h.html":[15,0,0,3,1,47],
+"sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0":[15,0,0,3,1,47,5],
+"sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa":[15,0,0,3,1,47,0],
+"sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7":[15,0,0,3,1,47,4],
+"sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b":[15,0,0,3,1,47,2],
+"sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1":[15,0,0,3,1,47,3],
+"sockets_8h.html#ae84296093574ec746f8f88321356388f":[15,0,0,3,1,47,1],
+"sockets__priv_8h.html":[15,0,0,3,1,1,7],
+"sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196":[15,0,0,3,1,1,7,2],
+"stats_8c.html":[15,0,0,2,15],
+"stats_8c.html#a614735db0145db9ba944ede600d1d19b":[15,0,0,2,15,1],
+"stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d":[15,0,0,2,15,0],
+"stats_8h.html":[15,0,0,3,1,48],
+"stats_8h.html#a614735db0145db9ba944ede600d1d19b":[15,0,0,3,1,48,8],
+"stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d":[15,0,0,3,1,48,7],
+"struct__lwiperf__settings.html":[14,0,0],
+"struct__lwiperf__state__tcp.html":[14,0,1],
+"structacd.html":[14,0,2],
+"structacd.html#a3a03aa687716055a4f75f6e5e380e46e":[14,0,2,0],
+"structacd.html#a4ab002648d338ae33ffd3829e23703cb":[14,0,2,5],
+"structacd.html#a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb":[14,0,2,6],
+"structacd.html#a9dd4e1b82dd3e97717f011dbf862a58e":[14,0,2,2],
+"structacd.html#aa14c2b88cd471839d5b5de80bb46a9aa":[14,0,2,3],
+"structacd.html#aabde1967e37d685b19b9701af641a97c":[14,0,2,7],
+"structacd.html#ab40b6b3cf57634135753f2426207f84a":[14,0,2,4],
+"structacd.html#af2c795ee5b09085bca592d830a388448":[14,0,2,1],
+"structaltcp__allocator__s.html":[13,2,0,0,0,1],
+"structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1":[13,2,0,0,0,1,1],
+"structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687":[13,2,0,0,0,1,0],
+"structapi__msg.html":[14,0,4],
+"structapi__msg.html#a0abfc9bda0b00554628bc3169d8f21bf":[14,0,4,15],
+"structapi__msg.html#a1831a18bdfe88ca89a773fc477966894":[14,0,4,0],
+"structapi__msg.html#a1ceb9822ba49ba439e30d98492593612":[14,0,4,12],
+"structapi__msg.html#a40624c398d1939bfee54bffa708a363e":[14,0,4,6],
+"structapi__msg.html#a4bd9382dd42b18120803e246a0203353":[14,0,4,9],
+"structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444":[14,0,4,14],
+"structapi__msg.html#a718b0166a9956c608188e8f99c663203":[14,0,4,5],
+"structapi__msg.html#a7c67466a08e96f57f5cc8a41beb883b3":[14,0,4,7],
+"structapi__msg.html#a8644758cd55e0891e43717711ae7b03b":[14,0,4,11],
+"structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f":[14,0,4,4],
+"structapi__msg.html#a8e600d95eb044f8f7dc9ff921aaa05b1":[14,0,4,2],
+"structapi__msg.html#a9b0c707835838c2ffe55b85c2902d7ad":[14,0,4,8],
+"structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05":[14,0,4,1],
+"structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2":[14,0,4,13],
+"structapi__msg.html#abec5e33802d69f1b601543d60699f028":[14,0,4,3],
+"structapi__msg.html#adbb33e03089db527b0af7e4b22f04e1c":[14,0,4,10],
+"structautoip.html":[14,0,5],
+"structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7":[14,0,5,1],
+"structautoip.html#a1965250cda881d229e2a1fe146a0bb9e":[14,0,5,0],
+"structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853":[14,0,5,3],
+"structautoip.html#a51af55190548e378e310aeaddfa1fdef":[14,0,5,2],
+"structbridgeif__initdata__s.html":[13,3,0,2],
+"structbridgeif__initdata__s.html#a0e0bb6a885967b5fcfef09a8f0adc63f":[13,3,0,2,3],
+"structbridgeif__initdata__s.html#a210915aa1b0436ccabc7e8d9fd3c3fe6":[13,3,0,2,2],
+"structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc":[13,3,0,2,0],
+"structbridgeif__initdata__s.html#aeb312c2e698513c6416d5c8459ad622f":[13,3,0,2,1],
+"structdhcp6__msg.html":[14,0,7],
+"structdhcp__msg.html":[14,0,8],
+"structdns__answer.html":[14,0,9],
+"structdns__api__msg.html":[14,0,10],
+"structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2":[14,0,10,4],
+"structdns__api__msg.html#a217814594564077d21b0f2696280b2a8":[14,0,10,0],
+"structdns__api__msg.html#a6536d91adb146555461359bd451b30de":[14,0,10,2],
+"structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53":[14,0,10,3],
+"structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493":[14,0,10,1],
+"structdns__hdr.html":[14,0,11],
+"structdns__query.html":[14,0,12],
+"structdns__req__entry.html":[14,0,13],
+"structdns__table__entry.html":[14,0,14],
+"structeth__addr.html":[14,0,15],
+"structeth__hdr.html":[14,0,16],
+"structeth__vlan__hdr.html":[14,0,17],
+"structetharp__hdr.html":[14,0,18],
+"structetharp__q__entry.html":[14,0,19],
+"structgethostbyname__r__helper.html":[14,0,20],
+"structicmp6__echo__hdr.html":[14,0,21],
+"structicmp6__hdr.html":[14,0,22],
+"structicmp__echo__hdr.html":[14,0,23],
+"structicmp__hdr.html":[14,0,24],
+"structieee__802154__hdr.html":[14,0,25],
+"structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10":[14,0,25,2],
+"structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869":[14,0,25,3],
+"structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33":[14,0,25,0],
+"structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937":[14,0,25,4],
+"structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2":[14,0,25,5],
+"structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd":[14,0,25,1],
+"structigmp__group.html":[14,0,26],
+"structigmp__group.html#a8e2227e486652603fcd7f88681d4c75b":[14,0,26,4],
+"structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874":[14,0,26,2],
+"structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78":[14,0,26,3],
+"structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852":[14,0,26,5],
+"structigmp__group.html#add0d24f719ad4b598abad254689ad911":[14,0,26,1],
+"structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854":[14,0,26,0],
+"structigmp__msg.html":[14,0,27],
+"structip4__addr.html":[14,0,28],
+"structip4__addr__packed.html":[14,0,29],
+"structip4__addr__wordaligned.html":[14,0,30],
+"structip6__addr.html":[14,0,31],
+"structip6__addr__packed.html":[14,0,32],
+"structip6__hdr.html":[14,0,33],
+"structip6__hdr.html#a9d225109d601ae8b34bab6ca3528fa94":[14,0,33,2],
+"structip6__hdr.html#abe3d612d4570864c922e18ed838292f6":[14,0,33,1],
+"structip6__hdr.html#ad3b638f503a3f7e7724cf4c7b2c0a0b5":[14,0,33,3],
+"structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef":[14,0,33,4]
 };
diff --git a/doc/doxygen/output/html/nd6_8c.html b/doc/doxygen/output/html/nd6_8c.html
index e6abd35..13c4693 100644
--- a/doc/doxygen/output/html/nd6_8c.html
+++ b/doc/doxygen/output/html/nd6_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/nd6_8h.html b/doc/doxygen/output/html/nd6_8h.html
index 4acb178..1d94d64 100644
--- a/doc/doxygen/output/html/nd6_8h.html
+++ b/doc/doxygen/output/html/nd6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/nd6__priv_8h.html b/doc/doxygen/output/html/nd6__priv_8h.html
index 3bad640..d58521d 100644
--- a/doc/doxygen/output/html/nd6__priv_8h.html
+++ b/doc/doxygen/output/html/nd6__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/netbiosns_8c.html b/doc/doxygen/output/html/netbiosns_8c.html
index 867e5b8..1cbe2d8 100644
--- a/doc/doxygen/output/html/netbiosns_8c.html
+++ b/doc/doxygen/output/html/netbiosns_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/netbiosns_8h.html b/doc/doxygen/output/html/netbiosns_8h.html
index 8ee4e21..f94b650 100644
--- a/doc/doxygen/output/html/netbiosns_8h.html
+++ b/doc/doxygen/output/html/netbiosns_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/netbiosns__opts_8h.html b/doc/doxygen/output/html/netbiosns__opts_8h.html
index 4053f44..a451e32 100644
--- a/doc/doxygen/output/html/netbiosns__opts_8h.html
+++ b/doc/doxygen/output/html/netbiosns__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/netbuf_8c.html b/doc/doxygen/output/html/netbuf_8c.html
index b173a1c..90d6158 100644
--- a/doc/doxygen/output/html/netbuf_8c.html
+++ b/doc/doxygen/output/html/netbuf_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/netbuf_8h.html b/doc/doxygen/output/html/netbuf_8h.html
index 46de695..d05d2b4 100644
--- a/doc/doxygen/output/html/netbuf_8h.html
+++ b/doc/doxygen/output/html/netbuf_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/netdb_8c.html b/doc/doxygen/output/html/netdb_8c.html
index 1f96077..341cd07 100644
--- a/doc/doxygen/output/html/netdb_8c.html
+++ b/doc/doxygen/output/html/netdb_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -124,8 +124,6 @@
 Macros</h2></td></tr>
 <tr class="memitem:a768ab8ead892d6454709680340cd070e" id="r_a768ab8ead892d6454709680340cd070e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a768ab8ead892d6454709680340cd070e">LWIP_DNS_API_HOSTENT_STORAGE</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:a768ab8ead892d6454709680340cd070e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:acfc1e988534c0e497599b904739f92fe" id="r_acfc1e988534c0e497599b904739f92fe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#acfc1e988534c0e497599b904739f92fe">HOSTENT_STORAGE</a>&#160;&#160;&#160;static</td></tr>
-<tr class="separator:acfc1e988534c0e497599b904739f92fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
@@ -146,21 +144,6 @@
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>API functions for name resolving </p>
 </div><h2 class="groupheader">Macro Definition Documentation</h2>
-<a id="acfc1e988534c0e497599b904739f92fe" name="acfc1e988534c0e497599b904739f92fe"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#acfc1e988534c0e497599b904739f92fe">&#9670;&#160;</a></span>HOSTENT_STORAGE</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">#define HOSTENT_STORAGE&#160;&#160;&#160;static</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>define "hostent" variables storage </p>
-
-</div>
-</div>
 <a id="a768ab8ead892d6454709680340cd070e" name="a768ab8ead892d6454709680340cd070e"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a768ab8ead892d6454709680340cd070e">&#9670;&#160;</a></span>LWIP_DNS_API_HOSTENT_STORAGE</h2>
 
@@ -172,7 +155,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>define "hostent" variables storage: 0 if we use a static (but unprotected) set of variables for lwip_gethostbyname, 1 if we use a local storage </p>
+<p>LWIP_DNS_API_HOSTENT_STORAGE: if set to 0 (default), <a class="el" href="#abe6a6a103a2f6fa4e13098e455ac7bb3">lwip_gethostbyname()</a> returns the same global variabe for all calls (in all threads). When set to 1, your port should provide a function struct hostent* sys_thread_hostent( struct hostent* h); which have to do a copy of "h" and return a pointer ont the "per-thread" copy. </p>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/netdb_8c.js b/doc/doxygen/output/html/netdb_8c.js
index 324768a..5025d3b 100644
--- a/doc/doxygen/output/html/netdb_8c.js
+++ b/doc/doxygen/output/html/netdb_8c.js
@@ -1,7 +1,6 @@
 var netdb_8c =
 [
     [ "gethostbyname_r_helper", "structgethostbyname__r__helper.html", null ],
-    [ "HOSTENT_STORAGE", "netdb_8c.html#acfc1e988534c0e497599b904739f92fe", null ],
     [ "LWIP_DNS_API_HOSTENT_STORAGE", "netdb_8c.html#a768ab8ead892d6454709680340cd070e", null ],
     [ "lwip_freeaddrinfo", "netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5", null ],
     [ "lwip_getaddrinfo", "netdb_8c.html#af356989c172a51187e22b557f22d4165", null ],
diff --git a/doc/doxygen/output/html/netif_2ethernet_8h.html b/doc/doxygen/output/html/netif_2ethernet_8h.html
index e7a702e..c846a8e 100644
--- a/doc/doxygen/output/html/netif_2ethernet_8h.html
+++ b/doc/doxygen/output/html/netif_2ethernet_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/netif_8c.html b/doc/doxygen/output/html/netif_8c.html
index 6348ebe..b7489c3 100644
--- a/doc/doxygen/output/html/netif_8c.html
+++ b/doc/doxygen/output/html/netif_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -123,6 +123,7 @@
 <code>#include &quot;<a class="el" href="netif_2ethernet_8h.html">netif/ethernet.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="autoip_8h.html">lwip/autoip.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="dhcp_8h.html">lwip/dhcp.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="acd_8h.html">lwip/acd.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="dhcp6_8h.html">lwip/dhcp6.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="mld6_8h.html">lwip/mld6.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.h</a>&quot;</code><br />
diff --git a/doc/doxygen/output/html/netif_8h.html b/doc/doxygen/output/html/netif_8h.html
index a66a538..6ceb194 100644
--- a/doc/doxygen/output/html/netif_8h.html
+++ b/doc/doxygen/output/html/netif_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -159,6 +159,14 @@
 <tr class="separator:ga94a4c24c988afc0a577387730f303b19"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a780be4c3fa9f7f2534f7865666c3a1b8" id="r_a780be4c3fa9f7f2534f7865666c3a1b8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a780be4c3fa9f7f2534f7865666c3a1b8">netif_is_link_up</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
 <tr class="separator:a780be4c3fa9f7f2534f7865666c3a1b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3428b3f8195249c6cd8704a4db46b401" id="r_ga3428b3f8195249c6cd8704a4db46b401"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga3428b3f8195249c6cd8704a4db46b401">netif_set_igmp_mac_filter</a>(<a class="el" href="structnetif.html">netif</a>,  function)</td></tr>
+<tr class="separator:ga3428b3f8195249c6cd8704a4db46b401"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a674553c18b429b53397372ea82fcaf" id="r_a0a674553c18b429b53397372ea82fcaf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a0a674553c18b429b53397372ea82fcaf">netif_get_igmp_mac_filter</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a0a674553c18b429b53397372ea82fcaf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga97f30bb5542e4c07d3b32e3c754e104c" id="r_ga97f30bb5542e4c07d3b32e3c754e104c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c">netif_set_mld_mac_filter</a>(<a class="el" href="structnetif.html">netif</a>,  function)</td></tr>
+<tr class="separator:ga97f30bb5542e4c07d3b32e3c754e104c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a046c4816e37c3c4b84b3634eeeea7029" id="r_a046c4816e37c3c4b84b3634eeeea7029"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a046c4816e37c3c4b84b3634eeeea7029">netif_get_mld_mac_filter</a>(<a class="el" href="structnetif.html">netif</a>)</td></tr>
+<tr class="separator:a046c4816e37c3c4b84b3634eeeea7029"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:adbfecb47897cfe63d4f6366c1fed23b2" id="r_adbfecb47897cfe63d4f6366c1fed23b2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#adbfecb47897cfe63d4f6366c1fed23b2">LWIP_NSC_NETIF_ADDED</a>&#160;&#160;&#160;0x0001</td></tr>
 <tr class="separator:adbfecb47897cfe63d4f6366c1fed23b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae8e2dc87c19a03d481ae37bcf7ced5c9" id="r_ae8e2dc87c19a03d481ae37bcf7ced5c9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ae8e2dc87c19a03d481ae37bcf7ced5c9">LWIP_NSC_NETIF_REMOVED</a>&#160;&#160;&#160;0x0002</td></tr>
@@ -179,6 +187,8 @@
 <tr class="separator:a8fb4317a77ee2e3848be80db15618666"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a0d70fe11cac43c8fa35827b8e607ccf6" id="r_a0d70fe11cac43c8fa35827b8e607ccf6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a0d70fe11cac43c8fa35827b8e607ccf6">LWIP_NSC_IPV6_ADDR_STATE_CHANGED</a>&#160;&#160;&#160;0x0200</td></tr>
 <tr class="separator:a0d70fe11cac43c8fa35827b8e607ccf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a716576f3485524d44ef0843839ef0564" id="r_a716576f3485524d44ef0843839ef0564"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a716576f3485524d44ef0843839ef0564">LWIP_NSC_IPV4_ADDR_VALID</a>&#160;&#160;&#160;0x0400</td></tr>
+<tr class="separator:a716576f3485524d44ef0843839ef0564"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
 Typedefs</h2></td></tr>
@@ -285,6 +295,21 @@
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>netif API (to be used from TCPIP thread) </p>
 </div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a716576f3485524d44ef0843839ef0564" name="a716576f3485524d44ef0843839ef0564"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a716576f3485524d44ef0843839ef0564">&#9670;&#160;</a></span>LWIP_NSC_IPV4_ADDR_VALID</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define LWIP_NSC_IPV4_ADDR_VALID&#160;&#160;&#160;0x0400</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>IPv4 settings: valid address set, application may start to communicate </p>
+
+</div>
+</div>
 <a id="aeb4e790199b02469aa04c044ef5cfa32" name="aeb4e790199b02469aa04c044ef5cfa32"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aeb4e790199b02469aa04c044ef5cfa32">&#9670;&#160;</a></span>LWIP_NSC_IPV4_ADDRESS_CHANGED</h2>
 
@@ -432,8 +457,47 @@
       </table>
 </div><div class="memdoc">
 <p>netif administrative status changed.<br  />
-up is called AFTER netif is set up.<br  />
-down is called BEFORE the netif is actually set down. </p>
+ up is called AFTER netif is set up.<br  />
+ down is called BEFORE the netif is actually set down. </p>
+
+</div>
+</div>
+<a id="a0a674553c18b429b53397372ea82fcaf" name="a0a674553c18b429b53397372ea82fcaf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0a674553c18b429b53397372ea82fcaf">&#9670;&#160;</a></span>netif_get_igmp_mac_filter</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_get_igmp_mac_filter</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em><a class="el" href="structnetif.html">netif</a></em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(((<a class="code hl_struct" href="structnetif.html">netif</a>) != NULL) ? ((<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;igmp_mac_filter) : NULL)</div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
+</div><!-- fragment --><p>Get the igmp mac filter function for a netif. </p>
+
+</div>
+</div>
+<a id="a046c4816e37c3c4b84b3634eeeea7029" name="a046c4816e37c3c4b84b3634eeeea7029"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a046c4816e37c3c4b84b3634eeeea7029">&#9670;&#160;</a></span>netif_get_mld_mac_filter</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define netif_get_mld_mac_filter</td>
+          <td>(</td>
+          <td class="paramtype"></td>          <td class="paramname"><span class="paramname"><em><a class="el" href="structnetif.html">netif</a></em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(((<a class="code hl_struct" href="structnetif.html">netif</a>) != NULL) ? ((<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;mld_mac_filter) : NULL)</div>
+</div><!-- fragment --><p>Get the mld mac filter function for a netif. </p>
 
 </div>
 </div>
@@ -453,7 +517,6 @@
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">(((<a class="code hl_struct" href="structnetif.html">netif</a>)-&gt;flags &amp; <a class="code hl_define" href="group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8">NETIF_FLAG_LINK_UP</a>) ? (u8_t)1 : (u8_t)0)</div>
 <div class="ttc" id="agroup__netif__flags_html_ga75f5a2b9276c93e3bd18a568459fd2d8"><div class="ttname"><a href="group__netif__flags.html#ga75f5a2b9276c93e3bd18a568459fd2d8">NETIF_FLAG_LINK_UP</a></div><div class="ttdeci">#define NETIF_FLAG_LINK_UP</div><div class="ttdef"><b>Definition</b> netif.h:93</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
 </div><!-- fragment --><p>Ask if a link is up </p>
 
 </div>
diff --git a/doc/doxygen/output/html/netif_8h.js b/doc/doxygen/output/html/netif_8h.js
index b09f082..1ecf973 100644
--- a/doc/doxygen/output/html/netif_8h.js
+++ b/doc/doxygen/output/html/netif_8h.js
@@ -6,6 +6,7 @@
     [ "netif_ext_callback_args_t::ipv4_changed_s", "structnetif__ext__callback__args__t_1_1ipv4__changed__s.html", "structnetif__ext__callback__args__t_1_1ipv4__changed__s" ],
     [ "netif_ext_callback_args_t::ipv6_set_s", "structnetif__ext__callback__args__t_1_1ipv6__set__s.html", "structnetif__ext__callback__args__t_1_1ipv6__set__s" ],
     [ "netif_ext_callback_args_t::ipv6_addr_state_changed_s", "structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html", "structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s" ],
+    [ "LWIP_NSC_IPV4_ADDR_VALID", "netif_8h.html#a716576f3485524d44ef0843839ef0564", null ],
     [ "LWIP_NSC_IPV4_ADDRESS_CHANGED", "netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32", null ],
     [ "LWIP_NSC_IPV4_GATEWAY_CHANGED", "netif_8h.html#a22400d2202581b4a7273cded712adf49", null ],
     [ "LWIP_NSC_IPV4_NETMASK_CHANGED", "netif_8h.html#ad747072771a887443ab33f90a12077d4", null ],
@@ -24,11 +25,15 @@
     [ "NETIF_FLAG_MLD6", "group__netif__flags.html#gab14fbe1447d2fdbdf5abc87f51eb6508", null ],
     [ "NETIF_FLAG_UP", "group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e", null ],
     [ "netif_get_client_data", "group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5", null ],
+    [ "netif_get_igmp_mac_filter", "netif_8h.html#a0a674553c18b429b53397372ea82fcaf", null ],
+    [ "netif_get_mld_mac_filter", "netif_8h.html#a046c4816e37c3c4b84b3634eeeea7029", null ],
     [ "netif_is_link_up", "netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8", null ],
     [ "netif_is_up", "group__netif.html#ga94a4c24c988afc0a577387730f303b19", null ],
     [ "NETIF_MAX_HWADDR_LEN", "netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41", null ],
     [ "NETIF_NAMESIZE", "netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a", null ],
     [ "netif_set_client_data", "group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f", null ],
+    [ "netif_set_igmp_mac_filter", "group__netif.html#ga3428b3f8195249c6cd8704a4db46b401", null ],
+    [ "netif_set_mld_mac_filter", "group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c", null ],
     [ "netif_ext_callback_fn", "group__netif.html#ga5ee213cea065424c89c66f138c008da1", null ],
     [ "netif_igmp_mac_filter_fn", "netif_8h.html#a71cad3277efe29191eef3348f4bf21f7", null ],
     [ "netif_init_fn", "netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5", null ],
diff --git a/doc/doxygen/output/html/netifapi_8c.html b/doc/doxygen/output/html/netifapi_8c.html
index 52c1fab..f194651 100644
--- a/doc/doxygen/output/html/netifapi_8c.html
+++ b/doc/doxygen/output/html/netifapi_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -111,10 +111,10 @@
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:a62b0bdbb3783eb27aa73485081306119" id="r_a62b0bdbb3783eb27aa73485081306119"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a62b0bdbb3783eb27aa73485081306119">netifapi_arp_add</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *ethaddr, enum netifapi_arp_entry type)</td></tr>
-<tr class="separator:a62b0bdbb3783eb27aa73485081306119"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a037c3d05c19b4d467b6ce06eb4639ee8" id="r_a037c3d05c19b4d467b6ce06eb4639ee8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a037c3d05c19b4d467b6ce06eb4639ee8">netifapi_arp_remove</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, enum netifapi_arp_entry type)</td></tr>
-<tr class="separator:a037c3d05c19b4d467b6ce06eb4639ee8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga62b0bdbb3783eb27aa73485081306119" id="r_ga62b0bdbb3783eb27aa73485081306119"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119">netifapi_arp_add</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *ethaddr, enum netifapi_arp_entry type)</td></tr>
+<tr class="separator:ga62b0bdbb3783eb27aa73485081306119"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga037c3d05c19b4d467b6ce06eb4639ee8" id="r_ga037c3d05c19b4d467b6ce06eb4639ee8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8">netifapi_arp_remove</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, enum netifapi_arp_entry type)</td></tr>
+<tr class="separator:ga037c3d05c19b4d467b6ce06eb4639ee8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gacc063c5a3071e34eec7376651e35a519" id="r_gacc063c5a3071e34eec7376651e35a519"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519">netifapi_netif_add</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *netmask, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *gw, void *state, <a class="el" href="netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5">netif_init_fn</a> init, <a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a> input)</td></tr>
 <tr class="separator:gacc063c5a3071e34eec7376651e35a519"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga31755ea6dbb213236bfce19bcbe8c973" id="r_ga31755ea6dbb213236bfce19bcbe8c973"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973">netifapi_netif_set_addr</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *netmask, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *gw)</td></tr>
@@ -129,72 +129,6 @@
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Network Interface Sequential API module </p>
 </div><h2 class="groupheader">Function Documentation</h2>
-<a id="a62b0bdbb3783eb27aa73485081306119" name="a62b0bdbb3783eb27aa73485081306119"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a62b0bdbb3783eb27aa73485081306119">&#9670;&#160;</a></span>netifapi_arp_add()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> netifapi_arp_add </td>
-          <td>(</td>
-          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> *</td>          <td class="paramname"><span class="paramname"><em>ethaddr</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">enum netifapi_arp_entry</td>          <td class="paramname"><span class="paramname"><em>type</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Add or update an entry in the ARP cache. For an update, ipaddr is used to find the cache entry.</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">ipaddr</td><td>IPv4 address of cache entry </td></tr>
-    <tr><td class="paramname">ethaddr</td><td>hardware address mapped to ipaddr </td></tr>
-    <tr><td class="paramname">type</td><td>type of ARP cache entry </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>ERR_OK: entry added/updated, else error from err_t </dd></dl>
-
-</div>
-</div>
-<a id="a037c3d05c19b4d467b6ce06eb4639ee8" name="a037c3d05c19b4d467b6ce06eb4639ee8"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a037c3d05c19b4d467b6ce06eb4639ee8">&#9670;&#160;</a></span>netifapi_arp_remove()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> netifapi_arp_remove </td>
-          <td>(</td>
-          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">enum netifapi_arp_entry</td>          <td class="paramname"><span class="paramname"><em>type</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Remove an entry in the ARP cache identified by ipaddr</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">ipaddr</td><td>IPv4 address of cache entry </td></tr>
-    <tr><td class="paramname">type</td><td>type of ARP cache entry </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>ERR_OK: entry removed, else error from err_t </dd></dl>
-
-</div>
-</div>
 <a id="a26fd83042b53b2ff82e15262ed72f0a7" name="a26fd83042b53b2ff82e15262ed72f0a7"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a26fd83042b53b2ff82e15262ed72f0a7">&#9670;&#160;</a></span>netifapi_netif_common()</h2>
 
diff --git a/doc/doxygen/output/html/netifapi_8c.js b/doc/doxygen/output/html/netifapi_8c.js
index ebbdb59..1734ddb 100644
--- a/doc/doxygen/output/html/netifapi_8c.js
+++ b/doc/doxygen/output/html/netifapi_8c.js
@@ -1,7 +1,7 @@
 var netifapi_8c =
 [
-    [ "netifapi_arp_add", "netifapi_8c.html#a62b0bdbb3783eb27aa73485081306119", null ],
-    [ "netifapi_arp_remove", "netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8", null ],
+    [ "netifapi_arp_add", "group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119", null ],
+    [ "netifapi_arp_remove", "group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8", null ],
     [ "netifapi_netif_add", "group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519", null ],
     [ "netifapi_netif_common", "netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7", null ],
     [ "netifapi_netif_index_to_name", "group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6", null ],
diff --git a/doc/doxygen/output/html/netifapi_8h.html b/doc/doxygen/output/html/netifapi_8h.html
index 74a9b3f..fb0aeff 100644
--- a/doc/doxygen/output/html/netifapi_8h.html
+++ b/doc/doxygen/output/html/netifapi_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -145,10 +145,10 @@
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:a62b0bdbb3783eb27aa73485081306119" id="r_a62b0bdbb3783eb27aa73485081306119"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a62b0bdbb3783eb27aa73485081306119">netifapi_arp_add</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *ethaddr, enum netifapi_arp_entry type)</td></tr>
-<tr class="separator:a62b0bdbb3783eb27aa73485081306119"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a037c3d05c19b4d467b6ce06eb4639ee8" id="r_a037c3d05c19b4d467b6ce06eb4639ee8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a037c3d05c19b4d467b6ce06eb4639ee8">netifapi_arp_remove</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, enum netifapi_arp_entry type)</td></tr>
-<tr class="separator:a037c3d05c19b4d467b6ce06eb4639ee8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga62b0bdbb3783eb27aa73485081306119" id="r_ga62b0bdbb3783eb27aa73485081306119"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119">netifapi_arp_add</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, struct <a class="el" href="structeth__addr.html">eth_addr</a> *ethaddr, enum netifapi_arp_entry type)</td></tr>
+<tr class="separator:ga62b0bdbb3783eb27aa73485081306119"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga037c3d05c19b4d467b6ce06eb4639ee8" id="r_ga037c3d05c19b4d467b6ce06eb4639ee8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8">netifapi_arp_remove</a> (const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, enum netifapi_arp_entry type)</td></tr>
+<tr class="separator:ga037c3d05c19b4d467b6ce06eb4639ee8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gacc063c5a3071e34eec7376651e35a519" id="r_gacc063c5a3071e34eec7376651e35a519"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519">netifapi_netif_add</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *netmask, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *gw, void *state, <a class="el" href="netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5">netif_init_fn</a> init, <a class="el" href="netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e">netif_input_fn</a> input)</td></tr>
 <tr class="separator:gacc063c5a3071e34eec7376651e35a519"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga31755ea6dbb213236bfce19bcbe8c973" id="r_ga31755ea6dbb213236bfce19bcbe8c973"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973">netifapi_netif_set_addr</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *ipaddr, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *netmask, const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *gw)</td></tr>
@@ -163,72 +163,6 @@
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>netif API (to be used from non-TCPIP threads) </p>
 </div><h2 class="groupheader">Function Documentation</h2>
-<a id="a62b0bdbb3783eb27aa73485081306119" name="a62b0bdbb3783eb27aa73485081306119"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a62b0bdbb3783eb27aa73485081306119">&#9670;&#160;</a></span>netifapi_arp_add()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> netifapi_arp_add </td>
-          <td>(</td>
-          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">struct <a class="el" href="structeth__addr.html">eth_addr</a> *</td>          <td class="paramname"><span class="paramname"><em>ethaddr</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">enum netifapi_arp_entry</td>          <td class="paramname"><span class="paramname"><em>type</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Add or update an entry in the ARP cache. For an update, ipaddr is used to find the cache entry.</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">ipaddr</td><td>IPv4 address of cache entry </td></tr>
-    <tr><td class="paramname">ethaddr</td><td>hardware address mapped to ipaddr </td></tr>
-    <tr><td class="paramname">type</td><td>type of ARP cache entry </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>ERR_OK: entry added/updated, else error from err_t </dd></dl>
-
-</div>
-</div>
-<a id="a037c3d05c19b4d467b6ce06eb4639ee8" name="a037c3d05c19b4d467b6ce06eb4639ee8"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a037c3d05c19b4d467b6ce06eb4639ee8">&#9670;&#160;</a></span>netifapi_arp_remove()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> netifapi_arp_remove </td>
-          <td>(</td>
-          <td class="paramtype">const <a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>ipaddr</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">enum netifapi_arp_entry</td>          <td class="paramname"><span class="paramname"><em>type</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Remove an entry in the ARP cache identified by ipaddr</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">ipaddr</td><td>IPv4 address of cache entry </td></tr>
-    <tr><td class="paramname">type</td><td>type of ARP cache entry </td></tr>
-  </table>
-  </dd>
-</dl>
-<dl class="section return"><dt>Returns</dt><dd>ERR_OK: entry removed, else error from err_t </dd></dl>
-
-</div>
-</div>
 <a id="a26fd83042b53b2ff82e15262ed72f0a7" name="a26fd83042b53b2ff82e15262ed72f0a7"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a26fd83042b53b2ff82e15262ed72f0a7">&#9670;&#160;</a></span>netifapi_netif_common()</h2>
 
diff --git a/doc/doxygen/output/html/netifapi_8h.js b/doc/doxygen/output/html/netifapi_8h.js
index 20af8ed..145ed55 100644
--- a/doc/doxygen/output/html/netifapi_8h.js
+++ b/doc/doxygen/output/html/netifapi_8h.js
@@ -14,8 +14,8 @@
     [ "netifapi_netif_set_link_down", "group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4", null ],
     [ "netifapi_netif_set_link_up", "group__netifapi__netif.html#gac054a60a32447019913d34da63924853", null ],
     [ "netifapi_netif_set_up", "group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76", null ],
-    [ "netifapi_arp_add", "netifapi_8h.html#a62b0bdbb3783eb27aa73485081306119", null ],
-    [ "netifapi_arp_remove", "netifapi_8h.html#a037c3d05c19b4d467b6ce06eb4639ee8", null ],
+    [ "netifapi_arp_add", "group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119", null ],
+    [ "netifapi_arp_remove", "group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8", null ],
     [ "netifapi_netif_add", "group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519", null ],
     [ "netifapi_netif_common", "netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7", null ],
     [ "netifapi_netif_index_to_name", "group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6", null ],
diff --git a/doc/doxygen/output/html/opt_8h.html b/doc/doxygen/output/html/opt_8h.html
index c54d30a..4a13500 100644
--- a/doc/doxygen/output/html/opt_8h.html
+++ b/doc/doxygen/output/html/opt_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -129,8 +129,6 @@
 <tr class="separator:gae85efb3a5fcf8585c94b3c2669978959"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga6a30040db307b3459fc11906bd433f75" id="r_ga6a30040db307b3459fc11906bd433f75"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">LWIP_ASSERT_CORE_LOCKED</a>()</td></tr>
 <tr class="separator:ga6a30040db307b3459fc11906bd433f75"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gab97d014f7ecf3b20f9d5abc2d0a79a3e" id="r_gab97d014f7ecf3b20f9d5abc2d0a79a3e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e">LWIP_MARK_TCPIP_THREAD</a>()</td></tr>
-<tr class="separator:gab97d014f7ecf3b20f9d5abc2d0a79a3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga4ef345cc270912bd2230b1c5ec51dfc8" id="r_ga4ef345cc270912bd2230b1c5ec51dfc8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8">MEM_LIBC_MALLOC</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga4ef345cc270912bd2230b1c5ec51dfc8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gae93af697d27bbcefa6a28052d90f2f38" id="r_gae93af697d27bbcefa6a28052d90f2f38"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38">MEMP_MEM_MALLOC</a>&#160;&#160;&#160;0</td></tr>
@@ -179,7 +177,7 @@
 <tr class="separator:ga087b00ea20a7edebcad33a1a1353a5d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gab648ff95d8ffa4216b95f82a568a5d9a" id="r_gab648ff95d8ffa4216b95f82a568a5d9a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a">MEMP_NUM_IGMP_GROUP</a>&#160;&#160;&#160;8</td></tr>
 <tr class="separator:gab648ff95d8ffa4216b95f82a568a5d9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga87a05debb46ff82093d0e6dc1aad8804" id="r_ga87a05debb46ff82093d0e6dc1aad8804"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804">LWIP_NUM_SYS_TIMEOUT_INTERNAL</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a> + <a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a> + <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a> + (2*<a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a>) + <a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">LWIP_AUTOIP</a> + <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a> + <a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">LWIP_DNS</a> + PPP_NUM_TIMEOUTS + (<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> * (1 + <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a> + <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a>)))</td></tr>
+<tr class="memitem:ga87a05debb46ff82093d0e6dc1aad8804" id="r_ga87a05debb46ff82093d0e6dc1aad8804"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804">LWIP_NUM_SYS_TIMEOUT_INTERNAL</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9">LWIP_TCP</a> + <a class="el" href="group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69">IP_REASSEMBLY</a> + <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a> + (2*<a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a>) + <a class="el" href="group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7">LWIP_ACD</a> + <a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a> + <a class="el" href="group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646">LWIP_DNS</a> + PPP_NUM_TIMEOUTS + (<a class="el" href="group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f">LWIP_IPV6</a> * (1 + <a class="el" href="group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864">LWIP_IPV6_REASS</a> + <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a> + <a class="el" href="group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6">LWIP_IPV6_DHCP6</a>)))</td></tr>
 <tr class="separator:ga87a05debb46ff82093d0e6dc1aad8804"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga4afbdca581a58d57bc7a81118a95327e" id="r_ga4afbdca581a58d57bc7a81118a95327e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e">MEMP_NUM_SYS_TIMEOUT</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804">LWIP_NUM_SYS_TIMEOUT_INTERNAL</a></td></tr>
 <tr class="separator:ga4afbdca581a58d57bc7a81118a95327e"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -263,8 +261,8 @@
 <tr class="separator:ga36e3ffa66073ca0d27d11c422778249c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga8a6ec62dc121064ac591b1fd8567bee9" id="r_ga8a6ec62dc121064ac591b1fd8567bee9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga8a6ec62dc121064ac591b1fd8567bee9"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gab2d91de7b2fce879b0a213682e1b0b69" id="r_gab2d91de7b2fce879b0a213682e1b0b69"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69">DHCP_DOES_ARP_CHECK</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a> &amp;&amp; <a class="el" href="group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87">LWIP_ARP</a>)</td></tr>
-<tr class="separator:gab2d91de7b2fce879b0a213682e1b0b69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gadd0c82329fccb78342e3eef98233aa55" id="r_gadd0c82329fccb78342e3eef98233aa55"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55">LWIP_DHCP_DOES_ACD_CHECK</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dhcp.html#ga8a6ec62dc121064ac591b1fd8567bee9">LWIP_DHCP</a></td></tr>
+<tr class="separator:gadd0c82329fccb78342e3eef98233aa55"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga3c2983cbd228011dd3e18cb417e7e423" id="r_ga3c2983cbd228011dd3e18cb417e7e423"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423">LWIP_DHCP_BOOTP_FILE</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga3c2983cbd228011dd3e18cb417e7e423"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga2cc18315edcd5ffc083d1256f7d22a83" id="r_ga2cc18315edcd5ffc083d1256f7d22a83"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83">LWIP_DHCP_GET_NTP_SRV</a>&#160;&#160;&#160;0</td></tr>
@@ -273,12 +271,16 @@
 <tr class="separator:ga9d014e3f7dc9e1e7c7decd8652ba65e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga60ccc20fbb08be24b5d5f599dd47a6a6" id="r_ga60ccc20fbb08be24b5d5f599dd47a6a6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6">LWIP_DHCP_MAX_DNS_SERVERS</a>&#160;&#160;&#160;<a class="el" href="group__lwip__opts__dns.html#ga9f9881c887a8aceb9765820c2dbdf292">DNS_MAX_SERVERS</a></td></tr>
 <tr class="separator:ga60ccc20fbb08be24b5d5f599dd47a6a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gad6b030f8e828666953661578f936e605" id="r_gad6b030f8e828666953661578f936e605"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__dhcp.html#gad6b030f8e828666953661578f936e605">LWIP_DHCP_DISCOVER_ADD_HOSTNAME</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:gad6b030f8e828666953661578f936e605"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaaf1b3a089827223589baf1b7f4f57069" id="r_gaaf1b3a089827223589baf1b7f4f57069"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">LWIP_AUTOIP</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gaaf1b3a089827223589baf1b7f4f57069"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga1a91e18dbb9777bc6e3963f52cb5f9fe" id="r_ga1a91e18dbb9777bc6e3963f52cb5f9fe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe">LWIP_DHCP_AUTOIP_COOP</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga1a91e18dbb9777bc6e3963f52cb5f9fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga4ff3f941b4c71a04b0c30fbee5b198c2" id="r_ga4ff3f941b4c71a04b0c30fbee5b198c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2">LWIP_DHCP_AUTOIP_COOP_TRIES</a>&#160;&#160;&#160;9</td></tr>
 <tr class="separator:ga4ff3f941b4c71a04b0c30fbee5b198c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6f1667866335cad3a7b1221bd0b274e7" id="r_ga6f1667866335cad3a7b1221bd0b274e7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7">LWIP_ACD</a>&#160;&#160;&#160;(<a class="el" href="group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069">LWIP_AUTOIP</a> || <a class="el" href="group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55">LWIP_DHCP_DOES_ACD_CHECK</a>)</td></tr>
+<tr class="separator:ga6f1667866335cad3a7b1221bd0b274e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gad84d6a781880cec19a1ef4b2339fea29" id="r_gad84d6a781880cec19a1ef4b2339fea29"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29">LWIP_MIB2_CALLBACKS</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gad84d6a781880cec19a1ef4b2339fea29"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gab8d7d53247cc62caa76f54b2c5a5df30" id="r_gab8d7d53247cc62caa76f54b2c5a5df30"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30">LWIP_MULTICAST_TX_OPTIONS</a>&#160;&#160;&#160;((<a class="el" href="group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923">LWIP_IGMP</a> || <a class="el" href="group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528">LWIP_IPV6_MLD</a>) &amp;&amp; (<a class="el" href="group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3">LWIP_UDP</a> || <a class="el" href="group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221">LWIP_RAW</a>))</td></tr>
@@ -333,6 +335,8 @@
 <tr class="separator:gaf1ab7bb27860aa3677c387a2f3ba317b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gac04b84d32251ac558f0c3a8af85ba3a5" id="r_gac04b84d32251ac558f0c3a8af85ba3a5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gac04b84d32251ac558f0c3a8af85ba3a5">TCP_CALCULATE_EFF_SEND_MSS</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:gac04b84d32251ac558f0c3a8af85ba3a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gade23373901980c6e7a43cef813386ebe" id="r_gade23373901980c6e7a43cef813386ebe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#gade23373901980c6e7a43cef813386ebe">LWIP_TCP_RTO_TIME</a>&#160;&#160;&#160;3000</td></tr>
+<tr class="separator:gade23373901980c6e7a43cef813386ebe"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga871d111968d8c6c7880ff36b93c5c4dd" id="r_ga871d111968d8c6c7880ff36b93c5c4dd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>&#160;&#160;&#160;(2 * <a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>)</td></tr>
 <tr class="separator:ga871d111968d8c6c7880ff36b93c5c4dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga9beaa47832ead4180981bfbf71074904" id="r_ga9beaa47832ead4180981bfbf71074904"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">TCP_SND_QUEUELEN</a>&#160;&#160;&#160;((4 * (<a class="el" href="group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd">TCP_SND_BUF</a>) + (<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a> - 1))/(<a class="el" href="group__lwip__opts__tcp.html#gaf1ab7bb27860aa3677c387a2f3ba317b">TCP_MSS</a>))</td></tr>
@@ -451,6 +455,8 @@
 <tr class="separator:ga484c38ab08f60d5b3335d23d31f9a402"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gad0197c845fbb44c920b272f0fef3b57e" id="r_gad0197c845fbb44c920b272f0fef3b57e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e">LWIP_SOCKET_OFFSET</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:gad0197c845fbb44c920b272f0fef3b57e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga524c013ecdd8a45a2949f2a433469e82" id="r_ga524c013ecdd8a45a2949f2a433469e82"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga524c013ecdd8a45a2949f2a433469e82">LWIP_SOCKET_EXTERNAL_HEADERS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ga524c013ecdd8a45a2949f2a433469e82"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga8b9369ab260f032686a81c77c5b4db77" id="r_ga8b9369ab260f032686a81c77c5b4db77"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77">LWIP_TCP_KEEPALIVE</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:ga8b9369ab260f032686a81c77c5b4db77"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga1162cb685f202d9b21c11344b8209a58" id="r_ga1162cb685f202d9b21c11344b8209a58"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58">LWIP_SO_SNDTIMEO</a>&#160;&#160;&#160;0</td></tr>
@@ -727,6 +733,8 @@
 <tr class="separator:ga97927ceecabcdb5f41735bf372a05cee"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gafaee522e7f32d81022215e1805e303a5" id="r_gafaee522e7f32d81022215e1805e303a5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5">AUTOIP_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
 <tr class="separator:gafaee522e7f32d81022215e1805e303a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga87ff0c6077b9a36b05c3fc5b8fae8ad3" id="r_ga87ff0c6077b9a36b05c3fc5b8fae8ad3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#ga87ff0c6077b9a36b05c3fc5b8fae8ad3">ACD_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
+<tr class="separator:ga87ff0c6077b9a36b05c3fc5b8fae8ad3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaba55da2352c99d813767913e5e36be1f" id="r_gaba55da2352c99d813767913e5e36be1f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f">DNS_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
 <tr class="separator:gaba55da2352c99d813767913e5e36be1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gac2f9726756b78d4d7c425b0422a776ce" id="r_gac2f9726756b78d4d7c425b0422a776ce"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce">IP6_DEBUG</a>&#160;&#160;&#160;<a class="el" href="group__debugging__levels.html#gadab1cdc3f45939a3a5c9a3d7e04987e1">LWIP_DBG_OFF</a></td></tr>
diff --git a/doc/doxygen/output/html/opt_8h.js b/doc/doxygen/output/html/opt_8h.js
index d7d45ae..f6983d3 100644
--- a/doc/doxygen/output/html/opt_8h.js
+++ b/doc/doxygen/output/html/opt_8h.js
@@ -1,5 +1,6 @@
 var opt_8h =
 [
+    [ "ACD_DEBUG", "group__lwip__opts__debugmsg.html#ga87ff0c6077b9a36b05c3fc5b8fae8ad3", null ],
     [ "API_LIB_DEBUG", "group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160", null ],
     [ "API_MSG_DEBUG", "group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697", null ],
     [ "ARP_MAXAGE", "group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432", null ],
@@ -26,7 +27,6 @@
     [ "DEFAULT_UDP_RECVMBOX_SIZE", "group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335", null ],
     [ "DHCP6_DEBUG", "group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1", null ],
     [ "DHCP_DEBUG", "group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee", null ],
-    [ "DHCP_DOES_ARP_CHECK", "group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69", null ],
     [ "DNS_DEBUG", "group__lwip__opts__debugmsg.html#gaba55da2352c99d813767913e5e36be1f", null ],
     [ "DNS_DOES_NAME_CHECK", "group__lwip__opts__dns.html#ga07ffd8e9106dae3b65347bd03811a4b6", null ],
     [ "DNS_LOCAL_HOSTLIST", "group__lwip__opts__dns.html#gacba1ac491c1b47b98dfbd0d5c1662659", null ],
@@ -67,6 +67,7 @@
     [ "IPFRAG_STATS", "group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f", null ],
     [ "IPV6_REASS_MAXAGE", "group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969", null ],
     [ "LINK_STATS", "group__lwip__opts__stats.html#gae58b452782d0327ae728192686c5a84a", null ],
+    [ "LWIP_ACD", "group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7", null ],
     [ "LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT", "group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2", null ],
     [ "LWIP_ALTCP", "group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77", null ],
     [ "LWIP_ALTCP_TLS", "group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8", null ],
@@ -86,6 +87,8 @@
     [ "LWIP_DHCP_AUTOIP_COOP", "group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe", null ],
     [ "LWIP_DHCP_AUTOIP_COOP_TRIES", "group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2", null ],
     [ "LWIP_DHCP_BOOTP_FILE", "group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423", null ],
+    [ "LWIP_DHCP_DISCOVER_ADD_HOSTNAME", "group__lwip__opts__dhcp.html#gad6b030f8e828666953661578f936e605", null ],
+    [ "LWIP_DHCP_DOES_ACD_CHECK", "group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55", null ],
     [ "LWIP_DHCP_GET_NTP_SRV", "group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83", null ],
     [ "LWIP_DHCP_MAX_DNS_SERVERS", "group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6", null ],
     [ "LWIP_DHCP_MAX_NTP_SERVERS", "group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2", null ],
@@ -142,7 +145,6 @@
     [ "LWIP_IPV6_SEND_ROUTER_SOLICIT", "group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c", null ],
     [ "LWIP_LOOPBACK_MAX_PBUFS", "group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea", null ],
     [ "LWIP_LOOPIF_MULTICAST", "group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300", null ],
-    [ "LWIP_MARK_TCPIP_THREAD", "group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e", null ],
     [ "LWIP_MIB2_CALLBACKS", "group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29", null ],
     [ "LWIP_MPU_COMPATIBLE", "group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9", null ],
     [ "LWIP_MULTICAST_PING", "group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661", null ],
@@ -190,6 +192,7 @@
     [ "LWIP_SO_SNDRCVTIMEO_NONSTANDARD", "group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942", null ],
     [ "LWIP_SO_SNDTIMEO", "group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58", null ],
     [ "LWIP_SOCKET", "group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f", null ],
+    [ "LWIP_SOCKET_EXTERNAL_HEADERS", "group__lwip__opts__socket.html#ga524c013ecdd8a45a2949f2a433469e82", null ],
     [ "LWIP_SOCKET_OFFSET", "group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e", null ],
     [ "LWIP_SOCKET_POLL", "group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200", null ],
     [ "LWIP_SOCKET_SELECT", "group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb", null ],
@@ -200,6 +203,7 @@
     [ "LWIP_TCP_KEEPALIVE", "group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77", null ],
     [ "LWIP_TCP_MAX_SACK_NUM", "group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc", null ],
     [ "LWIP_TCP_PCB_NUM_EXT_ARGS", "group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223", null ],
+    [ "LWIP_TCP_RTO_TIME", "group__lwip__opts__tcp.html#gade23373901980c6e7a43cef813386ebe", null ],
     [ "LWIP_TCP_SACK_OUT", "group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f", null ],
     [ "LWIP_TCP_TIMESTAMPS", "group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd", null ],
     [ "LWIP_TCPIP_CORE_LOCKING", "group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011", null ],
diff --git a/doc/doxygen/output/html/optimization.html b/doc/doxygen/output/html/optimization.html
index 4a7a5ea..507c1fc 100644
--- a/doc/doxygen/output/html/optimization.html
+++ b/doc/doxygen/output/html/optimization.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/pages.html b/doc/doxygen/output/html/pages.html
index c22c55d..2fec2cd 100644
--- a/doc/doxygen/output/html/pages.html
+++ b/doc/doxygen/output/html/pages.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -105,14 +105,15 @@
 <tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="upgrading.html" target="_self">Upgrading</a></td><td class="desc"></td></tr>
 <tr id="row_1_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="changelog.html" target="_self">Changelog</a></td><td class="desc"></td></tr>
 <tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="contrib.html" target="_self">How to contribute to lwIP</a></td><td class="desc"></td></tr>
-<tr id="row_3_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="pitfalls.html" target="_self">Common pitfalls</a></td><td class="desc"></td></tr>
-<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="mem_err.html" target="_self">Debugging memory pool sizes</a></td><td class="desc"></td></tr>
-<tr id="row_5_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="bugs.html" target="_self">Reporting bugs</a></td><td class="desc"></td></tr>
-<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="zerocopyrx.html" target="_self">Zero-copy RX</a></td><td class="desc"></td></tr>
-<tr id="row_7_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="sys_init.html" target="_self">System initalization</a></td><td class="desc"></td></tr>
-<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="multithreading.html" target="_self">Multithreading</a></td><td class="desc"></td></tr>
-<tr id="row_9_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="optimization.html" target="_self">Optimization hints</a></td><td class="desc"></td></tr>
-<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="deprecated.html" target="_self">Deprecated List</a></td><td class="desc"></td></tr>
+<tr id="row_3_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="cmake.html" target="_self">CMake build system</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="pitfalls.html" target="_self">Common pitfalls</a></td><td class="desc"></td></tr>
+<tr id="row_5_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="mem_err.html" target="_self">Debugging memory pool sizes</a></td><td class="desc"></td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="bugs.html" target="_self">Reporting bugs</a></td><td class="desc"></td></tr>
+<tr id="row_7_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="zerocopyrx.html" target="_self">Zero-copy RX</a></td><td class="desc"></td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="sys_init.html" target="_self">System initialization</a></td><td class="desc"></td></tr>
+<tr id="row_9_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="multithreading.html" target="_self">Multithreading</a></td><td class="desc"></td></tr>
+<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="optimization.html" target="_self">Optimization hints</a></td><td class="desc"></td></tr>
+<tr id="row_11_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="deprecated.html" target="_self">Deprecated List</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/doc/doxygen/output/html/pbuf_8c.html b/doc/doxygen/output/html/pbuf_8c.html
index 3ea2e58..8eccf40 100644
--- a/doc/doxygen/output/html/pbuf_8c.html
+++ b/doc/doxygen/output/html/pbuf_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/pbuf_8h.html b/doc/doxygen/output/html/pbuf_8h.html
index 81f1bf2..91d7bd7 100644
--- a/doc/doxygen/output/html/pbuf_8h.html
+++ b/doc/doxygen/output/html/pbuf_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/pitfalls.html b/doc/doxygen/output/html/pitfalls.html
index df677d9..444072a 100644
--- a/doc/doxygen/output/html/pitfalls.html
+++ b/doc/doxygen/output/html/pitfalls.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -105,13 +105,13 @@
 <p>lwIP can be used in two basic modes: <a class="el" href="group__lwip__nosys.html">Mainloop mode ("NO_SYS")</a> (no OS/RTOS running on target system) or <a class="el" href="group__lwip__os.html">OS mode (TCPIP thread)</a> (there is an OS running on the target system).</p>
 <p>See also: <a class="el" href="multithreading.html">Multithreading</a> (especially the part about <a class="el" href="group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75">LWIP_ASSERT_CORE_LOCKED()</a>!)</p>
 <h2>Mainloop Mode </h2>
-<p>In mainloop mode, only <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a> can be used. The user has two possibilities to ensure there is only one exection context at a time in lwIP:</p>
+<p>In mainloop mode, only <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a> can be used. The user has two possibilities to ensure there is only one execution context at a time in lwIP:</p>
 <p>1) Deliver RX ethernet packets directly in interrupt context to lwIP by calling netif-&gt;input directly in interrupt. This implies all lwIP callback functions are called in IRQ context, which may cause further problems in application code: IRQ is blocked for a long time, multiple execution contexts in application code etc. When the application wants to call lwIP, it only needs to disable interrupts during the call. If timers are involved, even more locking code is needed to lock out timer IRQ and ethernet IRQ from each other, assuming these may be nested.</p>
 <p>2) Run lwIP in a mainloop. There is example code here: <a class="el" href="group__lwip__nosys.html">Mainloop mode ("NO_SYS")</a>. lwIP is <em>ONLY</em> called from mainloop callstacks here. The ethernet IRQ has to put received telegrams into a queue which is polled in the mainloop. Ensure lwIP is <em>NEVER</em> called from an interrupt, e.g. some SPI IRQ wants to forward data to <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send()</a> or <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a>!</p>
 <h2>OS Mode </h2>
 <p>In OS mode, <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a> AND <a class="el" href="group__sequential__api.html">Sequential-style APIs</a> can be used. <a class="el" href="group__sequential__api.html">Sequential-style APIs</a> are designed to be called from threads other than the TCPIP thread, so there is nothing to consider here. But <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a> functions must <em>ONLY</em> be called from TCPIP thread. It is a common error to call these from other threads or from IRQ contexts. ​Ethernet RX needs to deliver incoming packets in the correct way by sending a message to TCPIP thread, this is implemented in <a class="el" href="group__lwip__os.html#gae510f195171bed8499ae94e264a92717">tcpip_input()</a>.​​ Again, ensure lwIP is <em>NEVER</em> called from an interrupt, e.g. some SPI IRQ wants to forward data to <a class="el" href="group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc">udp_send()</a> or <a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write()</a>!</p>
 <p>1) <a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback()</a> can be used get called back from TCPIP thread, it is safe to call any <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a> from there.</p>
-<p>2) Use <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a>. All <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a> functions can be called when lwIP core lock is aquired, see <a class="el" href="tcpip_8h.html#a4700525e737fc025fea4887b172e0c95">LOCK_TCPIP_CORE()</a> and <a class="el" href="tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d">UNLOCK_TCPIP_CORE()</a>. These macros cannot be used in an interrupt context! Note the OS must correctly handle priority inversion for this.</p>
+<p>2) Use <a class="el" href="group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011">LWIP_TCPIP_CORE_LOCKING</a>. All <a class="el" href="group__callbackstyle__api.html">"raw" APIs</a> functions can be called when lwIP core lock is acquired, see <a class="el" href="tcpip_8h.html#a4700525e737fc025fea4887b172e0c95">LOCK_TCPIP_CORE()</a> and <a class="el" href="tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d">UNLOCK_TCPIP_CORE()</a>. These macros cannot be used in an interrupt context! Note the OS must correctly handle priority inversion for this.</p>
 <h1>Cache / DMA issues </h1>
 <h2>DMA-capable ethernet hardware and zero-copy RX </h2>
 <p>lwIP changes the content of RECEIVED pbufs in the TCP code path. This implies one or more cacheline(s) of the RX pbuf become dirty and need to be flushed before the memory is handed over to the DMA ethernet hardware for the next telegram to be received. See <a href="http://lists.nongnu.org/archive/html/lwip-devel/2017-12/msg00070.html">http://lists.nongnu.org/archive/html/lwip-devel/2017-12/msg00070.html</a> for a more detailed explanation. Also keep in mind the user application may also write into pbufs, so it is generally a bug not to flush the data cache before handing a buffer to DMA hardware.</p>
diff --git a/doc/doxygen/output/html/pppapi_8c.html b/doc/doxygen/output/html/pppapi_8c.html
index 55b8c37..bbce23c 100644
--- a/doc/doxygen/output/html/pppapi_8c.html
+++ b/doc/doxygen/output/html/pppapi_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/pppol2tp_8c.html b/doc/doxygen/output/html/pppol2tp_8c.html
index 56707a0..c730503 100644
--- a/doc/doxygen/output/html/pppol2tp_8c.html
+++ b/doc/doxygen/output/html/pppol2tp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/pppol2tp_8h.html b/doc/doxygen/output/html/pppol2tp_8h.html
index 9907b8a..c70a10d 100644
--- a/doc/doxygen/output/html/pppol2tp_8h.html
+++ b/doc/doxygen/output/html/pppol2tp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/pppos_8c.html b/doc/doxygen/output/html/pppos_8c.html
index 424b58e..8ad5b4a 100644
--- a/doc/doxygen/output/html/pppos_8c.html
+++ b/doc/doxygen/output/html/pppos_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/pppos_8h.html b/doc/doxygen/output/html/pppos_8h.html
index e5ea4b3..dea6def 100644
--- a/doc/doxygen/output/html/pppos_8h.html
+++ b/doc/doxygen/output/html/pppos_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2acd_8h.html b/doc/doxygen/output/html/prot_2acd_8h.html
new file mode 100644
index 0000000..e1d3247
--- /dev/null
+++ b/doc/doxygen/output/html/prot_2acd_8h.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: src/include/lwip/prot/acd.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('prot_2acd_8h.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="headertitle"><div class="title">acd.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>ACD protocol definitions </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li><li class="navelem"><a class="el" href="dir_4e6b3cf33a61b6caac9c8ac30c866f37.html">lwip</a></li><li class="navelem"><a class="el" href="dir_fa0f2b7ac208069fc8d28c28af349d8d.html">prot</a></li><li class="navelem"><a class="el" href="prot_2acd_8h.html">acd.h</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/prot_2autoip_8h.html b/doc/doxygen/output/html/prot_2autoip_8h.html
index fc748bf..d032e0a 100644
--- a/doc/doxygen/output/html/prot_2autoip_8h.html
+++ b/doc/doxygen/output/html/prot_2autoip_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2dhcp6_8h.html b/doc/doxygen/output/html/prot_2dhcp6_8h.html
index 7bb9083..b4818de 100644
--- a/doc/doxygen/output/html/prot_2dhcp6_8h.html
+++ b/doc/doxygen/output/html/prot_2dhcp6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2dhcp_8h.html b/doc/doxygen/output/html/prot_2dhcp_8h.html
index 79da576..f602667 100644
--- a/doc/doxygen/output/html/prot_2dhcp_8h.html
+++ b/doc/doxygen/output/html/prot_2dhcp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2dns_8h.html b/doc/doxygen/output/html/prot_2dns_8h.html
index e940f72..3761a3e 100644
--- a/doc/doxygen/output/html/prot_2dns_8h.html
+++ b/doc/doxygen/output/html/prot_2dns_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2icmp6_8h.html b/doc/doxygen/output/html/prot_2icmp6_8h.html
index 8b41b48..5b9a1e4 100644
--- a/doc/doxygen/output/html/prot_2icmp6_8h.html
+++ b/doc/doxygen/output/html/prot_2icmp6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2icmp_8h.html b/doc/doxygen/output/html/prot_2icmp_8h.html
index e03d105..b524231 100644
--- a/doc/doxygen/output/html/prot_2icmp_8h.html
+++ b/doc/doxygen/output/html/prot_2icmp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -108,6 +108,8 @@
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
 Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structicmp__hdr.html">icmp_hdr</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structicmp__echo__hdr.html">icmp_echo_hdr</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
diff --git a/doc/doxygen/output/html/prot_2icmp_8h.js b/doc/doxygen/output/html/prot_2icmp_8h.js
index 808f385..7bf14d8 100644
--- a/doc/doxygen/output/html/prot_2icmp_8h.js
+++ b/doc/doxygen/output/html/prot_2icmp_8h.js
@@ -1,4 +1,5 @@
 var prot_2icmp_8h =
 [
+    [ "icmp_hdr", "structicmp__hdr.html", null ],
     [ "icmp_echo_hdr", "structicmp__echo__hdr.html", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/prot_2igmp_8h.html b/doc/doxygen/output/html/prot_2igmp_8h.html
index 74534d0..102461f 100644
--- a/doc/doxygen/output/html/prot_2igmp_8h.html
+++ b/doc/doxygen/output/html/prot_2igmp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2ip4_8h.html b/doc/doxygen/output/html/prot_2ip4_8h.html
index 7f582a4..d837e48 100644
--- a/doc/doxygen/output/html/prot_2ip4_8h.html
+++ b/doc/doxygen/output/html/prot_2ip4_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2ip6_8h.html b/doc/doxygen/output/html/prot_2ip6_8h.html
index 03d2a06..303b587 100644
--- a/doc/doxygen/output/html/prot_2ip6_8h.html
+++ b/doc/doxygen/output/html/prot_2ip6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2ip_8h.html b/doc/doxygen/output/html/prot_2ip_8h.html
index 1cccd18..e510be7 100644
--- a/doc/doxygen/output/html/prot_2ip_8h.html
+++ b/doc/doxygen/output/html/prot_2ip_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2mld6_8h.html b/doc/doxygen/output/html/prot_2mld6_8h.html
index e78751b..c0800de 100644
--- a/doc/doxygen/output/html/prot_2mld6_8h.html
+++ b/doc/doxygen/output/html/prot_2mld6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2nd6_8h.html b/doc/doxygen/output/html/prot_2nd6_8h.html
index 1d60ca9..aae6363 100644
--- a/doc/doxygen/output/html/prot_2nd6_8h.html
+++ b/doc/doxygen/output/html/prot_2nd6_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2tcp_8h.html b/doc/doxygen/output/html/prot_2tcp_8h.html
index a07b1dd..6b21db7 100644
--- a/doc/doxygen/output/html/prot_2tcp_8h.html
+++ b/doc/doxygen/output/html/prot_2tcp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/prot_2udp_8h.html b/doc/doxygen/output/html/prot_2udp_8h.html
index 40158e9..53d24d5 100644
--- a/doc/doxygen/output/html/prot_2udp_8h.html
+++ b/doc/doxygen/output/html/prot_2udp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/raw_8c.html b/doc/doxygen/output/html/raw_8c.html
index 382617b..28966ba 100644
--- a/doc/doxygen/output/html/raw_8c.html
+++ b/doc/doxygen/output/html/raw_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -146,7 +146,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Implementation of raw protocol PCBs for low-level handling of different types of protocols besides (or overriding) those already available in lwIP.<br  />
-See also <a class="el" href="group__raw__raw.html">RAW</a> </p>
+ See also <a class="el" href="group__raw__raw.html">RAW</a> </p>
 </div><h2 class="groupheader">Function Documentation</h2>
 <a id="a03c4582d9ecf687e1f31d597c7889553" name="a03c4582d9ecf687e1f31d597c7889553"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a03c4582d9ecf687e1f31d597c7889553">&#9670;&#160;</a></span>raw_input()</h2>
diff --git a/doc/doxygen/output/html/raw_8h.html b/doc/doxygen/output/html/raw_8h.html
index 66bac26..663ff2b 100644
--- a/doc/doxygen/output/html/raw_8h.html
+++ b/doc/doxygen/output/html/raw_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -148,7 +148,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>raw API (to be used from TCPIP thread)<br  />
-See also <a class="el" href="group__raw__raw.html">RAW</a> </p>
+ See also <a class="el" href="group__raw__raw.html">RAW</a> </p>
 </div><h2 class="groupheader">Typedef Documentation</h2>
 <a id="a17edd059f34f45a770fe2fa458ecf4dd" name="a17edd059f34f45a770fe2fa458ecf4dd"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a17edd059f34f45a770fe2fa458ecf4dd">&#9670;&#160;</a></span>raw_recv_fn</h2>
diff --git a/doc/doxygen/output/html/raw__priv_8h.html b/doc/doxygen/output/html/raw__priv_8h.html
index 3b0328d..2b72bf2 100644
--- a/doc/doxygen/output/html/raw__priv_8h.html
+++ b/doc/doxygen/output/html/raw__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/search/all_10.js b/doc/doxygen/output/html/search/all_10.js
index 013e5fe..fd72dc1 100644
--- a/doc/doxygen/output/html/search/all_10.js
+++ b/doc/doxygen/output/html/search/all_10.js
@@ -14,191 +14,240 @@
   ['mdns_11',['MDNS',['../group__mdns.html',1,'']]],
   ['mdns_2ec_12',['mdns.c',['../mdns_8c.html',1,'']]],
   ['mdns_2eh_13',['mdns.h',['../mdns_8h.html',1,'']]],
-  ['mdns_5fcompress_5fdomain_14',['mdns_compress_domain',['../mdns_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e',1,'mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain):&#160;mdns.c'],['../mdns__priv_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e',1,'mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain):&#160;mdns.c']]],
-  ['mdns_5fdebug_15',['MDNS_DEBUG',['../group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9',1,'mdns_opts.h']]],
-  ['mdns_5fdomain_5fadd_5flabel_16',['mdns_domain_add_label',['../mdns_8c.html#a17db69fa887515374452b945e959bbf9',1,'mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len):&#160;mdns.c'],['../mdns__priv_8h.html#a17db69fa887515374452b945e959bbf9',1,'mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len):&#160;mdns.c']]],
-  ['mdns_5fdomain_5feq_17',['mdns_domain_eq',['../mdns_8c.html#a52d8f70432ae998814f16b18431213cd',1,'mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b):&#160;mdns.c'],['../mdns__priv_8h.html#a52d8f70432ae998814f16b18431213cd',1,'mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b):&#160;mdns.c']]],
-  ['mdns_5fhost_18',['mdns_host',['../structmdns__host.html',1,'']]],
-  ['mdns_5fmax_5fservices_19',['MDNS_MAX_SERVICES',['../group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6',1,'mdns_opts.h']]],
-  ['mdns_5fname_5fresult_5fcb_5ft_20',['mdns_name_result_cb_t',['../mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536',1,'mdns.h']]],
-  ['mdns_5fopts_2eh_21',['mdns_opts.h',['../mdns__opts_8h.html',1,'']]],
-  ['mdns_5foutpacket_22',['mdns_outpacket',['../structmdns__outpacket.html',1,'']]],
-  ['mdns_5fpacket_23',['mdns_packet',['../structmdns__packet.html',1,'']]],
-  ['mdns_5fpriv_2eh_24',['mdns_priv.h',['../mdns__priv_8h.html',1,'']]],
-  ['mdns_5freadname_25',['mdns_readname',['../mdns_8c.html#ab5f49d9356a76879e0e6a14eb0643b23',1,'mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain):&#160;mdns.c'],['../mdns__priv_8h.html#ab5f49d9356a76879e0e6a14eb0643b23',1,'mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain):&#160;mdns.c']]],
-  ['mdns_5fresp_5fadd_5fnetif_26',['mdns_resp_add_netif',['../group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb',1,'mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl):&#160;mdns.c'],['../group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb',1,'mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl):&#160;mdns.c']]],
-  ['mdns_5fresp_5fadd_5fservice_27',['mdns_resp_add_service',['../group__mdns.html#ga824e992e94be216c8e059f48f49a59ce',1,'mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_data):&#160;mdns.c'],['../group__mdns.html#ga824e992e94be216c8e059f48f49a59ce',1,'mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_userdata):&#160;mdns.c']]],
-  ['mdns_5fresp_5fadd_5fservice_5ftxtitem_28',['mdns_resp_add_service_txtitem',['../group__mdns.html#ga01c85202f4b85edc8b571f2f419db576',1,'mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len):&#160;mdns.c'],['../group__mdns.html#ga01c85202f4b85edc8b571f2f419db576',1,'mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len):&#160;mdns.c']]],
-  ['mdns_5fresp_5fannounce_29',['mdns_resp_announce',['../group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85',1,'mdns_resp_announce(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85',1,'mdns_resp_announce(struct netif *netif):&#160;mdns.c']]],
-  ['mdns_5fresp_5fdel_5fservice_30',['mdns_resp_del_service',['../group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad',1,'mdns_resp_del_service(struct netif *netif, s8_t slot):&#160;mdns.c'],['../group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad',1,'mdns_resp_del_service(struct netif *netif, s8_t slot):&#160;mdns.c']]],
-  ['mdns_5fresp_5finit_31',['mdns_resp_init',['../group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3',1,'mdns_resp_init(void):&#160;mdns.c'],['../group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3',1,'mdns_resp_init(void):&#160;mdns.c']]],
-  ['mdns_5fresp_5fnetif_5fsettings_5fchanged_32',['mdns_resp_netif_settings_changed',['../group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec',1,'mdns.h']]],
-  ['mdns_5fresp_5fregister_5fname_5fresult_5fcb_33',['mdns_resp_register_name_result_cb',['../mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1',1,'mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb):&#160;mdns.c'],['../mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1',1,'mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb):&#160;mdns.c']]],
-  ['mdns_5fresp_5fremove_5fnetif_34',['mdns_resp_remove_netif',['../group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c',1,'mdns_resp_remove_netif(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c',1,'mdns_resp_remove_netif(struct netif *netif):&#160;mdns.c']]],
-  ['mdns_5fresp_5frename_5fnetif_35',['mdns_resp_rename_netif',['../group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e',1,'mdns_resp_rename_netif(struct netif *netif, const char *hostname):&#160;mdns.c'],['../group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e',1,'mdns_resp_rename_netif(struct netif *netif, const char *hostname):&#160;mdns.c']]],
-  ['mdns_5fresp_5frename_5fservice_36',['mdns_resp_rename_service',['../group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9',1,'mdns_resp_rename_service(struct netif *netif, s8_t slot, const char *name):&#160;mdns.c'],['../group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9',1,'mdns_resp_rename_service(struct netif *netif, s8_t slot, const char *name):&#160;mdns.c']]],
-  ['mdns_5fresp_5frestart_37',['mdns_resp_restart',['../group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a',1,'mdns_resp_restart(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a',1,'mdns_resp_restart(struct netif *netif):&#160;mdns.c']]],
-  ['mdns_5fresp_5fusenetif_5fextcallback_38',['MDNS_RESP_USENETIF_EXTCALLBACK',['../group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396',1,'mdns_opts.h']]],
-  ['mdns_5frr_5finfo_39',['mdns_rr_info',['../structmdns__rr__info.html',1,'']]],
-  ['mdns_5fservice_40',['mdns_service',['../structmdns__service.html',1,'']]],
-  ['measurement_41',['Performance measurement',['../group__perf.html',1,'']]],
-  ['mem_42',['mem',['../structmem.html',1,'mem'],['../structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c',1,'stats_::mem']]],
-  ['mem_2ec_43',['mem.c',['../mem_8c.html',1,'']]],
-  ['mem_2eh_44',['mem.h',['../mem_8h.html',1,'']]],
-  ['mem_5falignment_45',['MEM_ALIGNMENT',['../group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7',1,'opt.h']]],
-  ['mem_5fcalloc_46',['mem_calloc',['../mem_8c.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c'],['../mem_8h.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c']]],
-  ['mem_5fdebug_47',['MEM_DEBUG',['../group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe',1,'opt.h']]],
-  ['mem_5ffree_48',['mem_free',['../mem_8c.html#a65169147c44e9db60d997819af9b455c',1,'mem_free(void *rmem):&#160;mem.c'],['../mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a',1,'mem_free(void *mem):&#160;mem.c']]],
-  ['mem_5ffree_5fcallback_49',['mem_free_callback',['../tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c',1,'mem_free_callback(void *m):&#160;tcpip.c'],['../tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c',1,'mem_free_callback(void *m):&#160;tcpip.c']]],
-  ['mem_5finit_50',['mem_init',['../mem_8c.html#a44a136e3b70c36abb6f8dc060c778113',1,'mem_init(void):&#160;mem.c'],['../mem_8h.html#a44a136e3b70c36abb6f8dc060c778113',1,'mem_init(void):&#160;mem.c']]],
-  ['mem_5flibc_5fmalloc_51',['MEM_LIBC_MALLOC',['../group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8',1,'opt.h']]],
-  ['mem_5fmalloc_52',['mem_malloc',['../mem_8c.html#ae2190f95ae9c46bb99ec0be4f4e4e5e4',1,'mem_malloc(mem_size_t size_in):&#160;mem.c'],['../mem_8h.html#a52ce222aebe4b7dce7f25cd536b6e650',1,'mem_malloc(mem_size_t size):&#160;mem.c']]],
-  ['mem_5foverflow_5fcheck_53',['MEM_OVERFLOW_CHECK',['../group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e',1,'opt.h']]],
-  ['mem_5fpriv_2eh_54',['mem_priv.h',['../mem__priv_8h.html',1,'']]],
-  ['mem_5fsanity_5fcheck_55',['MEM_SANITY_CHECK',['../group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3',1,'opt.h']]],
-  ['mem_5fsize_56',['MEM_SIZE',['../group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c',1,'opt.h']]],
-  ['mem_5fstats_57',['MEM_STATS',['../group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7',1,'opt.h']]],
-  ['mem_5ftrim_58',['mem_trim',['../mem_8c.html#ab0915b39bd096766771ef4cf719bfb40',1,'mem_trim(void *rmem, mem_size_t new_size):&#160;mem.c'],['../mem_8h.html#a2ba2d1e6fc284b1850eedb673eba96b0',1,'mem_trim(void *mem, mem_size_t size):&#160;mem.c']]],
-  ['mem_5fuse_5fpools_59',['MEM_USE_POOLS',['../group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba',1,'opt.h']]],
-  ['mem_5fuse_5fpools_5ftry_5fbigger_5fpool_60',['MEM_USE_POOLS_TRY_BIGGER_POOL',['../group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82',1,'opt.h']]],
-  ['memcpy_61',['MEMCPY',['../group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6',1,'opt.h']]],
-  ['memcpy_62',['memcpy',['../group__lwip__opts__memcpy.html',1,'']]],
-  ['memmove_63',['MEMMOVE',['../group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863',1,'opt.h']]],
-  ['memory_20pool_20sizes_64',['Debugging memory pool sizes',['../mem_err.html',1,'']]],
-  ['memory_20pools_65',['Memory pools',['../group__mempool.html',1,'']]],
-  ['memory_20pools_66',['memory pools',['../group__lwip__opts__mem.html',1,'Heap and memory pools'],['../group__lwip__opts__memp.html',1,'Internal memory pools']]],
-  ['memp_67',['memp',['../structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc',1,'stats_']]],
-  ['memp_2ec_68',['memp.c',['../memp_8c.html',1,'']]],
-  ['memp_2eh_69',['memp.h',['../memp_8h.html',1,'']]],
-  ['memp_5fdebug_70',['MEMP_DEBUG',['../group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616',1,'opt.h']]],
-  ['memp_5fdesc_71',['memp_desc',['../structmemp__desc.html',1,'']]],
-  ['memp_5ffree_72',['memp_free',['../memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f',1,'memp_free(memp_t type, void *mem):&#160;memp.c'],['../memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f',1,'memp_free(memp_t type, void *mem):&#160;memp.c']]],
-  ['memp_5ffree_5fpool_73',['memp_free_pool',['../memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5',1,'memp_free_pool(const struct memp_desc *desc, void *mem):&#160;memp.c'],['../memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5',1,'memp_free_pool(const struct memp_desc *desc, void *mem):&#160;memp.c']]],
-  ['memp_5finit_74',['memp_init',['../memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2',1,'memp_init(void):&#160;memp.c'],['../memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2',1,'memp_init(void):&#160;memp.c']]],
-  ['memp_5finit_5fpool_75',['memp_init_pool',['../memp_8c.html#a6416303426d05526bed33f241fa6ecd7',1,'memp_init_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7',1,'memp_init_pool(const struct memp_desc *desc):&#160;memp.c']]],
-  ['memp_5fmalloc_76',['memp_malloc',['../memp_8c.html#ac49689457203bfb872adf5428f96a3e7',1,'memp_malloc(memp_t type):&#160;memp.c'],['../memp_8h.html#ac49689457203bfb872adf5428f96a3e7',1,'memp_malloc(memp_t type):&#160;memp.c']]],
-  ['memp_5fmalloc_5fpool_77',['memp_malloc_pool',['../memp_8c.html#ab6bfb9562c3a77e329a888e59ef0ace3',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#ab6bfb9562c3a77e329a888e59ef0ace3',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c']]],
-  ['memp_5fmem_5finit_78',['MEMP_MEM_INIT',['../group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0',1,'opt.h']]],
-  ['memp_5fmem_5fmalloc_79',['MEMP_MEM_MALLOC',['../group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38',1,'opt.h']]],
-  ['memp_5fnum_5faltcp_5fpcb_80',['MEMP_NUM_ALTCP_PCB',['../group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd',1,'opt.h']]],
-  ['memp_5fnum_5fapi_5fmsg_81',['MEMP_NUM_API_MSG',['../group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444',1,'opt.h']]],
-  ['memp_5fnum_5farp_5fqueue_82',['MEMP_NUM_ARP_QUEUE',['../group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7',1,'opt.h']]],
-  ['memp_5fnum_5fdns_5fapi_5fmsg_83',['MEMP_NUM_DNS_API_MSG',['../group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980',1,'opt.h']]],
-  ['memp_5fnum_5ffrag_5fpbuf_84',['MEMP_NUM_FRAG_PBUF',['../group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630',1,'opt.h']]],
-  ['memp_5fnum_5figmp_5fgroup_85',['MEMP_NUM_IGMP_GROUP',['../group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a',1,'opt.h']]],
-  ['memp_5fnum_5flocalhostlist_86',['MEMP_NUM_LOCALHOSTLIST',['../group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0',1,'opt.h']]],
-  ['memp_5fnum_5fmld6_5fgroup_87',['MEMP_NUM_MLD6_GROUP',['../group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494',1,'opt.h']]],
-  ['memp_5fnum_5fnd6_5fqueue_88',['MEMP_NUM_ND6_QUEUE',['../group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2',1,'opt.h']]],
-  ['memp_5fnum_5fnetbuf_89',['MEMP_NUM_NETBUF',['../group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be',1,'opt.h']]],
-  ['memp_5fnum_5fnetconn_90',['MEMP_NUM_NETCONN',['../group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456',1,'opt.h']]],
-  ['memp_5fnum_5fnetdb_91',['MEMP_NUM_NETDB',['../group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a',1,'opt.h']]],
-  ['memp_5fnum_5fnetifapi_5fmsg_92',['MEMP_NUM_NETIFAPI_MSG',['../group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c',1,'opt.h']]],
-  ['memp_5fnum_5fpbuf_93',['MEMP_NUM_PBUF',['../group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418',1,'opt.h']]],
-  ['memp_5fnum_5fraw_5fpcb_94',['MEMP_NUM_RAW_PCB',['../group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3',1,'opt.h']]],
-  ['memp_5fnum_5freassdata_95',['MEMP_NUM_REASSDATA',['../group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86',1,'opt.h']]],
-  ['memp_5fnum_5fselect_5fcb_96',['MEMP_NUM_SELECT_CB',['../group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893',1,'opt.h']]],
-  ['memp_5fnum_5fsocket_5fsetgetsockopt_5fdata_97',['MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA',['../group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948',1,'opt.h']]],
-  ['memp_5fnum_5fsys_5ftimeout_98',['MEMP_NUM_SYS_TIMEOUT',['../group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e',1,'opt.h']]],
-  ['memp_5fnum_5ftcp_5fpcb_99',['MEMP_NUM_TCP_PCB',['../group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e',1,'opt.h']]],
-  ['memp_5fnum_5ftcp_5fpcb_5flisten_100',['MEMP_NUM_TCP_PCB_LISTEN',['../group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a',1,'opt.h']]],
-  ['memp_5fnum_5ftcp_5fseg_101',['MEMP_NUM_TCP_SEG',['../group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3',1,'opt.h']]],
-  ['memp_5fnum_5ftcpip_5fmsg_5fapi_102',['MEMP_NUM_TCPIP_MSG_API',['../group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c',1,'opt.h']]],
-  ['memp_5fnum_5ftcpip_5fmsg_5finpkt_103',['MEMP_NUM_TCPIP_MSG_INPKT',['../group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831',1,'opt.h']]],
-  ['memp_5fnum_5fudp_5fpcb_104',['MEMP_NUM_UDP_PCB',['../group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb',1,'opt.h']]],
-  ['memp_5foverflow_5fcheck_105',['MEMP_OVERFLOW_CHECK',['../group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3',1,'opt.h']]],
-  ['memp_5fpriv_2eh_106',['memp_priv.h',['../memp__priv_8h.html',1,'']]],
-  ['memp_5fsanity_5fcheck_107',['MEMP_SANITY_CHECK',['../group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff',1,'opt.h']]],
-  ['memp_5fstats_108',['MEMP_STATS',['../group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041',1,'opt.h']]],
-  ['memp_5fstd_2eh_109',['memp_std.h',['../memp__std_8h.html',1,'']]],
-  ['memp_5ft_110',['memp_t',['../memp_8h.html#a85a164b1f7764951cc685ea525114e57',1,'memp.h']]],
-  ['memp_5fuse_5fcustom_5fpools_111',['MEMP_USE_CUSTOM_POOLS',['../group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b',1,'opt.h']]],
-  ['messages_112',['Debug messages',['../group__lwip__opts__debugmsg.html',1,'']]],
-  ['mib2_113',['MIB2',['../group__snmp__mib2.html',1,'']]],
-  ['mib2_114',['mib2',['../structstats__.html#ac001c065c56c26c3952b19b9ce0d5832',1,'stats_']]],
-  ['mib2_20callbacks_115',['SNMP MIB2 callbacks',['../group__lwip__opts__mib2.html',1,'']]],
-  ['mib2_20statistics_116',['MIB2 statistics',['../group__netif__mib2.html',1,'']]],
-  ['mib2_5fcopy_5fsysuptime_5fto_117',['MIB2_COPY_SYSUPTIME_TO',['../snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c',1,'snmp.h']]],
-  ['mib2_5fcounters_118',['mib2_counters',['../structnetif.html#ab32cbe1851154fd020bac4be558f5fd5',1,'netif']]],
-  ['mib2_5finit_5fnetif_119',['MIB2_INIT_NETIF',['../group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0',1,'snmp.h']]],
-  ['mib2_5fstats_120',['MIB2_STATS',['../group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f',1,'opt.h']]],
-  ['mib2_5fstats_5fnetif_5fadd_121',['MIB2_STATS_NETIF_ADD',['../group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed',1,'snmp.h']]],
-  ['mib2_5fstats_5fnetif_5finc_122',['MIB2_STATS_NETIF_INC',['../group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f',1,'snmp.h']]],
-  ['min_5freq_5flen_123',['MIN_REQ_LEN',['../httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a',1,'httpd.c']]],
-  ['min_5fsize_124',['MIN_SIZE',['../mem_8c.html#a278694c2333c9826f21ddd2c2d220f66',1,'mem.c']]],
-  ['misc_125',['Misc',['../group__sys__misc.html',1,'']]],
-  ['mld6_126',['MLD6',['../group__mld6.html',1,'']]],
-  ['mld6_127',['mld6',['../structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8',1,'stats_']]],
-  ['mld6_2ec_128',['mld6.c',['../mld6_8c.html',1,'']]],
-  ['mld6_2eh_129',['mld6.h',['../mld6_8h.html',1,'(Global Namespace)'],['../prot_2mld6_8h.html',1,'(Global Namespace)']]],
-  ['mld6_5finput_130',['mld6_input',['../mld6_8c.html#a7c190ca25432d466b28f607c3574a841',1,'mld6_input(struct pbuf *p, struct netif *inp):&#160;mld6.c'],['../mld6_8h.html#a7c190ca25432d466b28f607c3574a841',1,'mld6_input(struct pbuf *p, struct netif *inp):&#160;mld6.c']]],
-  ['mld6_5fjoingroup_131',['mld6_joingroup',['../group__mld6.html#ga53560ab6e47163e4888070830bf912a8',1,'mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga53560ab6e47163e4888070830bf912a8',1,'mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
-  ['mld6_5fjoingroup_5fnetif_132',['mld6_joingroup_netif',['../group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940',1,'mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940',1,'mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
-  ['mld6_5fleavegroup_133',['mld6_leavegroup',['../group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5',1,'mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5',1,'mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
-  ['mld6_5fleavegroup_5fnetif_134',['mld6_leavegroup_netif',['../group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22',1,'mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22',1,'mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
-  ['mld6_5flookfor_5fgroup_135',['mld6_lookfor_group',['../mld6_8c.html#a496197eef3f8b4c2a0fd49734aee07d6',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c'],['../mld6_8h.html#a496197eef3f8b4c2a0fd49734aee07d6',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c']]],
-  ['mld6_5freport_5fgroups_136',['mld6_report_groups',['../mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686',1,'mld6_report_groups(struct netif *netif):&#160;mld6.c'],['../mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686',1,'mld6_report_groups(struct netif *netif):&#160;mld6.c']]],
-  ['mld6_5fstats_137',['MLD6_STATS',['../group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e',1,'opt.h']]],
-  ['mld6_5fstop_138',['mld6_stop',['../mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198',1,'mld6_stop(struct netif *netif):&#160;mld6.c'],['../mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198',1,'mld6_stop(struct netif *netif):&#160;mld6.c']]],
-  ['mld6_5ftmr_139',['mld6_tmr',['../mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274',1,'mld6_tmr(void):&#160;mld6.c'],['../mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274',1,'mld6_tmr(void):&#160;mld6.c']]],
-  ['mld_5fgroup_140',['mld_group',['../structmld__group.html',1,'']]],
-  ['mld_5fheader_141',['mld_header',['../structmld__header.html',1,'']]],
-  ['mld_5fmac_5ffilter_142',['mld_mac_filter',['../structnetif.html#abc67963ff9f574e98ef9c50138a3e470',1,'netif']]],
-  ['mode_20no_5fsys_143',['Mainloop mode (&quot;NO_SYS&quot;)',['../group__lwip__nosys.html',1,'']]],
-  ['mode_20tcpip_20thread_144',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
-  ['mpu_145',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
-  ['mqtt_20client_146',['MQTT client',['../group__mqtt.html',1,'']]],
-  ['mqtt_2ec_147',['mqtt.c',['../mqtt_8c.html',1,'']]],
-  ['mqtt_2eh_148',['mqtt.h',['../mqtt_8h.html',1,'']]],
-  ['mqtt_5fclient_5fconnect_149',['mqtt_client_connect',['../group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0',1,'mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, mqtt_connection_cb_t cb, void *arg, const struct mqtt_connect_client_info_t *client_info):&#160;mqtt.c'],['../group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0',1,'mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ipaddr, u16_t port, mqtt_connection_cb_t cb, void *arg, const struct mqtt_connect_client_info_t *client_info):&#160;mqtt.c']]],
-  ['mqtt_5fclient_5ffree_150',['mqtt_client_free',['../group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882',1,'mqtt_client_free(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882',1,'mqtt_client_free(mqtt_client_t *client):&#160;mqtt.c']]],
-  ['mqtt_5fclient_5fis_5fconnected_151',['mqtt_client_is_connected',['../group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5',1,'mqtt_client_is_connected(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5',1,'mqtt_client_is_connected(mqtt_client_t *client):&#160;mqtt.c']]],
-  ['mqtt_5fclient_5fnew_152',['mqtt_client_new',['../group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7',1,'mqtt_client_new(void):&#160;mqtt.c'],['../group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7',1,'mqtt_client_new(void):&#160;mqtt.c']]],
-  ['mqtt_5fclient_5fs_153',['mqtt_client_s',['../structmqtt__client__s.html',1,'']]],
-  ['mqtt_5fconnect_5faccepted_154',['MQTT_CONNECT_ACCEPTED',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1',1,'mqtt.h']]],
-  ['mqtt_5fconnect_5fclient_5finfo_5ft_155',['mqtt_connect_client_info_t',['../structmqtt__connect__client__info__t.html',1,'']]],
-  ['mqtt_5fconnect_5fdisconnected_156',['MQTT_CONNECT_DISCONNECTED',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd',1,'mqtt.h']]],
-  ['mqtt_5fconnect_5fflag_157',['mqtt_connect_flag',['../mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12',1,'mqtt.c']]],
-  ['mqtt_5fconnect_5frefused_5fidentifier_158',['MQTT_CONNECT_REFUSED_IDENTIFIER',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a',1,'mqtt.h']]],
-  ['mqtt_5fconnect_5frefused_5fnot_5fauthorized_5f_159',['MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17',1,'mqtt.h']]],
-  ['mqtt_5fconnect_5frefused_5fprotocol_5fversion_160',['MQTT_CONNECT_REFUSED_PROTOCOL_VERSION',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190',1,'mqtt.h']]],
-  ['mqtt_5fconnect_5frefused_5fserver_161',['MQTT_CONNECT_REFUSED_SERVER',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a',1,'mqtt.h']]],
-  ['mqtt_5fconnect_5frefused_5fusername_5fpass_162',['MQTT_CONNECT_REFUSED_USERNAME_PASS',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a',1,'mqtt.h']]],
-  ['mqtt_5fconnect_5ftimeout_163',['MQTT_CONNECT_TIMEOUT',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62',1,'mqtt.h']]],
-  ['mqtt_5fconnect_5ftimout_164',['MQTT_CONNECT_TIMOUT',['../group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b',1,'mqtt_opts.h']]],
-  ['mqtt_5fconnection_5fcb_5ft_165',['mqtt_connection_cb_t',['../group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f',1,'mqtt.h']]],
-  ['mqtt_5fconnection_5fstatus_5ft_166',['mqtt_connection_status_t',['../group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d',1,'mqtt.h']]],
-  ['mqtt_5fctl_5fpacket_5ftype_167',['MQTT_CTL_PACKET_TYPE',['../mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b',1,'mqtt.c']]],
-  ['mqtt_5fcyclic_5ftimer_5finterval_168',['MQTT_CYCLIC_TIMER_INTERVAL',['../group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e',1,'mqtt_opts.h']]],
-  ['mqtt_5fdata_5fflag_5flast_169',['MQTT_DATA_FLAG_LAST',['../group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f',1,'mqtt.h']]],
-  ['mqtt_5fdebug_170',['MQTT_DEBUG',['../mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d',1,'mqtt.c']]],
-  ['mqtt_5fdisconnect_171',['mqtt_disconnect',['../group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6',1,'mqtt_disconnect(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6',1,'mqtt_disconnect(mqtt_client_t *client):&#160;mqtt.c']]],
-  ['mqtt_5fincoming_5fdata_5fcb_5ft_172',['mqtt_incoming_data_cb_t',['../group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81',1,'mqtt.h']]],
-  ['mqtt_5fincoming_5fpublish_5fcb_5ft_173',['mqtt_incoming_publish_cb_t',['../group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29',1,'mqtt.h']]],
-  ['mqtt_5fmessage_5ftype_174',['mqtt_message_type',['../mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1',1,'mqtt.c']]],
-  ['mqtt_5fopts_2eh_175',['mqtt_opts.h',['../mqtt__opts_8h.html',1,'']]],
-  ['mqtt_5foutput_5fringbuf_5fsize_176',['MQTT_OUTPUT_RINGBUF_SIZE',['../group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b',1,'mqtt_opts.h']]],
-  ['mqtt_5fport_177',['MQTT_PORT',['../group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd',1,'mqtt.h']]],
-  ['mqtt_5fpriv_2eh_178',['mqtt_priv.h',['../mqtt__priv_8h.html',1,'']]],
-  ['mqtt_5fpublish_179',['mqtt_publish',['../group__mqtt.html#gade9850d716e81fde572cb012be795d2f',1,'mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, mqtt_request_cb_t cb, void *arg):&#160;mqtt.c'],['../group__mqtt.html#gade9850d716e81fde572cb012be795d2f',1,'mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, mqtt_request_cb_t cb, void *arg):&#160;mqtt.c']]],
-  ['mqtt_5freq_5fmax_5fin_5fflight_180',['MQTT_REQ_MAX_IN_FLIGHT',['../group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f',1,'mqtt_opts.h']]],
-  ['mqtt_5freq_5ftimeout_181',['MQTT_REQ_TIMEOUT',['../group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a',1,'mqtt_opts.h']]],
-  ['mqtt_5frequest_5fcb_5ft_182',['mqtt_request_cb_t',['../group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd',1,'mqtt.h']]],
-  ['mqtt_5frequest_5ft_183',['mqtt_request_t',['../structmqtt__request__t.html',1,'']]],
-  ['mqtt_5fringbuf_5ffree_184',['mqtt_ringbuf_free',['../mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa',1,'mqtt.c']]],
-  ['mqtt_5fringbuf_5flinear_5fread_5flength_185',['mqtt_ringbuf_linear_read_length',['../mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3',1,'mqtt.c']]],
-  ['mqtt_5fringbuf_5ft_186',['mqtt_ringbuf_t',['../structmqtt__ringbuf__t.html',1,'']]],
-  ['mqtt_5fset_5finpub_5fcallback_187',['mqtt_set_inpub_callback',['../group__mqtt.html#gafdfa0e65b217e92835d35858924565cf',1,'mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb, mqtt_incoming_data_cb_t data_cb, void *arg):&#160;mqtt.c'],['../group__mqtt.html#gafdfa0e65b217e92835d35858924565cf',1,'mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t, mqtt_incoming_data_cb_t data_cb, void *arg):&#160;mqtt.c']]],
-  ['mqtt_5fsub_5funsub_188',['mqtt_sub_unsub',['../group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103',1,'mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub):&#160;mqtt.c'],['../group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103',1,'mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub):&#160;mqtt.c']]],
-  ['mqtt_5fsubscribe_189',['mqtt_subscribe',['../group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029',1,'mqtt.h']]],
-  ['mqtt_5ftls_5fport_190',['MQTT_TLS_PORT',['../group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f',1,'mqtt.h']]],
-  ['mqtt_5funsubscribe_191',['mqtt_unsubscribe',['../group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f',1,'mqtt.h']]],
-  ['mqtt_5fvar_5fheader_5fbuffer_5flen_192',['MQTT_VAR_HEADER_BUFFER_LEN',['../group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805',1,'mqtt_opts.h']]],
-  ['msg_193',['msg',['../structapi__msg.html#a01eaa41b1bbdc92e78ba3712d28cb613',1,'api_msg']]],
-  ['msg_5fidx_194',['msg_idx',['../structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5',1,'mqtt_client_s']]],
-  ['mtu_195',['mtu',['../structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48',1,'netif']]],
-  ['mtu6_196',['mtu6',['../structnetif.html#acd78fca5dad6468605f38e327b3a5e72',1,'netif']]],
-  ['multicast_197',['Multicast',['../group__lwip__opts__multicast.html',1,'']]],
-  ['multicast_20listener_20discovery_198',['Multicast listener discovery',['../group__lwip__opts__mld6.html',1,'']]],
-  ['multithreading_199',['Multithreading',['../multithreading.html',1,'']]],
-  ['mutexes_200',['Mutexes',['../group__sys__mutex.html',1,'']]]
+  ['mdns_5fbuild_5fdnssd_5fdomain_14',['mdns_build_dnssd_domain',['../mdns__domain_8c.html#a7485d75976b73354668a5a54bc8658ed',1,'mdns_build_dnssd_domain(struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a7485d75976b73354668a5a54bc8658ed',1,'mdns_build_dnssd_domain(struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5fhost_5fdomain_15',['mdns_build_host_domain',['../mdns__domain_8c.html#a191d9b70a66083f40aaa022c2ed88b12',1,'mdns_build_host_domain(struct mdns_domain *domain, struct mdns_host *mdns):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a191d9b70a66083f40aaa022c2ed88b12',1,'mdns_build_host_domain(struct mdns_domain *domain, struct mdns_host *mdns):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5frequest_5fdomain_16',['mdns_build_request_domain',['../mdns__domain_8c.html#a7221cb1a83ed6dcfb3a2b1365154b43d',1,'mdns_build_request_domain(struct mdns_domain *domain, struct mdns_request *request, int include_name):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a7221cb1a83ed6dcfb3a2b1365154b43d',1,'mdns_build_request_domain(struct mdns_domain *domain, struct mdns_request *request, int include_name):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5freverse_5fv4_5fdomain_17',['mdns_build_reverse_v4_domain',['../mdns__domain_8c.html#ac2d8951e2435f93fdc889f6a71e0c8a6',1,'mdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr):&#160;mdns_domain.c'],['../mdns__domain_8h.html#ac2d8951e2435f93fdc889f6a71e0c8a6',1,'mdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5freverse_5fv6_5fdomain_18',['mdns_build_reverse_v6_domain',['../mdns__domain_8c.html#a9cde39039e0e1e21b4851d840d733926',1,'mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a9cde39039e0e1e21b4851d840d733926',1,'mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5fservice_5fdomain_19',['mdns_build_service_domain',['../mdns__domain_8c.html#a29ddb0a6ba0edcf34104ec1f6322968b',1,'mdns_build_service_domain(struct mdns_domain *domain, struct mdns_service *service, int include_name):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a29ddb0a6ba0edcf34104ec1f6322968b',1,'mdns_build_service_domain(struct mdns_domain *domain, struct mdns_service *service, int include_name):&#160;mdns_domain.c']]],
+  ['mdns_5fcompress_5fdomain_20',['mdns_compress_domain',['../mdns__domain_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e',1,'mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e',1,'mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['mdns_5fcreate_5foutpacket_21',['mdns_create_outpacket',['../mdns__out_8c.html#a5a051eb81d6bd37365973d1215af23ba',1,'mdns_create_outpacket(struct netif *netif, struct mdns_outmsg *msg, struct mdns_outpacket *outpkt):&#160;mdns_out.c'],['../mdns__out_8h.html#a5a051eb81d6bd37365973d1215af23ba',1,'mdns_create_outpacket(struct netif *netif, struct mdns_outmsg *msg, struct mdns_outpacket *outpkt):&#160;mdns_out.c']]],
+  ['mdns_5fdebug_22',['MDNS_DEBUG',['../group__mdns__opts.html#ga53a97502efdcf1214cab4078f93a6dc9',1,'mdns_opts.h']]],
+  ['mdns_5fdelayed_5fmsg_23',['mdns_delayed_msg',['../structmdns__delayed__msg.html',1,'']]],
+  ['mdns_5fdomain_2ec_24',['mdns_domain.c',['../mdns__domain_8c.html',1,'']]],
+  ['mdns_5fdomain_2eh_25',['mdns_domain.h',['../mdns__domain_8h.html',1,'']]],
+  ['mdns_5fdomain_5fadd_5fdomain_26',['mdns_domain_add_domain',['../mdns__domain_8c.html#a642449cbf0074f1a2504e72158e75859',1,'mdns_domain_add_domain(struct mdns_domain *domain, struct mdns_domain *source):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a642449cbf0074f1a2504e72158e75859',1,'mdns_domain_add_domain(struct mdns_domain *domain, struct mdns_domain *source):&#160;mdns_domain.c']]],
+  ['mdns_5fdomain_5fadd_5flabel_27',['mdns_domain_add_label',['../mdns__domain_8c.html#a17db69fa887515374452b945e959bbf9',1,'mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a17db69fa887515374452b945e959bbf9',1,'mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len):&#160;mdns_domain.c']]],
+  ['mdns_5fdomain_5fadd_5fstring_28',['mdns_domain_add_string',['../mdns__domain_8c.html#af228d1cf8d779c714a016702db095db6',1,'mdns_domain_add_string(struct mdns_domain *domain, const char *source):&#160;mdns_domain.c'],['../mdns__domain_8h.html#af228d1cf8d779c714a016702db095db6',1,'mdns_domain_add_string(struct mdns_domain *domain, const char *source):&#160;mdns_domain.c']]],
+  ['mdns_5fdomain_5fdebug_5fprint_29',['mdns_domain_debug_print',['../mdns__domain_8c.html#a0aff096695eebacb2668d2762722860c',1,'mdns_domain_debug_print(struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a0aff096695eebacb2668d2762722860c',1,'mdns_domain_debug_print(struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['mdns_5fdomain_5feq_30',['mdns_domain_eq',['../mdns__domain_8c.html#a52d8f70432ae998814f16b18431213cd',1,'mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a52d8f70432ae998814f16b18431213cd',1,'mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b):&#160;mdns_domain.c']]],
+  ['mdns_5fget_5fservice_5ftxt_5fuserdata_31',['mdns_get_service_txt_userdata',['../group__mdns.html#gaee5b489b77b74511517d41f7609ccd49',1,'mdns_get_service_txt_userdata(struct netif *netif, s8_t slot):&#160;mdns.c'],['../group__mdns.html#gaee5b489b77b74511517d41f7609ccd49',1,'mdns_get_service_txt_userdata(struct netif *netif, s8_t slot):&#160;mdns.c']]],
+  ['mdns_5fhost_32',['mdns_host',['../structmdns__host.html',1,'']]],
+  ['mdns_5fmax_5frequests_33',['MDNS_MAX_REQUESTS',['../group__mdns__opts.html#ga17a9884af8169cf19d57d8005fc3d95e',1,'mdns_opts.h']]],
+  ['mdns_5fmax_5fservices_34',['MDNS_MAX_SERVICES',['../group__mdns__opts.html#ga82749ee08be21967b6daf577b9710ac6',1,'mdns_opts.h']]],
+  ['mdns_5fmax_5fstored_5fpkts_35',['MDNS_MAX_STORED_PKTS',['../group__mdns__opts.html#ga827d1d2abd24a26638723cfd0a8b9efd',1,'mdns_opts.h']]],
+  ['mdns_5fmulticast_5fprobe_5ftimeout_5freset_5fipv4_36',['mdns_multicast_probe_timeout_reset_ipv4',['../mdns__out_8c.html#add64c83f753842f2ceb40079217c66a1',1,'mdns_multicast_probe_timeout_reset_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#add64c83f753842f2ceb40079217c66a1',1,'mdns_multicast_probe_timeout_reset_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5fprobe_5ftimeout_5freset_5fipv6_37',['mdns_multicast_probe_timeout_reset_ipv6',['../mdns__out_8c.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f',1,'mdns_multicast_probe_timeout_reset_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f',1,'mdns_multicast_probe_timeout_reset_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5ftimeout_5f25ttl_5freset_5fipv4_38',['mdns_multicast_timeout_25ttl_reset_ipv4',['../mdns__out_8c.html#ae4a0ae6a039210f60f666999f9b807f7',1,'mdns_multicast_timeout_25ttl_reset_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#ae4a0ae6a039210f60f666999f9b807f7',1,'mdns_multicast_timeout_25ttl_reset_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5ftimeout_5f25ttl_5freset_5fipv6_39',['mdns_multicast_timeout_25ttl_reset_ipv6',['../mdns__out_8c.html#a5de741fd85c3675e3d2161727dd9a220',1,'mdns_multicast_timeout_25ttl_reset_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a5de741fd85c3675e3d2161727dd9a220',1,'mdns_multicast_timeout_25ttl_reset_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5ftimeout_5freset_5fipv4_40',['mdns_multicast_timeout_reset_ipv4',['../mdns__out_8c.html#a7b637b6f41976f35f7b48e7f2904829b',1,'mdns_multicast_timeout_reset_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a7b637b6f41976f35f7b48e7f2904829b',1,'mdns_multicast_timeout_reset_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5ftimeout_5freset_5fipv6_41',['mdns_multicast_timeout_reset_ipv6',['../mdns__out_8c.html#a790ea0aba2d252f96c23748ea0c033a7',1,'mdns_multicast_timeout_reset_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a790ea0aba2d252f96c23748ea0c033a7',1,'mdns_multicast_timeout_reset_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fname_5fresult_5fcb_5ft_42',['mdns_name_result_cb_t',['../mdns_8h.html#a6d658e2c5228b224b89488663d2b72f7',1,'mdns.h']]],
+  ['mdns_5fopts_2eh_43',['mdns_opts.h',['../mdns__opts_8h.html',1,'']]],
+  ['mdns_5fout_2ec_44',['mdns_out.c',['../mdns__out_8c.html',1,'']]],
+  ['mdns_5fout_2eh_45',['mdns_out.h',['../mdns__out_8h.html',1,'']]],
+  ['mdns_5foutmsg_46',['mdns_outmsg',['../structmdns__outmsg.html',1,'']]],
+  ['mdns_5foutpacket_47',['mdns_outpacket',['../structmdns__outpacket.html',1,'']]],
+  ['mdns_5foutput_5fpacket_5fsize_48',['MDNS_OUTPUT_PACKET_SIZE',['../group__mdns__opts.html#ga0f0adf7b1d742b4ea818c1b7f6b0c547',1,'mdns_opts.h']]],
+  ['mdns_5fpacket_49',['mdns_packet',['../structmdns__packet.html',1,'']]],
+  ['mdns_5fprepare_5ftxtdata_50',['mdns_prepare_txtdata',['../mdns__out_8c.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f',1,'mdns_prepare_txtdata(struct mdns_service *service):&#160;mdns_out.c'],['../mdns__out_8h.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f',1,'mdns_prepare_txtdata(struct mdns_service *service):&#160;mdns_out.c']]],
+  ['mdns_5fpriv_2eh_51',['mdns_priv.h',['../mdns__priv_8h.html',1,'']]],
+  ['mdns_5fprobe_5fcount_52',['MDNS_PROBE_COUNT',['../mdns_8c.html#af24e590bf9c225a2efc0b55fac14809d',1,'mdns.c']]],
+  ['mdns_5fprobe_5fdelay_5fms_53',['MDNS_PROBE_DELAY_MS',['../group__mdns__opts.html#ga7f6853d01ad32eb6ce99ae55307a37d9',1,'mdns_opts.h']]],
+  ['mdns_5freadname_54',['mdns_readname',['../mdns__domain_8c.html#ab5f49d9356a76879e0e6a14eb0643b23',1,'mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#ab5f49d9356a76879e0e6a14eb0643b23',1,'mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['mdns_5frequest_55',['mdns_request',['../structmdns__request.html',1,'']]],
+  ['mdns_5fresp_5fadd_5fnetif_56',['mdns_resp_add_netif',['../group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e',1,'mdns_resp_add_netif(struct netif *netif, const char *hostname):&#160;mdns.c'],['../group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e',1,'mdns_resp_add_netif(struct netif *netif, const char *hostname):&#160;mdns.c']]],
+  ['mdns_5fresp_5fadd_5fservice_57',['mdns_resp_add_service',['../group__mdns.html#ga2130111662d044b32970ce9c763bd409',1,'mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, service_get_txt_fn_t txt_fn, void *txt_data):&#160;mdns.c'],['../group__mdns.html#ga2130111662d044b32970ce9c763bd409',1,'mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, service_get_txt_fn_t txt_fn, void *txt_userdata):&#160;mdns.c']]],
+  ['mdns_5fresp_5fadd_5fservice_5ftxtitem_58',['mdns_resp_add_service_txtitem',['../group__mdns.html#ga01c85202f4b85edc8b571f2f419db576',1,'mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len):&#160;mdns.c'],['../group__mdns.html#ga01c85202f4b85edc8b571f2f419db576',1,'mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len):&#160;mdns.c']]],
+  ['mdns_5fresp_5fannounce_59',['mdns_resp_announce',['../group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85',1,'mdns_resp_announce(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85',1,'mdns_resp_announce(struct netif *netif):&#160;mdns.c']]],
+  ['mdns_5fresp_5fdel_5fservice_60',['mdns_resp_del_service',['../group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a',1,'mdns_resp_del_service(struct netif *netif, u8_t slot):&#160;mdns.c'],['../group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a',1,'mdns_resp_del_service(struct netif *netif, u8_t slot):&#160;mdns.c']]],
+  ['mdns_5fresp_5finit_61',['mdns_resp_init',['../group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3',1,'mdns_resp_init(void):&#160;mdns.c'],['../group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3',1,'mdns_resp_init(void):&#160;mdns.c']]],
+  ['mdns_5fresp_5fnetif_5factive_62',['mdns_resp_netif_active',['../group__mdns.html#ga09b7a259f497648d8ef734b080f997c1',1,'mdns_resp_netif_active(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga09b7a259f497648d8ef734b080f997c1',1,'mdns_resp_netif_active(struct netif *netif):&#160;mdns.c']]],
+  ['mdns_5fresp_5fnetif_5fsettings_5fchanged_63',['mdns_resp_netif_settings_changed',['../group__mdns.html#gab2edba12d5cad1949f7ca040ae12beec',1,'mdns.h']]],
+  ['mdns_5fresp_5fregister_5fname_5fresult_5fcb_64',['mdns_resp_register_name_result_cb',['../mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1',1,'mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb):&#160;mdns.c'],['../mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1',1,'mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb):&#160;mdns.c']]],
+  ['mdns_5fresp_5fremove_5fnetif_65',['mdns_resp_remove_netif',['../group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c',1,'mdns_resp_remove_netif(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c',1,'mdns_resp_remove_netif(struct netif *netif):&#160;mdns.c']]],
+  ['mdns_5fresp_5frename_5fnetif_66',['mdns_resp_rename_netif',['../group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e',1,'mdns_resp_rename_netif(struct netif *netif, const char *hostname):&#160;mdns.c'],['../group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e',1,'mdns_resp_rename_netif(struct netif *netif, const char *hostname):&#160;mdns.c']]],
+  ['mdns_5fresp_5frename_5fservice_67',['mdns_resp_rename_service',['../group__mdns.html#gab1e989a4c7305d754377c76052474beb',1,'mdns_resp_rename_service(struct netif *netif, u8_t slot, const char *name):&#160;mdns.c'],['../group__mdns.html#gab1e989a4c7305d754377c76052474beb',1,'mdns_resp_rename_service(struct netif *netif, u8_t slot, const char *name):&#160;mdns.c']]],
+  ['mdns_5fresp_5frestart_68',['mdns_resp_restart',['../group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a',1,'mdns_resp_restart(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a',1,'mdns_resp_restart(struct netif *netif):&#160;mdns.c']]],
+  ['mdns_5fresp_5frestart_5fdelay_69',['mdns_resp_restart_delay',['../group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737',1,'mdns_resp_restart_delay(struct netif *netif, uint32_t delay):&#160;mdns.c'],['../group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737',1,'mdns_resp_restart_delay(struct netif *netif, uint32_t delay):&#160;mdns.c']]],
+  ['mdns_5fresp_5fusenetif_5fextcallback_70',['MDNS_RESP_USENETIF_EXTCALLBACK',['../group__mdns__opts.html#ga172e579cd09a1db51cf224319c012396',1,'mdns_opts.h']]],
+  ['mdns_5fresponse_5fdelay_5fmax_71',['MDNS_RESPONSE_DELAY_MAX',['../mdns_8c.html#a482d6bf710af4424b71ee57034edbdbe',1,'mdns.c']]],
+  ['mdns_5frr_5finfo_72',['mdns_rr_info',['../structmdns__rr__info.html',1,'']]],
+  ['mdns_5fsearch_5fservice_73',['mdns_search_service',['../group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725',1,'mdns_search_service(const char *name, const char *service, enum mdns_sd_proto proto, struct netif *netif, search_result_fn_t result_fn, void *arg, u8_t *request_id):&#160;mdns.c'],['../group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725',1,'mdns_search_service(const char *name, const char *service, enum mdns_sd_proto proto, struct netif *netif, search_result_fn_t result_fn, void *arg, u8_t *request_id):&#160;mdns.c']]],
+  ['mdns_5fsearch_5fstop_74',['mdns_search_stop',['../group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac',1,'mdns_search_stop(u8_t request_id):&#160;mdns.c'],['../group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac',1,'mdns_search_stop(u8_t request_id):&#160;mdns.c']]],
+  ['mdns_5fsend_5fmulticast_5fmsg_5fdelayed_5fipv4_75',['mdns_send_multicast_msg_delayed_ipv4',['../mdns__out_8c.html#acbf59dca94f241c1b58c7df1ec4b85e1',1,'mdns_send_multicast_msg_delayed_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#acbf59dca94f241c1b58c7df1ec4b85e1',1,'mdns_send_multicast_msg_delayed_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5fmulticast_5fmsg_5fdelayed_5fipv6_76',['mdns_send_multicast_msg_delayed_ipv6',['../mdns__out_8c.html#af3e118eb80760a958265f6a4c59b2e49',1,'mdns_send_multicast_msg_delayed_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#af3e118eb80760a958265f6a4c59b2e49',1,'mdns_send_multicast_msg_delayed_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5foutpacket_77',['mdns_send_outpacket',['../mdns__out_8c.html#ae8c9d2bd89d6ca7e8668ba708925d2e8',1,'mdns_send_outpacket(struct mdns_outmsg *msg, struct netif *netif):&#160;mdns_out.c'],['../mdns__out_8h.html#ae8c9d2bd89d6ca7e8668ba708925d2e8',1,'mdns_send_outpacket(struct mdns_outmsg *msg, struct netif *netif):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5frequest_78',['mdns_send_request',['../mdns__out_8c.html#a1f7dc9536f124263573518e6e8e1a162',1,'mdns_send_request(struct mdns_request *req, struct netif *netif, const ip_addr_t *destination):&#160;mdns_out.c'],['../mdns__out_8h.html#a1f7dc9536f124263573518e6e8e1a162',1,'mdns_send_request(struct mdns_request *req, struct netif *netif, const ip_addr_t *destination):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5funicast_5fmsg_5fdelayed_5fipv4_79',['mdns_send_unicast_msg_delayed_ipv4',['../mdns__out_8c.html#a2b7a721b19fa33813133bc97f503c199',1,'mdns_send_unicast_msg_delayed_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a2b7a721b19fa33813133bc97f503c199',1,'mdns_send_unicast_msg_delayed_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5funicast_5fmsg_5fdelayed_5fipv6_80',['mdns_send_unicast_msg_delayed_ipv6',['../mdns__out_8c.html#a2713348b1b314d5e880442f2c130e1dc',1,'mdns_send_unicast_msg_delayed_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a2713348b1b314d5e880442f2c130e1dc',1,'mdns_send_unicast_msg_delayed_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fservice_81',['mdns_service',['../structmdns__service.html',1,'']]],
+  ['mdns_5fset_5ftimeout_82',['mdns_set_timeout',['../mdns__out_8c.html#a6195808be1840daa8a100b5954a30cfe',1,'mdns_set_timeout(struct netif *netif, u32_t msecs, sys_timeout_handler handler, u8_t *busy_flag):&#160;mdns_out.c'],['../mdns__out_8h.html#a6195808be1840daa8a100b5954a30cfe',1,'mdns_set_timeout(struct netif *netif, u32_t msecs, sys_timeout_handler handler, u8_t *busy_flag):&#160;mdns_out.c']]],
+  ['mdns_5fstart_5fmulticast_5ftimeouts_5fipv4_83',['mdns_start_multicast_timeouts_ipv4',['../mdns__out_8c.html#a2dd35cb1e1fae888c05c2b7f8bd717cc',1,'mdns_start_multicast_timeouts_ipv4(struct netif *netif):&#160;mdns_out.c'],['../mdns__out_8h.html#a2dd35cb1e1fae888c05c2b7f8bd717cc',1,'mdns_start_multicast_timeouts_ipv4(struct netif *netif):&#160;mdns_out.c']]],
+  ['mdns_5fstart_5fmulticast_5ftimeouts_5fipv6_84',['mdns_start_multicast_timeouts_ipv6',['../mdns__out_8c.html#a10f6f22640ac837a233bf43334dfb02a',1,'mdns_start_multicast_timeouts_ipv6(struct netif *netif):&#160;mdns_out.c'],['../mdns__out_8h.html#a10f6f22640ac837a233bf43334dfb02a',1,'mdns_start_multicast_timeouts_ipv6(struct netif *netif):&#160;mdns_out.c']]],
+  ['mdns_5fwrite_5fdomain_85',['mdns_write_domain',['../mdns__domain_8c.html#a92de54d2f384a4e4ffa85e529cc05411',1,'mdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a92de54d2f384a4e4ffa85e529cc05411',1,'mdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['measurement_86',['Performance measurement',['../group__perf.html',1,'']]],
+  ['mem_87',['mem',['../structmem.html',1,'mem'],['../structstats__.html#a656444f95080c6a3d474f73a6fcd9b1c',1,'stats_::mem']]],
+  ['mem_2ec_88',['mem.c',['../mem_8c.html',1,'']]],
+  ['mem_2eh_89',['mem.h',['../mem_8h.html',1,'']]],
+  ['mem_5falignment_90',['MEM_ALIGNMENT',['../group__lwip__opts__mem.html#ga97343214666ee6dcb18c0bd77b441ea7',1,'opt.h']]],
+  ['mem_5fcalloc_91',['mem_calloc',['../mem_8c.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c'],['../mem_8h.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c']]],
+  ['mem_5fdebug_92',['MEM_DEBUG',['../group__lwip__opts__debugmsg.html#ga2d7bc380695eeedb1af50c3808613afe',1,'opt.h']]],
+  ['mem_5ffree_93',['mem_free',['../mem_8c.html#a65169147c44e9db60d997819af9b455c',1,'mem_free(void *rmem):&#160;mem.c'],['../mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a',1,'mem_free(void *mem):&#160;mem.c']]],
+  ['mem_5ffree_5fcallback_94',['mem_free_callback',['../tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c',1,'mem_free_callback(void *m):&#160;tcpip.c'],['../tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c',1,'mem_free_callback(void *m):&#160;tcpip.c']]],
+  ['mem_5finit_95',['mem_init',['../mem_8c.html#a44a136e3b70c36abb6f8dc060c778113',1,'mem_init(void):&#160;mem.c'],['../mem_8h.html#a44a136e3b70c36abb6f8dc060c778113',1,'mem_init(void):&#160;mem.c']]],
+  ['mem_5flibc_5fmalloc_96',['MEM_LIBC_MALLOC',['../group__lwip__opts__mem.html#ga4ef345cc270912bd2230b1c5ec51dfc8',1,'opt.h']]],
+  ['mem_5fmalloc_97',['mem_malloc',['../mem_8c.html#ae2190f95ae9c46bb99ec0be4f4e4e5e4',1,'mem_malloc(mem_size_t size_in):&#160;mem.c'],['../mem_8h.html#a52ce222aebe4b7dce7f25cd536b6e650',1,'mem_malloc(mem_size_t size):&#160;mem.c']]],
+  ['mem_5foverflow_5fcheck_98',['MEM_OVERFLOW_CHECK',['../group__lwip__opts__mem.html#gae331a198bd06100b90ea020cd5f07f4e',1,'opt.h']]],
+  ['mem_5fpriv_2eh_99',['mem_priv.h',['../mem__priv_8h.html',1,'']]],
+  ['mem_5fsanity_5fcheck_100',['MEM_SANITY_CHECK',['../group__lwip__opts__mem.html#ga90b17afabb93986a162c327ed30bb4d3',1,'opt.h']]],
+  ['mem_5fsize_101',['MEM_SIZE',['../group__lwip__opts__mem.html#ga2dcf8c45f945dd0c4301a94700f2112c',1,'opt.h']]],
+  ['mem_5fstats_102',['MEM_STATS',['../group__lwip__opts__stats.html#ga61ec04a08c4fde690d10819e582656a7',1,'opt.h']]],
+  ['mem_5ftrim_103',['mem_trim',['../mem_8c.html#ab0915b39bd096766771ef4cf719bfb40',1,'mem_trim(void *rmem, mem_size_t new_size):&#160;mem.c'],['../mem_8h.html#a2ba2d1e6fc284b1850eedb673eba96b0',1,'mem_trim(void *mem, mem_size_t size):&#160;mem.c']]],
+  ['mem_5fuse_5fpools_104',['MEM_USE_POOLS',['../group__lwip__opts__mem.html#gaddca3141bc7037241769eb152b6f89ba',1,'opt.h']]],
+  ['mem_5fuse_5fpools_5ftry_5fbigger_5fpool_105',['MEM_USE_POOLS_TRY_BIGGER_POOL',['../group__lwip__opts__mem.html#gaba8be68e8fd0716b723ce4569ed89f82',1,'opt.h']]],
+  ['memcpy_106',['MEMCPY',['../group__lwip__opts__memcpy.html#gaa1dd57a66b6de8c0593e9e3e8d1411f6',1,'opt.h']]],
+  ['memcpy_107',['memcpy',['../group__lwip__opts__memcpy.html',1,'']]],
+  ['memmove_108',['MEMMOVE',['../group__lwip__opts__memcpy.html#ga0e00bb235da5557fcbc049f732503863',1,'opt.h']]],
+  ['memory_20pool_20sizes_109',['Debugging memory pool sizes',['../mem_err.html',1,'']]],
+  ['memory_20pools_110',['Memory pools',['../group__mempool.html',1,'']]],
+  ['memory_20pools_111',['memory pools',['../group__lwip__opts__mem.html',1,'Heap and memory pools'],['../group__lwip__opts__memp.html',1,'Internal memory pools']]],
+  ['memp_112',['memp',['../structstats__.html#aa75d6b389e94b0f619b5db0daaf569fc',1,'stats_']]],
+  ['memp_2ec_113',['memp.c',['../memp_8c.html',1,'']]],
+  ['memp_2eh_114',['memp.h',['../memp_8h.html',1,'']]],
+  ['memp_5fdebug_115',['MEMP_DEBUG',['../group__lwip__opts__debugmsg.html#gad80231923f7a808d49eba5ec57d63616',1,'opt.h']]],
+  ['memp_5fdesc_116',['memp_desc',['../structmemp__desc.html',1,'']]],
+  ['memp_5ffree_117',['memp_free',['../memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f',1,'memp_free(memp_t type, void *mem):&#160;memp.c'],['../memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f',1,'memp_free(memp_t type, void *mem):&#160;memp.c']]],
+  ['memp_5ffree_5fpool_118',['memp_free_pool',['../memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5',1,'memp_free_pool(const struct memp_desc *desc, void *mem):&#160;memp.c'],['../memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5',1,'memp_free_pool(const struct memp_desc *desc, void *mem):&#160;memp.c']]],
+  ['memp_5finit_119',['memp_init',['../memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2',1,'memp_init(void):&#160;memp.c'],['../memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2',1,'memp_init(void):&#160;memp.c']]],
+  ['memp_5finit_5fpool_120',['memp_init_pool',['../memp_8c.html#a6416303426d05526bed33f241fa6ecd7',1,'memp_init_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7',1,'memp_init_pool(const struct memp_desc *desc):&#160;memp.c']]],
+  ['memp_5fmalloc_121',['memp_malloc',['../memp_8c.html#ac49689457203bfb872adf5428f96a3e7',1,'memp_malloc(memp_t type):&#160;memp.c'],['../memp_8h.html#ac49689457203bfb872adf5428f96a3e7',1,'memp_malloc(memp_t type):&#160;memp.c']]],
+  ['memp_5fmalloc_5fpool_122',['memp_malloc_pool',['../memp_8c.html#ab6bfb9562c3a77e329a888e59ef0ace3',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#ab6bfb9562c3a77e329a888e59ef0ace3',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c']]],
+  ['memp_5fmem_5finit_123',['MEMP_MEM_INIT',['../group__lwip__opts__mem.html#gaa2f25586972d1cbc1ff0dcdc6f15a1b0',1,'opt.h']]],
+  ['memp_5fmem_5fmalloc_124',['MEMP_MEM_MALLOC',['../group__lwip__opts__mem.html#gae93af697d27bbcefa6a28052d90f2f38',1,'opt.h']]],
+  ['memp_5fnum_5faltcp_5fpcb_125',['MEMP_NUM_ALTCP_PCB',['../group__lwip__opts__memp.html#ga24f6737ee990990b81b0d16ef6e0dffd',1,'opt.h']]],
+  ['memp_5fnum_5fapi_5fmsg_126',['MEMP_NUM_API_MSG',['../group__lwip__opts__memp.html#ga5a95abf3610c56e7c23cb035eb9c3444',1,'opt.h']]],
+  ['memp_5fnum_5farp_5fqueue_127',['MEMP_NUM_ARP_QUEUE',['../group__lwip__opts__memp.html#ga087b00ea20a7edebcad33a1a1353a5d7',1,'opt.h']]],
+  ['memp_5fnum_5fdns_5fapi_5fmsg_128',['MEMP_NUM_DNS_API_MSG',['../group__lwip__opts__memp.html#ga3b1f228c598529c62895ad04ff294980',1,'opt.h']]],
+  ['memp_5fnum_5ffrag_5fpbuf_129',['MEMP_NUM_FRAG_PBUF',['../group__lwip__opts__memp.html#ga1f66051a654dcd7a4e19bc6aff240630',1,'opt.h']]],
+  ['memp_5fnum_5figmp_5fgroup_130',['MEMP_NUM_IGMP_GROUP',['../group__lwip__opts__memp.html#gab648ff95d8ffa4216b95f82a568a5d9a',1,'opt.h']]],
+  ['memp_5fnum_5flocalhostlist_131',['MEMP_NUM_LOCALHOSTLIST',['../group__lwip__opts__memp.html#gaa9b0f949da12cbe8fe5f7aefc30290e0',1,'opt.h']]],
+  ['memp_5fnum_5fmld6_5fgroup_132',['MEMP_NUM_MLD6_GROUP',['../group__lwip__opts__mld6.html#ga89e92d8de8898696e797f13fdd169494',1,'opt.h']]],
+  ['memp_5fnum_5fnd6_5fqueue_133',['MEMP_NUM_ND6_QUEUE',['../group__lwip__opts__nd6.html#gabfaf3d92d51e2a9d70c8360af2611fb2',1,'opt.h']]],
+  ['memp_5fnum_5fnetbuf_134',['MEMP_NUM_NETBUF',['../group__lwip__opts__memp.html#ga5d99df65869ac101ed6a611fc85016be',1,'opt.h']]],
+  ['memp_5fnum_5fnetconn_135',['MEMP_NUM_NETCONN',['../group__lwip__opts__memp.html#gacb40bd726b7e15593b20a628d298f456',1,'opt.h']]],
+  ['memp_5fnum_5fnetdb_136',['MEMP_NUM_NETDB',['../group__lwip__opts__memp.html#ga293bc22b60bf3f8e2520f60a88370e7a',1,'opt.h']]],
+  ['memp_5fnum_5fnetifapi_5fmsg_137',['MEMP_NUM_NETIFAPI_MSG',['../group__lwip__opts__memp.html#gadd5a973b98068ce9318ea2f96b5fa14c',1,'opt.h']]],
+  ['memp_5fnum_5fpbuf_138',['MEMP_NUM_PBUF',['../group__lwip__opts__memp.html#ga92b30aed958ec59334d936d4ca725418',1,'opt.h']]],
+  ['memp_5fnum_5fraw_5fpcb_139',['MEMP_NUM_RAW_PCB',['../group__lwip__opts__memp.html#ga379bf92ed322cda54cb701337421e0d3',1,'opt.h']]],
+  ['memp_5fnum_5freassdata_140',['MEMP_NUM_REASSDATA',['../group__lwip__opts__memp.html#ga169436c5860253b90e25bdba9fdcac86',1,'opt.h']]],
+  ['memp_5fnum_5fselect_5fcb_141',['MEMP_NUM_SELECT_CB',['../group__lwip__opts__memp.html#ga8e136f5811e6652c6c5d2fcf596f0893',1,'opt.h']]],
+  ['memp_5fnum_5fsocket_5fsetgetsockopt_5fdata_142',['MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA',['../group__lwip__opts__memp.html#gacf9782dd26bf8a655044dc041a9de948',1,'opt.h']]],
+  ['memp_5fnum_5fsys_5ftimeout_143',['MEMP_NUM_SYS_TIMEOUT',['../group__lwip__opts__memp.html#ga4afbdca581a58d57bc7a81118a95327e',1,'opt.h']]],
+  ['memp_5fnum_5ftcp_5fpcb_144',['MEMP_NUM_TCP_PCB',['../group__lwip__opts__memp.html#ga73beecc19cfbc3114768f9b32b2cd70e',1,'opt.h']]],
+  ['memp_5fnum_5ftcp_5fpcb_5flisten_145',['MEMP_NUM_TCP_PCB_LISTEN',['../group__lwip__opts__memp.html#ga04fba6a249123513271dccb4ec26aa5a',1,'opt.h']]],
+  ['memp_5fnum_5ftcp_5fseg_146',['MEMP_NUM_TCP_SEG',['../group__lwip__opts__memp.html#gaa35fb3a1a76661e3ffb9722a57092de3',1,'opt.h']]],
+  ['memp_5fnum_5ftcpip_5fmsg_5fapi_147',['MEMP_NUM_TCPIP_MSG_API',['../group__lwip__opts__memp.html#gafbbfd6ce8536038cd00fa85bebae987c',1,'opt.h']]],
+  ['memp_5fnum_5ftcpip_5fmsg_5finpkt_148',['MEMP_NUM_TCPIP_MSG_INPKT',['../group__lwip__opts__memp.html#gab089a7088439e726c3801ba9e249d831',1,'opt.h']]],
+  ['memp_5fnum_5fudp_5fpcb_149',['MEMP_NUM_UDP_PCB',['../group__lwip__opts__memp.html#ga2c416da481ab09bd1ba257b75a0707eb',1,'opt.h']]],
+  ['memp_5foverflow_5fcheck_150',['MEMP_OVERFLOW_CHECK',['../group__lwip__opts__mem.html#ga27fdd01194a42fc41a7716b72cdb49e3',1,'opt.h']]],
+  ['memp_5fpriv_2eh_151',['memp_priv.h',['../memp__priv_8h.html',1,'']]],
+  ['memp_5fsanity_5fcheck_152',['MEMP_SANITY_CHECK',['../group__lwip__opts__mem.html#ga0838947193e222a9f46b582e01e5beff',1,'opt.h']]],
+  ['memp_5fstats_153',['MEMP_STATS',['../group__lwip__opts__stats.html#gab8c2430be0e567a7499a95454aaa6041',1,'opt.h']]],
+  ['memp_5fstd_2eh_154',['memp_std.h',['../memp__std_8h.html',1,'']]],
+  ['memp_5ft_155',['memp_t',['../memp_8h.html#a85a164b1f7764951cc685ea525114e57',1,'memp.h']]],
+  ['memp_5fuse_5fcustom_5fpools_156',['MEMP_USE_CUSTOM_POOLS',['../group__lwip__opts__mem.html#ga69de593b8ffd4f1c249f03e48e11983b',1,'opt.h']]],
+  ['messages_157',['Debug messages',['../group__lwip__opts__debugmsg.html',1,'']]],
+  ['mib2_158',['MIB2',['../group__snmp__mib2.html',1,'']]],
+  ['mib2_159',['mib2',['../structstats__.html#ac001c065c56c26c3952b19b9ce0d5832',1,'stats_']]],
+  ['mib2_20callbacks_160',['SNMP MIB2 callbacks',['../group__lwip__opts__mib2.html',1,'']]],
+  ['mib2_20statistics_161',['MIB2 statistics',['../group__netif__mib2.html',1,'']]],
+  ['mib2_5fcopy_5fsysuptime_5fto_162',['MIB2_COPY_SYSUPTIME_TO',['../snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c',1,'snmp.h']]],
+  ['mib2_5fcounters_163',['mib2_counters',['../structnetif.html#ab32cbe1851154fd020bac4be558f5fd5',1,'netif']]],
+  ['mib2_5finit_5fnetif_164',['MIB2_INIT_NETIF',['../group__netif__mib2.html#ga5be1b8cba1d67bf6e7f8851ec91b10f0',1,'snmp.h']]],
+  ['mib2_5fstats_165',['MIB2_STATS',['../group__lwip__opts__stats.html#ga5b01047eeb149a0b0ffe33d760d8370f',1,'opt.h']]],
+  ['mib2_5fstats_5fnetif_5fadd_166',['MIB2_STATS_NETIF_ADD',['../group__netif__mib2.html#ga05641438775014b7e13b9e55eba48bed',1,'snmp.h']]],
+  ['mib2_5fstats_5fnetif_5finc_167',['MIB2_STATS_NETIF_INC',['../group__netif__mib2.html#ga3c52caf566d37705c6547f2d025afd9f',1,'snmp.h']]],
+  ['min_5freq_5flen_168',['MIN_REQ_LEN',['../httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a',1,'httpd.c']]],
+  ['min_5fsize_169',['MIN_SIZE',['../mem_8c.html#a278694c2333c9826f21ddd2c2d220f66',1,'mem.c']]],
+  ['misc_170',['Misc',['../group__sys__misc.html',1,'']]],
+  ['mld6_171',['MLD6',['../group__mld6.html',1,'']]],
+  ['mld6_172',['mld6',['../structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8',1,'stats_']]],
+  ['mld6_2ec_173',['mld6.c',['../mld6_8c.html',1,'']]],
+  ['mld6_2eh_174',['mld6.h',['../mld6_8h.html',1,'(Global Namespace)'],['../prot_2mld6_8h.html',1,'(Global Namespace)']]],
+  ['mld6_5finput_175',['mld6_input',['../mld6_8c.html#a7c190ca25432d466b28f607c3574a841',1,'mld6_input(struct pbuf *p, struct netif *inp):&#160;mld6.c'],['../mld6_8h.html#a7c190ca25432d466b28f607c3574a841',1,'mld6_input(struct pbuf *p, struct netif *inp):&#160;mld6.c']]],
+  ['mld6_5fjoingroup_176',['mld6_joingroup',['../group__mld6.html#ga53560ab6e47163e4888070830bf912a8',1,'mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga53560ab6e47163e4888070830bf912a8',1,'mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
+  ['mld6_5fjoingroup_5fnetif_177',['mld6_joingroup_netif',['../group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940',1,'mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940',1,'mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
+  ['mld6_5fleavegroup_178',['mld6_leavegroup',['../group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5',1,'mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5',1,'mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
+  ['mld6_5fleavegroup_5fnetif_179',['mld6_leavegroup_netif',['../group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22',1,'mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22',1,'mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
+  ['mld6_5flookfor_5fgroup_180',['mld6_lookfor_group',['../mld6_8c.html#a496197eef3f8b4c2a0fd49734aee07d6',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c'],['../mld6_8h.html#a496197eef3f8b4c2a0fd49734aee07d6',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c']]],
+  ['mld6_5freport_5fgroups_181',['mld6_report_groups',['../mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686',1,'mld6_report_groups(struct netif *netif):&#160;mld6.c'],['../mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686',1,'mld6_report_groups(struct netif *netif):&#160;mld6.c']]],
+  ['mld6_5fstats_182',['MLD6_STATS',['../group__lwip__opts__stats.html#gaf263df10b63b38201cae3d2dd5fb0b9e',1,'opt.h']]],
+  ['mld6_5fstop_183',['mld6_stop',['../mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198',1,'mld6_stop(struct netif *netif):&#160;mld6.c'],['../mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198',1,'mld6_stop(struct netif *netif):&#160;mld6.c']]],
+  ['mld6_5ftmr_184',['mld6_tmr',['../mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274',1,'mld6_tmr(void):&#160;mld6.c'],['../mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274',1,'mld6_tmr(void):&#160;mld6.c']]],
+  ['mld_5fgroup_185',['mld_group',['../structmld__group.html',1,'']]],
+  ['mld_5fheader_186',['mld_header',['../structmld__header.html',1,'']]],
+  ['mld_5fmac_5ffilter_187',['mld_mac_filter',['../structnetif.html#abc67963ff9f574e98ef9c50138a3e470',1,'netif']]],
+  ['mode_20no_5fsys_188',['Mainloop mode (&quot;NO_SYS&quot;)',['../group__lwip__nosys.html',1,'']]],
+  ['mode_20tcpip_20thread_189',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
+  ['mpu_190',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
+  ['mqtt_20client_191',['MQTT client',['../group__mqtt.html',1,'']]],
+  ['mqtt_2ec_192',['mqtt.c',['../mqtt_8c.html',1,'']]],
+  ['mqtt_2eh_193',['mqtt.h',['../mqtt_8h.html',1,'']]],
+  ['mqtt_5fclient_5fconnect_194',['mqtt_client_connect',['../group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0',1,'mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, mqtt_connection_cb_t cb, void *arg, const struct mqtt_connect_client_info_t *client_info):&#160;mqtt.c'],['../group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0',1,'mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ipaddr, u16_t port, mqtt_connection_cb_t cb, void *arg, const struct mqtt_connect_client_info_t *client_info):&#160;mqtt.c']]],
+  ['mqtt_5fclient_5ffree_195',['mqtt_client_free',['../group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882',1,'mqtt_client_free(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882',1,'mqtt_client_free(mqtt_client_t *client):&#160;mqtt.c']]],
+  ['mqtt_5fclient_5fis_5fconnected_196',['mqtt_client_is_connected',['../group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5',1,'mqtt_client_is_connected(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5',1,'mqtt_client_is_connected(mqtt_client_t *client):&#160;mqtt.c']]],
+  ['mqtt_5fclient_5fnew_197',['mqtt_client_new',['../group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7',1,'mqtt_client_new(void):&#160;mqtt.c'],['../group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7',1,'mqtt_client_new(void):&#160;mqtt.c']]],
+  ['mqtt_5fclient_5fs_198',['mqtt_client_s',['../structmqtt__client__s.html',1,'']]],
+  ['mqtt_5fconnect_5faccepted_199',['MQTT_CONNECT_ACCEPTED',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da074dc1d289b8e8d4aad91f6a2cb93dc1',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5fclient_5finfo_5ft_200',['mqtt_connect_client_info_t',['../structmqtt__connect__client__info__t.html',1,'']]],
+  ['mqtt_5fconnect_5fdisconnected_201',['MQTT_CONNECT_DISCONNECTED',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da321f5ce31b173f235de1a517fcfd00dd',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5fflag_202',['mqtt_connect_flag',['../mqtt_8c.html#a4f6c42ed730546ff755e3bb99989dd12',1,'mqtt.c']]],
+  ['mqtt_5fconnect_5frefused_5fidentifier_203',['MQTT_CONNECT_REFUSED_IDENTIFIER',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da28ffe49b0175adaa2b9a27cb4873224a',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fnot_5fauthorized_5f_204',['MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dafc4888158dd6ee84269a5f0bfdc12b17',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fprotocol_5fversion_205',['MQTT_CONNECT_REFUSED_PROTOCOL_VERSION',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da41f8aa97142be337cb639f94d9145190',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fserver_206',['MQTT_CONNECT_REFUSED_SERVER',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5frefused_5fusername_5fpass_207',['MQTT_CONNECT_REFUSED_USERNAME_PASS',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5ftimeout_208',['MQTT_CONNECT_TIMEOUT',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62',1,'mqtt.h']]],
+  ['mqtt_5fconnect_5ftimout_209',['MQTT_CONNECT_TIMOUT',['../group__mqtt__opts.html#gac5d0580d1caf57dac1cb56662e5d9f7b',1,'mqtt_opts.h']]],
+  ['mqtt_5fconnection_5fcb_5ft_210',['mqtt_connection_cb_t',['../group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f',1,'mqtt.h']]],
+  ['mqtt_5fconnection_5fstatus_5ft_211',['mqtt_connection_status_t',['../group__mqtt.html#ga8cf0f360ab20343af37e1d124395a77d',1,'mqtt.h']]],
+  ['mqtt_5fctl_5fpacket_5ftype_212',['MQTT_CTL_PACKET_TYPE',['../mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b',1,'mqtt.c']]],
+  ['mqtt_5fcyclic_5ftimer_5finterval_213',['MQTT_CYCLIC_TIMER_INTERVAL',['../group__mqtt__opts.html#ga1d89fda808c7047eab7a67d3785aea8e',1,'mqtt_opts.h']]],
+  ['mqtt_5fdata_5fflag_5flast_214',['MQTT_DATA_FLAG_LAST',['../group__mqtt.html#ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f',1,'mqtt.h']]],
+  ['mqtt_5fdebug_215',['MQTT_DEBUG',['../mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d',1,'mqtt.c']]],
+  ['mqtt_5fdisconnect_216',['mqtt_disconnect',['../group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6',1,'mqtt_disconnect(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6',1,'mqtt_disconnect(mqtt_client_t *client):&#160;mqtt.c']]],
+  ['mqtt_5fincoming_5fdata_5fcb_5ft_217',['mqtt_incoming_data_cb_t',['../group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81',1,'mqtt.h']]],
+  ['mqtt_5fincoming_5fpublish_5fcb_5ft_218',['mqtt_incoming_publish_cb_t',['../group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29',1,'mqtt.h']]],
+  ['mqtt_5fmessage_5ftype_219',['mqtt_message_type',['../mqtt_8c.html#ac243cf15beb51b2206e36da86c2f95f1',1,'mqtt.c']]],
+  ['mqtt_5fopts_2eh_220',['mqtt_opts.h',['../mqtt__opts_8h.html',1,'']]],
+  ['mqtt_5foutput_5fringbuf_5fsize_221',['MQTT_OUTPUT_RINGBUF_SIZE',['../group__mqtt__opts.html#ga70627bafaffa071875cee9edc38d942b',1,'mqtt_opts.h']]],
+  ['mqtt_5fport_222',['MQTT_PORT',['../group__mqtt.html#gaa8632baff6bbb5004385998918f1e6bd',1,'mqtt.h']]],
+  ['mqtt_5fpriv_2eh_223',['mqtt_priv.h',['../mqtt__priv_8h.html',1,'']]],
+  ['mqtt_5fpublish_224',['mqtt_publish',['../group__mqtt.html#gade9850d716e81fde572cb012be795d2f',1,'mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, mqtt_request_cb_t cb, void *arg):&#160;mqtt.c'],['../group__mqtt.html#gade9850d716e81fde572cb012be795d2f',1,'mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, mqtt_request_cb_t cb, void *arg):&#160;mqtt.c']]],
+  ['mqtt_5freq_5fmax_5fin_5fflight_225',['MQTT_REQ_MAX_IN_FLIGHT',['../group__mqtt__opts.html#gae82460b35de2291e9661e440c3458e8f',1,'mqtt_opts.h']]],
+  ['mqtt_5freq_5ftimeout_226',['MQTT_REQ_TIMEOUT',['../group__mqtt__opts.html#ga262639f2b45f6e064fb53156396d6d0a',1,'mqtt_opts.h']]],
+  ['mqtt_5frequest_5fcb_5ft_227',['mqtt_request_cb_t',['../group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd',1,'mqtt.h']]],
+  ['mqtt_5frequest_5ft_228',['mqtt_request_t',['../structmqtt__request__t.html',1,'']]],
+  ['mqtt_5fringbuf_5ffree_229',['mqtt_ringbuf_free',['../mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa',1,'mqtt.c']]],
+  ['mqtt_5fringbuf_5flinear_5fread_5flength_230',['mqtt_ringbuf_linear_read_length',['../mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3',1,'mqtt.c']]],
+  ['mqtt_5fringbuf_5ft_231',['mqtt_ringbuf_t',['../structmqtt__ringbuf__t.html',1,'']]],
+  ['mqtt_5fset_5finpub_5fcallback_232',['mqtt_set_inpub_callback',['../group__mqtt.html#gafdfa0e65b217e92835d35858924565cf',1,'mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb, mqtt_incoming_data_cb_t data_cb, void *arg):&#160;mqtt.c'],['../group__mqtt.html#gafdfa0e65b217e92835d35858924565cf',1,'mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb, mqtt_incoming_data_cb_t data_cb, void *arg):&#160;mqtt.c']]],
+  ['mqtt_5fsub_5funsub_233',['mqtt_sub_unsub',['../group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103',1,'mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub):&#160;mqtt.c'],['../group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103',1,'mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub):&#160;mqtt.c']]],
+  ['mqtt_5fsubscribe_234',['mqtt_subscribe',['../group__mqtt.html#ga83d6a6d811b201a74d793bc1b5d4e029',1,'mqtt.h']]],
+  ['mqtt_5ftls_5fport_235',['MQTT_TLS_PORT',['../group__mqtt.html#ga6610174f17b9ecbcf2bc66a4fd5a6b0f',1,'mqtt.h']]],
+  ['mqtt_5funsubscribe_236',['mqtt_unsubscribe',['../group__mqtt.html#ga0f133ef09cbe56c46ebe2cc21afccf3f',1,'mqtt.h']]],
+  ['mqtt_5fvar_5fheader_5fbuffer_5flen_237',['MQTT_VAR_HEADER_BUFFER_LEN',['../group__mqtt__opts.html#ga8275ef78a85fb14c3ac1423c70e45805',1,'mqtt_opts.h']]],
+  ['msg_238',['msg',['../structapi__msg.html#a7c67466a08e96f57f5cc8a41beb883b3',1,'api_msg']]],
+  ['msg_5fidx_239',['msg_idx',['../structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5',1,'mqtt_client_s']]],
+  ['mtu_240',['mtu',['../structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48',1,'netif']]],
+  ['mtu6_241',['mtu6',['../structnetif.html#acd78fca5dad6468605f38e327b3a5e72',1,'netif']]],
+  ['multicast_242',['Multicast',['../group__lwip__opts__multicast.html',1,'']]],
+  ['multicast_20listener_20discovery_243',['Multicast listener discovery',['../group__lwip__opts__mld6.html',1,'']]],
+  ['multicast_5fmsg_5fwaiting_244',['multicast_msg_waiting',['../structmdns__delayed__msg.html#a641abcf692a99e2c969048432b3c6adf',1,'mdns_delayed_msg']]],
+  ['multicast_5fprobe_5ftimeout_245',['multicast_probe_timeout',['../structmdns__delayed__msg.html#a5ca9fccc523b7820f8e67c9ccf921da8',1,'mdns_delayed_msg']]],
+  ['multicast_5ftimeout_246',['multicast_timeout',['../structmdns__delayed__msg.html#a6c7e581f1cf67daf039ffcaa31580e60',1,'mdns_delayed_msg']]],
+  ['multicast_5ftimeout_5f25ttl_247',['multicast_timeout_25TTL',['../structmdns__delayed__msg.html#a7052387506ef48b1db099c48f4ec5736',1,'mdns_delayed_msg']]],
+  ['multithreading_248',['Multithreading',['../multithreading.html',1,'']]],
+  ['mutexes_249',['Mutexes',['../group__sys__mutex.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_11.js b/doc/doxygen/output/html/search/all_11.js
index a0e2781..aced6eb 100644
--- a/doc/doxygen/output/html/search/all_11.js
+++ b/doc/doxygen/output/html/search/all_11.js
@@ -1,8 +1,8 @@
 var searchData=
 [
-  ['n_0',['n',['../structapi__msg.html#a46007ce4f08d3e396f068ab80c9a9ae1',1,'api_msg']]],
+  ['n_0',['n',['../structapi__msg.html#a9b0c707835838c2ffe55b85c2902d7ad',1,'api_msg']]],
   ['na_5fheader_1',['na_header',['../structna__header.html',1,'']]],
-  ['name_2',['name',['../structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784',1,'mdns_service::name'],['../structmdns__host.html#a560447b364854eb5480e137e09d3cd24',1,'mdns_host::name'],['../structnetif.html#a32fca6ffd28bb9af3f891a378827a67e',1,'netif::name'],['../structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53',1,'dns_api_msg::name']]],
+  ['name_2',['name',['../structmdns__request.html#a3ed18dad500125e0d63274c797bd52f5',1,'mdns_request::name'],['../structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784',1,'mdns_service::name'],['../structmdns__host.html#a560447b364854eb5480e137e09d3cd24',1,'mdns_host::name'],['../structnetif.html#a32fca6ffd28bb9af3f891a378827a67e',1,'netif::name'],['../structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53',1,'dns_api_msg::name']]],
   ['name_5fsize_3',['name_size',['../structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d',1,'netbios_answer']]],
   ['nd6_4',['nd6',['../structstats__.html#ab348a3a4b593b05d7df1293a06af8adf',1,'stats_']]],
   ['nd6_2ec_5',['nd6.c',['../nd6_8c.html',1,'']]],
@@ -124,7 +124,7 @@
   ['netdb_2ec_121',['netdb.c',['../netdb_8c.html',1,'']]],
   ['netdb_2eh_122',['netdb.h',['../compat_2posix_2netdb_8h.html',1,'(Global Namespace)'],['../lwip_2netdb_8h.html',1,'(Global Namespace)']]],
   ['netif_123',['NETIF',['../group__lwip__opts__netif.html',1,'NETIF'],['../group__netif.html',1,'Network interface (NETIF)']]],
-  ['netif_124',['netif',['../structnetif.html',1,'netif'],['../structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989',1,'mdns_packet::netif'],['../structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430',1,'mdns_outpacket::netif']]],
+  ['netif_124',['netif',['../structnetif.html',1,'']]],
   ['netif_20api_125',['NETIF API',['../group__netifapi.html',1,'']]],
   ['netif_20related_126',['NETIF related',['../group__netifapi__netif.html',1,'']]],
   ['netif_2ec_127',['netif.c',['../netif_8c.html',1,'']]],
@@ -151,92 +151,100 @@
   ['netif_5fflag_5fup_148',['NETIF_FLAG_UP',['../group__netif__flags.html#gab47d7d130693dc155f480a5bf447725e',1,'netif.h']]],
   ['netif_5fget_5fby_5findex_149',['netif_get_by_index',['../group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a',1,'netif_get_by_index(u8_t idx):&#160;netif.c'],['../group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a',1,'netif_get_by_index(u8_t idx):&#160;netif.c']]],
   ['netif_5fget_5fclient_5fdata_150',['netif_get_client_data',['../group__netif__cd.html#ga4bce01ddbf0fd70cb88431f773c91bc5',1,'netif.h']]],
-  ['netif_5fget_5fip6_5faddr_5fmatch_151',['netif_get_ip6_addr_match',['../netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc',1,'netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr):&#160;netif.c'],['../netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc',1,'netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr):&#160;netif.c']]],
-  ['netif_5figmp_5fdata_152',['netif_igmp_data',['../group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d',1,'igmp.h']]],
-  ['netif_5figmp_5fmac_5ffilter_5ffn_153',['netif_igmp_mac_filter_fn',['../netif_8h.html#a71cad3277efe29191eef3348f4bf21f7',1,'netif.h']]],
-  ['netif_5findex_5fto_5fname_154',['netif_index_to_name',['../group__netif.html#ga0e755cb6624d3365551eeed5430fa226',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c'],['../group__netif.html#ga0e755cb6624d3365551eeed5430fa226',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c']]],
-  ['netif_5finit_5ffn_155',['netif_init_fn',['../netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5',1,'netif.h']]],
-  ['netif_5finput_156',['netif_input',['../group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385',1,'netif_input(struct pbuf *p, struct netif *inp):&#160;netif.c'],['../group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385',1,'netif_input(struct pbuf *p, struct netif *inp):&#160;netif.c']]],
-  ['netif_5finput_5ffn_157',['netif_input_fn',['../netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e',1,'netif.h']]],
-  ['netif_5finvoke_5fext_5fcallback_158',['netif_invoke_ext_callback',['../netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c',1,'netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args):&#160;netif.c'],['../netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c',1,'netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args):&#160;netif.c']]],
-  ['netif_5fip6_5faddr_5fset_159',['netif_ip6_addr_set',['../group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb',1,'netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6):&#160;netif.c'],['../group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb',1,'netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6):&#160;netif.c']]],
-  ['netif_5fip6_5faddr_5fset_5fstate_160',['netif_ip6_addr_set_state',['../group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f',1,'netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state):&#160;netif.c'],['../group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f',1,'netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state):&#160;netif.c']]],
-  ['netif_5fis_5flink_5fup_161',['netif_is_link_up',['../netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8',1,'netif.h']]],
-  ['netif_5fis_5fup_162',['netif_is_up',['../group__netif.html#ga94a4c24c988afc0a577387730f303b19',1,'netif.h']]],
-  ['netif_5flinkoutput_5ffn_163',['netif_linkoutput_fn',['../netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed',1,'netif.h']]],
-  ['netif_5flist_164',['netif_list',['../netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list:&#160;netif.c'],['../netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list:&#160;netif.c']]],
-  ['netif_5floop_5foutput_165',['netif_loop_output',['../group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2',1,'netif_loop_output(struct netif *netif, struct pbuf *p):&#160;netif.c'],['../group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2',1,'netif_loop_output(struct netif *netif, struct pbuf *p):&#160;netif.c']]],
-  ['netif_5fmac_5ffilter_5faction_166',['netif_mac_filter_action',['../netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0',1,'netif.h']]],
-  ['netif_5fmax_5fhwaddr_5flen_167',['NETIF_MAX_HWADDR_LEN',['../netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41',1,'netif.h']]],
-  ['netif_5fmld6_5fdata_168',['netif_mld6_data',['../group__mld6.html#ga02a2259082f22c5989a3c929be95e641',1,'mld6.h']]],
-  ['netif_5fmld_5fmac_5ffilter_5ffn_169',['netif_mld_mac_filter_fn',['../netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468',1,'netif.h']]],
-  ['netif_5fname_5fto_5findex_170',['netif_name_to_index',['../group__netif.html#gac763a1f647fb9e8af4254418e813a6ae',1,'netif_name_to_index(const char *name):&#160;netif.c'],['../group__netif.html#gac763a1f647fb9e8af4254418e813a6ae',1,'netif_name_to_index(const char *name):&#160;netif.c']]],
-  ['netif_5fnamesize_171',['NETIF_NAMESIZE',['../netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a',1,'netif.h']]],
-  ['netif_5fnsc_5freason_5ft_172',['netif_nsc_reason_t',['../group__netif.html#gab2b9387389513a02027c62e246723808',1,'netif.h']]],
-  ['netif_5foutput_5ffn_173',['netif_output_fn',['../netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067',1,'netif.h']]],
-  ['netif_5foutput_5fip6_5ffn_174',['netif_output_ip6_fn',['../netif_8h.html#a343a5b14136a51957d552527384674b3',1,'netif.h']]],
-  ['netif_5fpoll_175',['netif_poll',['../netif_8c.html#a0fbaed78253d21e1b54e65651da3e327',1,'netif_poll(struct netif *netif):&#160;netif.c'],['../netif_8h.html#a0fbaed78253d21e1b54e65651da3e327',1,'netif_poll(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fremove_176',['netif_remove',['../group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979',1,'netif_remove(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979',1,'netif_remove(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fremove_5fext_5fcallback_177',['netif_remove_ext_callback',['../group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716',1,'netif_remove_ext_callback(netif_ext_callback_t *callback):&#160;netif.c'],['../group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716',1,'netif_remove_ext_callback(netif_ext_callback_t *callback):&#160;netif.c']]],
-  ['netif_5fset_5faddr_178',['netif_set_addr',['../group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1',1,'netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netif.c'],['../group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1',1,'netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netif.c']]],
-  ['netif_5fset_5fclient_5fdata_179',['netif_set_client_data',['../group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f',1,'netif.h']]],
-  ['netif_5fset_5fdefault_180',['netif_set_default',['../group__netif.html#gac90f290edd005238d62aa94c4ac9dea3',1,'netif_set_default(struct netif *netif):&#160;netif.c'],['../group__netif.html#gac90f290edd005238d62aa94c4ac9dea3',1,'netif_set_default(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fset_5fdown_181',['netif_set_down',['../group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf',1,'netif_set_down(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf',1,'netif_set_down(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fset_5fgw_182',['netif_set_gw',['../group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520',1,'netif_set_gw(struct netif *netif, const ip4_addr_t *gw):&#160;netif.c'],['../group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520',1,'netif_set_gw(struct netif *netif, const ip4_addr_t *gw):&#160;netif.c']]],
-  ['netif_5fset_5fipaddr_183',['netif_set_ipaddr',['../group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca',1,'netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr):&#160;netif.c'],['../group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca',1,'netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr):&#160;netif.c']]],
-  ['netif_5fset_5flink_5fcallback_184',['netif_set_link_callback',['../group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4',1,'netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback):&#160;netif.c'],['../group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4',1,'netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback):&#160;netif.c']]],
-  ['netif_5fset_5flink_5fdown_185',['netif_set_link_down',['../group__netif.html#ga34e37a1e8e358760dc1c43887922c7db',1,'netif_set_link_down(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga34e37a1e8e358760dc1c43887922c7db',1,'netif_set_link_down(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fset_5flink_5fup_186',['netif_set_link_up',['../group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea',1,'netif_set_link_up(struct netif *netif):&#160;netif.c'],['../group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea',1,'netif_set_link_up(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fset_5fnetmask_187',['netif_set_netmask',['../group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53',1,'netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask):&#160;netif.c'],['../group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53',1,'netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask):&#160;netif.c']]],
-  ['netif_5fset_5fremove_5fcallback_188',['netif_set_remove_callback',['../group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce',1,'netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback):&#160;netif.c'],['../group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce',1,'netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback):&#160;netif.c']]],
-  ['netif_5fset_5fstatus_5fcallback_189',['netif_set_status_callback',['../group__netif.html#gadc8787b23ac0ee023979cbadf87813d4',1,'netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback):&#160;netif.c'],['../group__netif.html#gadc8787b23ac0ee023979cbadf87813d4',1,'netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback):&#160;netif.c']]],
-  ['netif_5fset_5fup_190',['netif_set_up',['../group__netif.html#gaf19693be401a265a52d2a56c65753121',1,'netif_set_up(struct netif *netif):&#160;netif.c'],['../group__netif.html#gaf19693be401a265a52d2a56c65753121',1,'netif_set_up(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fstatus_5fcallback_5ffn_191',['netif_status_callback_fn',['../netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436',1,'netif.h']]],
-  ['netif_5fto_5fnum_192',['netif_to_num',['../snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de',1,'netif_to_num(const struct netif *netif):&#160;snmp_core.c'],['../snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de',1,'netif_to_num(const struct netif *netif):&#160;snmp_core.c']]],
-  ['netifapi_2ec_193',['netifapi.c',['../netifapi_8c.html',1,'']]],
-  ['netifapi_2eh_194',['netifapi.h',['../netifapi_8h.html',1,'']]],
-  ['netifapi_5farp_5fadd_195',['netifapi_arp_add',['../netifapi_8c.html#a62b0bdbb3783eb27aa73485081306119',1,'netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type):&#160;netifapi.c'],['../netifapi_8h.html#a62b0bdbb3783eb27aa73485081306119',1,'netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type):&#160;netifapi.c']]],
-  ['netifapi_5farp_5fremove_196',['netifapi_arp_remove',['../netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8',1,'netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type):&#160;netifapi.c'],['../netifapi_8h.html#a037c3d05c19b4d467b6ce06eb4639ee8',1,'netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type):&#160;netifapi.c']]],
-  ['netifapi_5fautoip_5fstart_197',['netifapi_autoip_start',['../group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2',1,'netifapi.h']]],
-  ['netifapi_5fautoip_5fstop_198',['netifapi_autoip_stop',['../group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d',1,'netifapi.h']]],
-  ['netifapi_5fdhcp_5finform_199',['netifapi_dhcp_inform',['../group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0',1,'netifapi.h']]],
-  ['netifapi_5fdhcp_5frelease_200',['netifapi_dhcp_release',['../group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409',1,'netifapi.h']]],
-  ['netifapi_5fdhcp_5frelease_5fand_5fstop_201',['netifapi_dhcp_release_and_stop',['../group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134',1,'netifapi.h']]],
-  ['netifapi_5fdhcp_5frenew_202',['netifapi_dhcp_renew',['../group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b',1,'netifapi.h']]],
-  ['netifapi_5fdhcp_5fstart_203',['netifapi_dhcp_start',['../group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765',1,'netifapi.h']]],
-  ['netifapi_5fdhcp_5fstop_204',['netifapi_dhcp_stop',['../group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5',1,'netifapi.h']]],
-  ['netifapi_5fnetif_5fadd_205',['netifapi_netif_add',['../group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519',1,'netifapi_netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netifapi.c'],['../group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519',1,'netifapi_netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netifapi.c']]],
-  ['netifapi_5fnetif_5fcommon_206',['netifapi_netif_common',['../netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7',1,'netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc):&#160;netifapi.c'],['../netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7',1,'netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc):&#160;netifapi.c']]],
-  ['netifapi_5fnetif_5findex_5fto_5fname_207',['netifapi_netif_index_to_name',['../group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6',1,'netifapi.c']]],
-  ['netifapi_5fnetif_5fname_5fto_5findex_208',['netifapi_netif_name_to_index',['../group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089',1,'netifapi.c']]],
-  ['netifapi_5fnetif_5fremove_209',['netifapi_netif_remove',['../group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373',1,'netifapi.h']]],
-  ['netifapi_5fnetif_5fset_5faddr_210',['netifapi_netif_set_addr',['../group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973',1,'netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netifapi.c'],['../group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973',1,'netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netifapi.c']]],
-  ['netifapi_5fnetif_5fset_5fdefault_211',['netifapi_netif_set_default',['../group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf',1,'netifapi.h']]],
-  ['netifapi_5fnetif_5fset_5fdown_212',['netifapi_netif_set_down',['../group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16',1,'netifapi.h']]],
-  ['netifapi_5fnetif_5fset_5flink_5fdown_213',['netifapi_netif_set_link_down',['../group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4',1,'netifapi.h']]],
-  ['netifapi_5fnetif_5fset_5flink_5fup_214',['netifapi_netif_set_link_up',['../group__netifapi__netif.html#gac054a60a32447019913d34da63924853',1,'netifapi.h']]],
-  ['netifapi_5fnetif_5fset_5fup_215',['netifapi_netif_set_up',['../group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76',1,'netifapi.h']]],
-  ['netifs_216',['NETIFs',['../group__netifs.html',1,'']]],
-  ['netvector_217',['netvector',['../structnetvector.html',1,'']]],
-  ['network_20buffers_218',['Network buffers',['../group__netbuf.html',1,'']]],
-  ['network_20interface_20netif_219',['Network interface (NETIF)',['../group__netif.html',1,'']]],
-  ['next_220',['next',['../structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf',1,'mem::next'],['../structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b',1,'mqtt_request_t::next'],['../structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e',1,'snmp_varbind::next'],['../structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78',1,'igmp_group::next'],['../structmld__group.html#a9273a345a5754241bf26ddc835d27ddc',1,'mld_group::next'],['../structnetif.html#ae77736b64df442242795220d76be6b86',1,'netif::next'],['../structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341',1,'pbuf::next'],['../structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7',1,'pbuf_rom::next'],['../structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a',1,'lwip_select_cb::next'],['../structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34',1,'tcp_pcb_listen::next'],['../structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260',1,'tcp_pcb::next']]],
-  ['no_5fsys_221',['NO_SYS',['../group__lwip__nosys.html',1,'Mainloop mode (&quot;NO_SYS&quot;)'],['../group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b',1,'NO_SYS:&#160;opt.h'],['../group__lwip__opts__nosys.html',1,'NO_SYS']]],
-  ['node_222',['node',['../structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac',1,'snmp_node_instance::node'],['../structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386',1,'snmp_tree_node::node'],['../structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992',1,'snmp_leaf_node::node'],['../structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1',1,'snmp_scalar_node::node'],['../structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b',1,'snmp_scalar_array_node::node'],['../structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18',1,'snmp_table_node::node']]],
-  ['node_5ftype_223',['node_type',['../structsnmp__node.html#a1af8e20a688943a419b307bf123b1851',1,'snmp_node']]],
-  ['non_20standard_20functions_224',['Non-standard functions',['../group__sys__nonstandard.html',1,'']]],
-  ['ns_5fheader_225',['ns_header',['../structns__header.html',1,'']]],
-  ['num_226',['num',['../structnetif.html#ab7ef01e505dd2feb781fe86756b1c973',1,'netif::num'],['../structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7',1,'memp_desc::num']]],
-  ['number_5fof_5falignment_5ferrors_227',['number_of_alignment_errors',['../structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2',1,'netbios_answer']]],
-  ['number_5fof_5fcollisions_228',['number_of_collisions',['../structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e',1,'netbios_answer']]],
-  ['number_5fof_5fcrcs_229',['number_of_crcs',['../structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8',1,'netbios_answer']]],
-  ['number_5fof_5ffree_5fcommand_5fblocks_230',['number_of_free_command_blocks',['../structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219',1,'netbios_answer']]],
-  ['number_5fof_5fgood_5freceives_231',['number_of_good_receives',['../structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea',1,'netbios_answer']]],
-  ['number_5fof_5fgood_5fsends_232',['number_of_good_sends',['../structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd',1,'netbios_answer']]],
-  ['number_5fof_5fnames_233',['number_of_names',['../structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491',1,'netbios_answer']]],
-  ['number_5fof_5fno_5fresource_5fcondition_234',['number_of_no_resource_condition',['../structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42',1,'netbios_answer']]],
-  ['number_5fof_5fpending_5fsessions_235',['number_of_pending_sessions',['../structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d',1,'netbios_answer']]],
-  ['number_5fof_5fretransmits_236',['number_of_retransmits',['../structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321',1,'netbios_answer']]],
-  ['number_5fof_5fsend_5faborts_237',['number_of_send_aborts',['../structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408',1,'netbios_answer']]],
-  ['numbers_238',['numbers',['../group__iana.html',1,'IANA assigned numbers'],['../group__ieee.html',1,'IEEE assigned numbers']]]
+  ['netif_5fget_5figmp_5fmac_5ffilter_151',['netif_get_igmp_mac_filter',['../netif_8h.html#a0a674553c18b429b53397372ea82fcaf',1,'netif.h']]],
+  ['netif_5fget_5fip6_5faddr_5fmatch_152',['netif_get_ip6_addr_match',['../netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc',1,'netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr):&#160;netif.c'],['../netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc',1,'netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr):&#160;netif.c']]],
+  ['netif_5fget_5fmld_5fmac_5ffilter_153',['netif_get_mld_mac_filter',['../netif_8h.html#a046c4816e37c3c4b84b3634eeeea7029',1,'netif.h']]],
+  ['netif_5figmp_5fdata_154',['netif_igmp_data',['../group__igmp.html#gad990dfc5ed8b644c16cc578c876e588d',1,'igmp.h']]],
+  ['netif_5figmp_5fmac_5ffilter_5ffn_155',['netif_igmp_mac_filter_fn',['../netif_8h.html#a71cad3277efe29191eef3348f4bf21f7',1,'netif.h']]],
+  ['netif_5findex_5fto_5fname_156',['netif_index_to_name',['../group__netif.html#ga0e755cb6624d3365551eeed5430fa226',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c'],['../group__netif.html#ga0e755cb6624d3365551eeed5430fa226',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c']]],
+  ['netif_5finit_5ffn_157',['netif_init_fn',['../netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5',1,'netif.h']]],
+  ['netif_5finput_158',['netif_input',['../group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385',1,'netif_input(struct pbuf *p, struct netif *inp):&#160;netif.c'],['../group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385',1,'netif_input(struct pbuf *p, struct netif *inp):&#160;netif.c']]],
+  ['netif_5finput_5ffn_159',['netif_input_fn',['../netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e',1,'netif.h']]],
+  ['netif_5finvoke_5fext_5fcallback_160',['netif_invoke_ext_callback',['../netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c',1,'netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args):&#160;netif.c'],['../netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c',1,'netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args):&#160;netif.c']]],
+  ['netif_5fip6_5faddr_5fset_161',['netif_ip6_addr_set',['../group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb',1,'netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6):&#160;netif.c'],['../group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb',1,'netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6):&#160;netif.c']]],
+  ['netif_5fip6_5faddr_5fset_5fstate_162',['netif_ip6_addr_set_state',['../group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f',1,'netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state):&#160;netif.c'],['../group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f',1,'netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state):&#160;netif.c']]],
+  ['netif_5fis_5flink_5fup_163',['netif_is_link_up',['../netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8',1,'netif.h']]],
+  ['netif_5fis_5fup_164',['netif_is_up',['../group__netif.html#ga94a4c24c988afc0a577387730f303b19',1,'netif.h']]],
+  ['netif_5flinkoutput_5ffn_165',['netif_linkoutput_fn',['../netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed',1,'netif.h']]],
+  ['netif_5flist_166',['netif_list',['../netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list:&#160;netif.c'],['../netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list:&#160;netif.c']]],
+  ['netif_5floop_5foutput_167',['netif_loop_output',['../group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2',1,'netif_loop_output(struct netif *netif, struct pbuf *p):&#160;netif.c'],['../group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2',1,'netif_loop_output(struct netif *netif, struct pbuf *p):&#160;netif.c']]],
+  ['netif_5fmac_5ffilter_5faction_168',['netif_mac_filter_action',['../netif_8h.html#ab194ec4241fad8b6e9aac51e3ec23de0',1,'netif.h']]],
+  ['netif_5fmax_5fhwaddr_5flen_169',['NETIF_MAX_HWADDR_LEN',['../netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41',1,'netif.h']]],
+  ['netif_5fmdns_5fdata_170',['netif_mdns_data',['../mdns_8c.html#af15fa5b6331bec605f68f53cb87f58fa',1,'netif_mdns_data(struct netif *netif):&#160;mdns.c'],['../mdns__priv_8h.html#af15fa5b6331bec605f68f53cb87f58fa',1,'netif_mdns_data(struct netif *netif):&#160;mdns.c']]],
+  ['netif_5fmld6_5fdata_171',['netif_mld6_data',['../group__mld6.html#ga02a2259082f22c5989a3c929be95e641',1,'mld6.h']]],
+  ['netif_5fmld_5fmac_5ffilter_5ffn_172',['netif_mld_mac_filter_fn',['../netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468',1,'netif.h']]],
+  ['netif_5fname_5fto_5findex_173',['netif_name_to_index',['../group__netif.html#gac763a1f647fb9e8af4254418e813a6ae',1,'netif_name_to_index(const char *name):&#160;netif.c'],['../group__netif.html#gac763a1f647fb9e8af4254418e813a6ae',1,'netif_name_to_index(const char *name):&#160;netif.c']]],
+  ['netif_5fnamesize_174',['NETIF_NAMESIZE',['../netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a',1,'netif.h']]],
+  ['netif_5fnsc_5freason_5ft_175',['netif_nsc_reason_t',['../group__netif.html#gab2b9387389513a02027c62e246723808',1,'netif.h']]],
+  ['netif_5foutput_5ffn_176',['netif_output_fn',['../netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067',1,'netif.h']]],
+  ['netif_5foutput_5fip6_5ffn_177',['netif_output_ip6_fn',['../netif_8h.html#a343a5b14136a51957d552527384674b3',1,'netif.h']]],
+  ['netif_5fpoll_178',['netif_poll',['../netif_8c.html#a0fbaed78253d21e1b54e65651da3e327',1,'netif_poll(struct netif *netif):&#160;netif.c'],['../netif_8h.html#a0fbaed78253d21e1b54e65651da3e327',1,'netif_poll(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fremove_179',['netif_remove',['../group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979',1,'netif_remove(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979',1,'netif_remove(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fremove_5fext_5fcallback_180',['netif_remove_ext_callback',['../group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716',1,'netif_remove_ext_callback(netif_ext_callback_t *callback):&#160;netif.c'],['../group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716',1,'netif_remove_ext_callback(netif_ext_callback_t *callback):&#160;netif.c']]],
+  ['netif_5fset_5faddr_181',['netif_set_addr',['../group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1',1,'netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netif.c'],['../group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1',1,'netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netif.c']]],
+  ['netif_5fset_5fclient_5fdata_182',['netif_set_client_data',['../group__netif__cd.html#ga5ce61a277e1951183f7b7d03742c231f',1,'netif.h']]],
+  ['netif_5fset_5fdefault_183',['netif_set_default',['../group__netif.html#gac90f290edd005238d62aa94c4ac9dea3',1,'netif_set_default(struct netif *netif):&#160;netif.c'],['../group__netif.html#gac90f290edd005238d62aa94c4ac9dea3',1,'netif_set_default(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fset_5fdown_184',['netif_set_down',['../group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf',1,'netif_set_down(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf',1,'netif_set_down(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fset_5fgw_185',['netif_set_gw',['../group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520',1,'netif_set_gw(struct netif *netif, const ip4_addr_t *gw):&#160;netif.c'],['../group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520',1,'netif_set_gw(struct netif *netif, const ip4_addr_t *gw):&#160;netif.c']]],
+  ['netif_5fset_5figmp_5fmac_5ffilter_186',['netif_set_igmp_mac_filter',['../group__netif.html#ga3428b3f8195249c6cd8704a4db46b401',1,'netif.h']]],
+  ['netif_5fset_5fipaddr_187',['netif_set_ipaddr',['../group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca',1,'netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr):&#160;netif.c'],['../group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca',1,'netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr):&#160;netif.c']]],
+  ['netif_5fset_5flink_5fcallback_188',['netif_set_link_callback',['../group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4',1,'netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback):&#160;netif.c'],['../group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4',1,'netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback):&#160;netif.c']]],
+  ['netif_5fset_5flink_5fdown_189',['netif_set_link_down',['../group__netif.html#ga34e37a1e8e358760dc1c43887922c7db',1,'netif_set_link_down(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga34e37a1e8e358760dc1c43887922c7db',1,'netif_set_link_down(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fset_5flink_5fup_190',['netif_set_link_up',['../group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea',1,'netif_set_link_up(struct netif *netif):&#160;netif.c'],['../group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea',1,'netif_set_link_up(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fset_5fmld_5fmac_5ffilter_191',['netif_set_mld_mac_filter',['../group__netif.html#ga97f30bb5542e4c07d3b32e3c754e104c',1,'netif.h']]],
+  ['netif_5fset_5fnetmask_192',['netif_set_netmask',['../group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53',1,'netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask):&#160;netif.c'],['../group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53',1,'netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask):&#160;netif.c']]],
+  ['netif_5fset_5fremove_5fcallback_193',['netif_set_remove_callback',['../group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce',1,'netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback):&#160;netif.c'],['../group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce',1,'netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback):&#160;netif.c']]],
+  ['netif_5fset_5fstatus_5fcallback_194',['netif_set_status_callback',['../group__netif.html#gadc8787b23ac0ee023979cbadf87813d4',1,'netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback):&#160;netif.c'],['../group__netif.html#gadc8787b23ac0ee023979cbadf87813d4',1,'netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback):&#160;netif.c']]],
+  ['netif_5fset_5fup_195',['netif_set_up',['../group__netif.html#gaf19693be401a265a52d2a56c65753121',1,'netif_set_up(struct netif *netif):&#160;netif.c'],['../group__netif.html#gaf19693be401a265a52d2a56c65753121',1,'netif_set_up(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fstatus_5fcallback_5ffn_196',['netif_status_callback_fn',['../netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436',1,'netif.h']]],
+  ['netif_5fto_5fnum_197',['netif_to_num',['../snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de',1,'netif_to_num(const struct netif *netif):&#160;snmp_core.c'],['../snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de',1,'netif_to_num(const struct netif *netif):&#160;snmp_core.c']]],
+  ['netifapi_2ec_198',['netifapi.c',['../netifapi_8c.html',1,'']]],
+  ['netifapi_2eh_199',['netifapi.h',['../netifapi_8h.html',1,'']]],
+  ['netifapi_5farp_5fadd_200',['netifapi_arp_add',['../group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119',1,'netifapi.c']]],
+  ['netifapi_5farp_5fremove_201',['netifapi_arp_remove',['../group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8',1,'netifapi.c']]],
+  ['netifapi_5fautoip_5fstart_202',['netifapi_autoip_start',['../group__netifapi__autoip.html#gaca26bae2a21e0732a7599df14f880af2',1,'netifapi.h']]],
+  ['netifapi_5fautoip_5fstop_203',['netifapi_autoip_stop',['../group__netifapi__autoip.html#gae604f96907a52557e4ebd1bd5d80071d',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5finform_204',['netifapi_dhcp_inform',['../group__netifapi__dhcp4.html#ga29108975e9aa6463b9a574de961317e0',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5frelease_205',['netifapi_dhcp_release',['../group__netifapi__dhcp4.html#ga5aeaee24c11128df90a56fe091c9d409',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5frelease_5fand_5fstop_206',['netifapi_dhcp_release_and_stop',['../group__netifapi__dhcp4.html#ga1971af04f882f5afdb3ade454a680134',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5frenew_207',['netifapi_dhcp_renew',['../group__netifapi__dhcp4.html#ga642390e5efa53ad3095e01331c6a936b',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5fstart_208',['netifapi_dhcp_start',['../group__netifapi__dhcp4.html#gae64d13afc6e3b0f21aae04b66d0e3765',1,'netifapi.h']]],
+  ['netifapi_5fdhcp_5fstop_209',['netifapi_dhcp_stop',['../group__netifapi__dhcp4.html#ga2322c0d0e3eb6c1097d6f3942905dbd5',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fadd_210',['netifapi_netif_add',['../group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519',1,'netifapi_netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netifapi.c'],['../group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519',1,'netifapi_netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netifapi.c']]],
+  ['netifapi_5fnetif_5fcommon_211',['netifapi_netif_common',['../netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7',1,'netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc):&#160;netifapi.c'],['../netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7',1,'netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc):&#160;netifapi.c']]],
+  ['netifapi_5fnetif_5findex_5fto_5fname_212',['netifapi_netif_index_to_name',['../group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6',1,'netifapi.c']]],
+  ['netifapi_5fnetif_5fname_5fto_5findex_213',['netifapi_netif_name_to_index',['../group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089',1,'netifapi.c']]],
+  ['netifapi_5fnetif_5fremove_214',['netifapi_netif_remove',['../group__netifapi__netif.html#ga0e3f522b900a0ba04421c4587e790373',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5faddr_215',['netifapi_netif_set_addr',['../group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973',1,'netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netifapi.c'],['../group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973',1,'netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netifapi.c']]],
+  ['netifapi_5fnetif_5fset_5fdefault_216',['netifapi_netif_set_default',['../group__netifapi__netif.html#ga862d6cfa5d36b2c36d7b1671e8d95ccf',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5fdown_217',['netifapi_netif_set_down',['../group__netifapi__netif.html#ga22c02edde32743ccfd41924da0601a16',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5flink_5fdown_218',['netifapi_netif_set_link_down',['../group__netifapi__netif.html#ga2a9694804743f5466c4ecc400b7f07e4',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5flink_5fup_219',['netifapi_netif_set_link_up',['../group__netifapi__netif.html#gac054a60a32447019913d34da63924853',1,'netifapi.h']]],
+  ['netifapi_5fnetif_5fset_5fup_220',['netifapi_netif_set_up',['../group__netifapi__netif.html#ga6ce735fe79efe1739e53b7f0e975ac76',1,'netifapi.h']]],
+  ['netifs_221',['NETIFs',['../group__netifs.html',1,'']]],
+  ['netvector_222',['netvector',['../structnetvector.html',1,'']]],
+  ['network_20buffers_223',['Network buffers',['../group__netbuf.html',1,'']]],
+  ['network_20interface_20netif_224',['Network interface (NETIF)',['../group__netif.html',1,'']]],
+  ['next_225',['next',['../structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf',1,'mem::next'],['../structacd.html#aa14c2b88cd471839d5b5de80bb46a9aa',1,'acd::next'],['../structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b',1,'mqtt_request_t::next'],['../structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e',1,'snmp_varbind::next'],['../structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78',1,'igmp_group::next'],['../structmld__group.html#a9273a345a5754241bf26ddc835d27ddc',1,'mld_group::next'],['../structnetif.html#ae77736b64df442242795220d76be6b86',1,'netif::next'],['../structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341',1,'pbuf::next'],['../structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7',1,'pbuf_rom::next'],['../structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a',1,'lwip_select_cb::next'],['../structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34',1,'tcp_pcb_listen::next'],['../structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260',1,'tcp_pcb::next']]],
+  ['next_5fanswer_226',['next_answer',['../structmdns__packet.html#a1ff4547d0866f338d1c58fc1dadf43f1',1,'mdns_packet']]],
+  ['next_5ftc_5fquestion_227',['next_tc_question',['../structmdns__packet.html#afdb78218c1775073762d9560986c119b',1,'mdns_packet']]],
+  ['no_5fsys_228',['NO_SYS',['../group__lwip__nosys.html',1,'Mainloop mode (&quot;NO_SYS&quot;)'],['../group__lwip__opts__nosys.html#gae00ba99de94a5bf84d832be8976df59b',1,'NO_SYS:&#160;opt.h'],['../group__lwip__opts__nosys.html',1,'NO_SYS']]],
+  ['node_229',['node',['../structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac',1,'snmp_node_instance::node'],['../structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386',1,'snmp_tree_node::node'],['../structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992',1,'snmp_leaf_node::node'],['../structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1',1,'snmp_scalar_node::node'],['../structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b',1,'snmp_scalar_array_node::node'],['../structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18',1,'snmp_table_node::node']]],
+  ['node_5ftype_230',['node_type',['../structsnmp__node.html#a1af8e20a688943a419b307bf123b1851',1,'snmp_node']]],
+  ['non_20standard_20functions_231',['Non-standard functions',['../group__sys__nonstandard.html',1,'']]],
+  ['ns_5fheader_232',['ns_header',['../structns__header.html',1,'']]],
+  ['num_233',['num',['../structnetif.html#ab7ef01e505dd2feb781fe86756b1c973',1,'netif::num'],['../structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7',1,'memp_desc::num']]],
+  ['num_5fconflicts_234',['num_conflicts',['../structacd.html#ab40b6b3cf57634135753f2426207f84a',1,'acd::num_conflicts'],['../structmdns__host.html#a07aadf9f308eee16a99041635df38123',1,'mdns_host::num_conflicts']]],
+  ['number_5fof_5falignment_5ferrors_235',['number_of_alignment_errors',['../structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2',1,'netbios_answer']]],
+  ['number_5fof_5fcollisions_236',['number_of_collisions',['../structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e',1,'netbios_answer']]],
+  ['number_5fof_5fcrcs_237',['number_of_crcs',['../structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8',1,'netbios_answer']]],
+  ['number_5fof_5ffree_5fcommand_5fblocks_238',['number_of_free_command_blocks',['../structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219',1,'netbios_answer']]],
+  ['number_5fof_5fgood_5freceives_239',['number_of_good_receives',['../structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea',1,'netbios_answer']]],
+  ['number_5fof_5fgood_5fsends_240',['number_of_good_sends',['../structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd',1,'netbios_answer']]],
+  ['number_5fof_5fnames_241',['number_of_names',['../structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491',1,'netbios_answer']]],
+  ['number_5fof_5fno_5fresource_5fcondition_242',['number_of_no_resource_condition',['../structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42',1,'netbios_answer']]],
+  ['number_5fof_5fpending_5fsessions_243',['number_of_pending_sessions',['../structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d',1,'netbios_answer']]],
+  ['number_5fof_5fretransmits_244',['number_of_retransmits',['../structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321',1,'netbios_answer']]],
+  ['number_5fof_5fsend_5faborts_245',['number_of_send_aborts',['../structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408',1,'netbios_answer']]],
+  ['numbers_246',['numbers',['../group__iana.html',1,'IANA assigned numbers'],['../group__ieee.html',1,'IEEE assigned numbers']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_12.js b/doc/doxygen/output/html/search/all_12.js
index 21e8d4a..0f24586 100644
--- a/doc/doxygen/output/html/search/all_12.js
+++ b/doc/doxygen/output/html/search/all_12.js
@@ -5,17 +5,18 @@
   ['old_5faddress_2',['old_address',['../structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade',1,'netif_ext_callback_args_t::ipv4_changed_s::old_address'],['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226',1,'netif_ext_callback_args_t::ipv6_set_s::old_address']]],
   ['old_5fstate_3',['old_state',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s']]],
   ['only_4',['only',['../group__ip4addr.html',1,'IPv4 only'],['../group__ip6addr.html',1,'IPv6 only'],['../group__netconn__tcp.html',1,'TCP only'],['../group__netconn__udp.html',1,'UDP only']]],
-  ['op_5fcompleted_5',['op_completed',['../structnetconn.html#a982506698a59f185ff3f16d1675ea4ae',1,'netconn']]],
-  ['open_6',['open',['../structtftp__context.html#a65d6359e2aac571813c05c61676c01a1',1,'tftp_context']]],
-  ['opt_2eh_7',['opt.h',['../opt_8h.html',1,'']]],
-  ['optimization_20hints_8',['Optimization hints',['../optimization.html',1,'']]],
-  ['options_9',['Options',['../group__httpd__opts.html',1,'Options'],['../group__mdns__opts.html',1,'Options'],['../group__mqtt__opts.html',1,'Options'],['../group__netbiosns__opts.html',1,'Options'],['../group__smtp__opts.html',1,'Options'],['../group__snmp__opts.html',1,'Options'],['../group__sntp__opts.html',1,'Options'],['../group__tftp__opts.html',1,'Options'],['../group__bridgeif__opts.html',1,'Options']]],
-  ['options_20lwipopts_20h_10',['Options (lwipopts.h)',['../group__lwip__opts.html',1,'']]],
-  ['original_11',['original',['../structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d',1,'pbuf_custom_ref']]],
-  ['os_20abstraction_20layer_12',['OS abstraction layer',['../group__sys__os.html',1,'']]],
-  ['os_20mode_20tcpip_20thread_13',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
-  ['output_14',['output',['../structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c',1,'mqtt_client_s::output'],['../structnetif.html#a8e1dcfe65db487feecd244355f39215e',1,'netif::output']]],
-  ['output_5fip6_15',['output_ip6',['../structnetif.html#ac38383379cff22c402156fec71c19617',1,'netif']]],
-  ['over_20ble_20rfc7668_16',['6LoWPAN over BLE (RFC7668)',['../group__rfc7668if.html',1,'']]],
-  ['overview_17',['Overview',['../index.html',1,'']]]
+  ['only_5fptr_5',['only_ptr',['../structmdns__request.html#a1080b561c8dcb322fb2af64217b13f64',1,'mdns_request']]],
+  ['op_5fcompleted_6',['op_completed',['../structnetconn.html#a982506698a59f185ff3f16d1675ea4ae',1,'netconn']]],
+  ['open_7',['open',['../structtftp__context.html#a65d6359e2aac571813c05c61676c01a1',1,'tftp_context']]],
+  ['opt_2eh_8',['opt.h',['../opt_8h.html',1,'']]],
+  ['optimization_20hints_9',['Optimization hints',['../optimization.html',1,'']]],
+  ['options_10',['Options',['../group__httpd__opts.html',1,'Options'],['../group__mdns__opts.html',1,'Options'],['../group__mqtt__opts.html',1,'Options'],['../group__netbiosns__opts.html',1,'Options'],['../group__smtp__opts.html',1,'Options'],['../group__snmp__opts.html',1,'Options'],['../group__sntp__opts.html',1,'Options'],['../group__tftp__opts.html',1,'Options'],['../group__bridgeif__opts.html',1,'Options']]],
+  ['options_20lwipopts_20h_11',['Options (lwipopts.h)',['../group__lwip__opts.html',1,'']]],
+  ['original_12',['original',['../structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d',1,'pbuf_custom_ref']]],
+  ['os_20abstraction_20layer_13',['OS abstraction layer',['../group__sys__os.html',1,'']]],
+  ['os_20mode_20tcpip_20thread_14',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
+  ['output_15',['output',['../structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c',1,'mqtt_client_s::output'],['../structnetif.html#a8e1dcfe65db487feecd244355f39215e',1,'netif::output']]],
+  ['output_5fip6_16',['output_ip6',['../structnetif.html#ac38383379cff22c402156fec71c19617',1,'netif']]],
+  ['over_20ble_20rfc7668_17',['6LoWPAN over BLE (RFC7668)',['../group__rfc7668if.html',1,'']]],
+  ['overview_18',['Overview',['../index.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_13.js b/doc/doxygen/output/html/search/all_13.js
index bc80061..6f2729a 100644
--- a/doc/doxygen/output/html/search/all_13.js
+++ b/doc/doxygen/output/html/search/all_13.js
@@ -107,9 +107,8 @@
   ['pppos_2ec_104',['pppos.c',['../pppos_8c.html',1,'']]],
   ['pppos_2eh_105',['pppos.h',['../pppos_8h.html',1,'']]],
   ['prev_106',['prev',['../structmem.html#a9d7722ed10adf965fa98563d502f98ac',1,'mem::prev'],['../structsnmp__varbind.html#a365abcc1f80d28dc8ffd07193099c760',1,'snmp_varbind::prev'],['../structlwip__select__cb.html#a21a98e316bb7001d8750b20f5a7d0aa7',1,'lwip_select_cb::prev']]],
-  ['probes_5fsent_107',['probes_sent',['../structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922',1,'mdns_host']]],
-  ['probing_5fstate_108',['probing_state',['../structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61',1,'mdns_host']]],
-  ['proto_109',['proto',['../structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d',1,'mdns_service']]],
-  ['protocol_110',['ZEP - ZigBee Encapsulation Protocol',['../group__zepif.html',1,'']]],
-  ['ptr_111',['ptr',['../structnetvector.html#a523362737ea7764f9aaa73a050a0b983',1,'netvector']]]
+  ['probe_5fquery_5frecv_107',['probe_query_recv',['../structmdns__outmsg.html#a4a3ee99f7c25e88f17ea912897617aa0',1,'mdns_outmsg']]],
+  ['proto_108',['proto',['../structmdns__request.html#a497e1b8f664dab9904a89e5f15f5bc60',1,'mdns_request::proto'],['../structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d',1,'mdns_service::proto']]],
+  ['protocol_109',['ZEP - ZigBee Encapsulation Protocol',['../group__zepif.html',1,'']]],
+  ['ptr_110',['ptr',['../structnetvector.html#a523362737ea7764f9aaa73a050a0b983',1,'netvector']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_14.js b/doc/doxygen/output/html/search/all_14.js
index a90dd28..3af421f 100644
--- a/doc/doxygen/output/html/search/all_14.js
+++ b/doc/doxygen/output/html/search/all_14.js
@@ -1,7 +1,10 @@
 var searchData=
 [
   ['q_0',['q',['../structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df',1,'nd6_neighbor_cache_entry']]],
-  ['query_5fname_1',['query_name',['../structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b',1,'netbios_answer']]],
-  ['questions_2',['questions',['../structmdns__packet.html#a09211e78f7f773c492b5856d31423699',1,'mdns_packet::questions'],['../structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c',1,'mdns_outpacket::questions']]],
-  ['questions_5fleft_3',['questions_left',['../structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437',1,'mdns_packet']]]
+  ['qtype_1',['qtype',['../structmdns__request.html#a5a9261362213a1a790a0b3451916f669',1,'mdns_request']]],
+  ['query_2',['query',['../structmdns__outmsg.html#a3f6810fb1f2a989afcbc2fd852a20386',1,'mdns_outmsg']]],
+  ['query_5fname_3',['query_name',['../structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b',1,'netbios_answer']]],
+  ['question_5fprobe_5fhost_5fany_4',['QUESTION_PROBE_HOST_ANY',['../mdns__out_8h.html#ab3297d69b0effb5eb01a9b8c5a708ea9',1,'mdns_out.h']]],
+  ['questions_5',['questions',['../structmdns__packet.html#a09211e78f7f773c492b5856d31423699',1,'mdns_packet::questions'],['../structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c',1,'mdns_outpacket::questions']]],
+  ['questions_5fleft_6',['questions_left',['../structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437',1,'mdns_packet']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_15.js b/doc/doxygen/output/html/search/all_15.js
index 6590657..a1b4c19 100644
--- a/doc/doxygen/output/html/search/all_15.js
+++ b/doc/doxygen/output/html/search/all_15.js
@@ -1,63 +1,65 @@
 var searchData=
 [
-  ['r_0',['r',['../structapi__msg.html#a50e8d6dfa0ba30ae7e39c336bf68742c',1,'api_msg']]],
+  ['r_0',['r',['../structapi__msg.html#adbb33e03089db527b0af7e4b22f04e1c',1,'api_msg']]],
   ['ram_5fheap_1',['ram_heap',['../mem_8c.html#aeb811c25ce74d9ff398ccbb29874bba9',1,'mem.c']]],
-  ['raw_2',['RAW',['../group__raw__raw.html',1,'RAW'],['../group__lwip__opts__raw.html',1,'RAW']]],
-  ['raw_20apis_3',['&quot;raw&quot; APIs',['../group__callbackstyle__api.html',1,'']]],
-  ['raw_2ec_4',['raw.c',['../raw_8c.html',1,'']]],
-  ['raw_2eh_5',['raw.h',['../raw_8h.html',1,'']]],
-  ['raw_5fbind_6',['raw_bind',['../group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4',1,'raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4',1,'raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c']]],
-  ['raw_5fbind_5fnetif_7',['raw_bind_netif',['../group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a',1,'raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif):&#160;raw.c'],['../group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a',1,'raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif):&#160;raw.c']]],
-  ['raw_5fconnect_8',['raw_connect',['../group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168',1,'raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168',1,'raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c']]],
-  ['raw_5fdebug_9',['RAW_DEBUG',['../group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25',1,'opt.h']]],
-  ['raw_5fdisconnect_10',['raw_disconnect',['../group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef',1,'raw_disconnect(struct raw_pcb *pcb):&#160;raw.c'],['../group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef',1,'raw_disconnect(struct raw_pcb *pcb):&#160;raw.c']]],
-  ['raw_5finput_11',['raw_input',['../raw_8c.html#a03c4582d9ecf687e1f31d597c7889553',1,'raw_input(struct pbuf *p, struct netif *inp):&#160;raw.c'],['../raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553',1,'raw_input(struct pbuf *p, struct netif *inp):&#160;raw.c']]],
-  ['raw_5finput_5fstate_12',['raw_input_state',['../raw__priv_8h.html#a2580ec946c4196127888d5405257866b',1,'raw_priv.h']]],
-  ['raw_5finput_5fstate_5ft_13',['raw_input_state_t',['../raw__priv_8h.html#a50dd44a4fb984a1975e15dd073d34e8d',1,'raw_priv.h']]],
-  ['raw_5fnetif_5fip_5faddr_5fchanged_14',['raw_netif_ip_addr_changed',['../raw_8c.html#a61dc42f18e34800643000e48be6543ab',1,'raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;raw.c'],['../raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab',1,'raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;raw.c']]],
-  ['raw_5fnew_15',['raw_new',['../group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2',1,'raw_new(u8_t proto):&#160;raw.c'],['../group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2',1,'raw_new(u8_t proto):&#160;raw.c']]],
-  ['raw_5fnew_5fip_5ftype_16',['raw_new_ip_type',['../group__raw__raw.html#ga89697a092b3d72079f872a029e220eba',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c'],['../group__raw__raw.html#ga89697a092b3d72079f872a029e220eba',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c']]],
-  ['raw_5fpcb_17',['raw_pcb',['../structraw__pcb.html',1,'']]],
-  ['raw_5fpriv_2eh_18',['raw_priv.h',['../raw__priv_8h.html',1,'']]],
-  ['raw_5frecv_19',['raw_recv',['../group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426',1,'raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg):&#160;raw.c'],['../group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426',1,'raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg):&#160;raw.c']]],
-  ['raw_5frecv_5ffn_20',['raw_recv_fn',['../raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd',1,'raw.h']]],
-  ['raw_5fremove_21',['raw_remove',['../group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16',1,'raw_remove(struct raw_pcb *pcb):&#160;raw.c'],['../group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16',1,'raw_remove(struct raw_pcb *pcb):&#160;raw.c']]],
-  ['raw_5fsend_22',['raw_send',['../group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d',1,'raw_send(struct raw_pcb *pcb, struct pbuf *p):&#160;raw.c'],['../group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d',1,'raw_send(struct raw_pcb *pcb, struct pbuf *p):&#160;raw.c']]],
-  ['raw_5fsendto_23',['raw_sendto',['../group__raw__raw.html#ga09427456070fb610cc7795d23dedc159',1,'raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga09427456070fb610cc7795d23dedc159',1,'raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr):&#160;raw.c']]],
-  ['raw_5fsendto_5fif_5fsrc_24',['raw_sendto_if_src',['../group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1',1,'raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip):&#160;raw.c'],['../group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1',1,'raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip):&#160;raw.c']]],
-  ['raw_5fttl_25',['RAW_TTL',['../group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c',1,'opt.h']]],
-  ['rcvevent_26',['rcvevent',['../structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a',1,'lwip_sock']]],
-  ['reachability_27',['reachability',['../structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d',1,'sntp_server']]],
-  ['read_28',['read',['../structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c',1,'tftp_context']]],
-  ['readset_29',['readset',['../structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e',1,'lwip_select_cb']]],
-  ['reass_5flist_30',['reass_list',['../structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35',1,'lowpan6_ieee802154_data']]],
-  ['recv_31',['recv',['../structraw__pcb.html#a963b023239ad97c05536046ed7058a10',1,'raw_pcb::recv'],['../structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8',1,'udp_pcb::recv']]],
-  ['recv_5farg_32',['recv_arg',['../structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab',1,'udp_pcb']]],
-  ['recv_5favail_33',['recv_avail',['../structnetconn.html#a05b15a28b0803bea3729b1da2047541e',1,'netconn']]],
-  ['recv_5fbufsize_34',['recv_bufsize',['../structnetconn.html#a6febc9717418ddba16f16e988061cfac',1,'netconn']]],
-  ['recv_5fbufsize_5fdefault_35',['RECV_BUFSIZE_DEFAULT',['../group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d',1,'opt.h']]],
-  ['recv_5funicast_36',['recv_unicast',['../structmdns__packet.html#a8659b4f582be0df84b6ae91308737377',1,'mdns_packet']]],
-  ['recvmbox_37',['recvmbox',['../structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da',1,'netconn']]],
-  ['redirect_5fheader_38',['redirect_header',['../structredirect__header.html',1,'']]],
-  ['ref_39',['ref',['../structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7',1,'pbuf']]],
-  ['reference_40',['reference',['../structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5',1,'snmp_node_instance']]],
-  ['reference_5flen_41',['reference_len',['../structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54',1,'snmp_node_instance']]],
-  ['related_42',['NETIF related',['../group__netifapi__netif.html',1,'']]],
-  ['release_5finstance_43',['release_instance',['../structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de',1,'snmp_node_instance']]],
-  ['remove_5fcallback_44',['remove_callback',['../structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07',1,'netif']]],
-  ['reporting_20bugs_45',['Reporting bugs',['../bugs.html',1,'']]],
-  ['responder_46',['NETBIOS responder',['../group__netbiosns.html',1,'']]],
-  ['rfc4944_47',['6LoWPAN (RFC4944)',['../group__sixlowpan.html',1,'']]],
-  ['rfc7668_48',['6LoWPAN over BLE (RFC7668)',['../group__rfc7668if.html',1,'']]],
-  ['rfc7668_5fif_5finit_49',['rfc7668_if_init',['../group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde',1,'rfc7668_if_init(struct netif *netif):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde',1,'rfc7668_if_init(struct netif *netif):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5finput_50',['rfc7668_input',['../group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197',1,'rfc7668_input(struct pbuf *p, struct netif *netif):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197',1,'rfc7668_input(struct pbuf *p, struct netif *netif):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5foutput_51',['rfc7668_output',['../group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0',1,'rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0',1,'rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5fcontext_52',['rfc7668_set_context',['../group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e',1,'rfc7668_set_context(u8_t index, const ip6_addr_t *context):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e',1,'rfc7668_set_context(u8_t idx, const ip6_addr_t *context):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5flocal_5faddr_5feui64_53',['rfc7668_set_local_addr_eui64',['../lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2',1,'rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2',1,'rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5flocal_5faddr_5fmac48_54',['rfc7668_set_local_addr_mac48',['../lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2',1,'rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2',1,'rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5fpeer_5faddr_5feui64_55',['rfc7668_set_peer_addr_eui64',['../lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593',1,'rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593',1,'rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5fpeer_5faddr_5fmac48_56',['rfc7668_set_peer_addr_mac48',['../lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0',1,'rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0',1,'rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr):&#160;lowpan6_ble.c']]],
-  ['rs_5fcount_57',['rs_count',['../structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6',1,'netif']]],
-  ['rs_5fheader_58',['rs_header',['../structrs__header.html',1,'']]],
-  ['rx_59',['Zero-copy RX',['../zerocopyrx.html',1,'']]]
+  ['rate_5flimit_5factivated_2',['rate_limit_activated',['../structmdns__host.html#a002e836a1888c7df4cf2b775c7fae557',1,'mdns_host']]],
+  ['raw_3',['RAW',['../group__raw__raw.html',1,'RAW'],['../group__lwip__opts__raw.html',1,'RAW']]],
+  ['raw_20apis_4',['&quot;raw&quot; APIs',['../group__callbackstyle__api.html',1,'']]],
+  ['raw_2ec_5',['raw.c',['../raw_8c.html',1,'']]],
+  ['raw_2eh_6',['raw.h',['../raw_8h.html',1,'']]],
+  ['raw_5fbind_7',['raw_bind',['../group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4',1,'raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4',1,'raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c']]],
+  ['raw_5fbind_5fnetif_8',['raw_bind_netif',['../group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a',1,'raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif):&#160;raw.c'],['../group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a',1,'raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif):&#160;raw.c']]],
+  ['raw_5fconnect_9',['raw_connect',['../group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168',1,'raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168',1,'raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c']]],
+  ['raw_5fdebug_10',['RAW_DEBUG',['../group__lwip__opts__debugmsg.html#gaf0551bef83c0fc1baa57cf339d220e25',1,'opt.h']]],
+  ['raw_5fdisconnect_11',['raw_disconnect',['../group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef',1,'raw_disconnect(struct raw_pcb *pcb):&#160;raw.c'],['../group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef',1,'raw_disconnect(struct raw_pcb *pcb):&#160;raw.c']]],
+  ['raw_5finput_12',['raw_input',['../raw_8c.html#a03c4582d9ecf687e1f31d597c7889553',1,'raw_input(struct pbuf *p, struct netif *inp):&#160;raw.c'],['../raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553',1,'raw_input(struct pbuf *p, struct netif *inp):&#160;raw.c']]],
+  ['raw_5finput_5fstate_13',['raw_input_state',['../raw__priv_8h.html#a2580ec946c4196127888d5405257866b',1,'raw_priv.h']]],
+  ['raw_5finput_5fstate_5ft_14',['raw_input_state_t',['../raw__priv_8h.html#a50dd44a4fb984a1975e15dd073d34e8d',1,'raw_priv.h']]],
+  ['raw_5fnetif_5fip_5faddr_5fchanged_15',['raw_netif_ip_addr_changed',['../raw_8c.html#a61dc42f18e34800643000e48be6543ab',1,'raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;raw.c'],['../raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab',1,'raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;raw.c']]],
+  ['raw_5fnew_16',['raw_new',['../group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2',1,'raw_new(u8_t proto):&#160;raw.c'],['../group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2',1,'raw_new(u8_t proto):&#160;raw.c']]],
+  ['raw_5fnew_5fip_5ftype_17',['raw_new_ip_type',['../group__raw__raw.html#ga89697a092b3d72079f872a029e220eba',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c'],['../group__raw__raw.html#ga89697a092b3d72079f872a029e220eba',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c']]],
+  ['raw_5fpcb_18',['raw_pcb',['../structraw__pcb.html',1,'']]],
+  ['raw_5fpriv_2eh_19',['raw_priv.h',['../raw__priv_8h.html',1,'']]],
+  ['raw_5frecv_20',['raw_recv',['../group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426',1,'raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg):&#160;raw.c'],['../group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426',1,'raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg):&#160;raw.c']]],
+  ['raw_5frecv_5ffn_21',['raw_recv_fn',['../raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd',1,'raw.h']]],
+  ['raw_5fremove_22',['raw_remove',['../group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16',1,'raw_remove(struct raw_pcb *pcb):&#160;raw.c'],['../group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16',1,'raw_remove(struct raw_pcb *pcb):&#160;raw.c']]],
+  ['raw_5fsend_23',['raw_send',['../group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d',1,'raw_send(struct raw_pcb *pcb, struct pbuf *p):&#160;raw.c'],['../group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d',1,'raw_send(struct raw_pcb *pcb, struct pbuf *p):&#160;raw.c']]],
+  ['raw_5fsendto_24',['raw_sendto',['../group__raw__raw.html#ga09427456070fb610cc7795d23dedc159',1,'raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga09427456070fb610cc7795d23dedc159',1,'raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr):&#160;raw.c']]],
+  ['raw_5fsendto_5fif_5fsrc_25',['raw_sendto_if_src',['../group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1',1,'raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip):&#160;raw.c'],['../group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1',1,'raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip):&#160;raw.c']]],
+  ['raw_5fttl_26',['RAW_TTL',['../group__lwip__opts__raw.html#ga36e3ffa66073ca0d27d11c422778249c',1,'opt.h']]],
+  ['rcvevent_27',['rcvevent',['../structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a',1,'lwip_sock']]],
+  ['reachability_28',['reachability',['../structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d',1,'sntp_server']]],
+  ['read_29',['read',['../structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c',1,'tftp_context']]],
+  ['readset_30',['readset',['../structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e',1,'lwip_select_cb']]],
+  ['reass_5flist_31',['reass_list',['../structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35',1,'lowpan6_ieee802154_data']]],
+  ['recv_32',['recv',['../structraw__pcb.html#a963b023239ad97c05536046ed7058a10',1,'raw_pcb::recv'],['../structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8',1,'udp_pcb::recv']]],
+  ['recv_5farg_33',['recv_arg',['../structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab',1,'udp_pcb']]],
+  ['recv_5favail_34',['recv_avail',['../structnetconn.html#a05b15a28b0803bea3729b1da2047541e',1,'netconn']]],
+  ['recv_5fbufsize_35',['recv_bufsize',['../structnetconn.html#a6febc9717418ddba16f16e988061cfac',1,'netconn']]],
+  ['recv_5fbufsize_5fdefault_36',['RECV_BUFSIZE_DEFAULT',['../group__lwip__opts__socket.html#ga5dbd0a61f30ae6c6bfbda635095f138d',1,'opt.h']]],
+  ['recv_5funicast_37',['recv_unicast',['../structmdns__packet.html#a8659b4f582be0df84b6ae91308737377',1,'mdns_packet']]],
+  ['recvmbox_38',['recvmbox',['../structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da',1,'netconn']]],
+  ['redirect_5fheader_39',['redirect_header',['../structredirect__header.html',1,'']]],
+  ['ref_40',['ref',['../structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7',1,'pbuf']]],
+  ['reference_41',['reference',['../structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5',1,'snmp_node_instance']]],
+  ['reference_5flen_42',['reference_len',['../structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54',1,'snmp_node_instance']]],
+  ['related_43',['NETIF related',['../group__netifapi__netif.html',1,'']]],
+  ['release_5finstance_44',['release_instance',['../structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de',1,'snmp_node_instance']]],
+  ['remove_5fcallback_45',['remove_callback',['../structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07',1,'netif']]],
+  ['reporting_20bugs_46',['Reporting bugs',['../bugs.html',1,'']]],
+  ['responder_47',['NETBIOS responder',['../group__netbiosns.html',1,'']]],
+  ['result_5ffn_48',['result_fn',['../structmdns__request.html#a4cc8a4e62ce71bc33f1e7cb24b198c1d',1,'mdns_request']]],
+  ['rfc4944_49',['6LoWPAN (RFC4944)',['../group__sixlowpan.html',1,'']]],
+  ['rfc7668_50',['6LoWPAN over BLE (RFC7668)',['../group__rfc7668if.html',1,'']]],
+  ['rfc7668_5fif_5finit_51',['rfc7668_if_init',['../group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde',1,'rfc7668_if_init(struct netif *netif):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde',1,'rfc7668_if_init(struct netif *netif):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5finput_52',['rfc7668_input',['../group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197',1,'rfc7668_input(struct pbuf *p, struct netif *netif):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197',1,'rfc7668_input(struct pbuf *p, struct netif *netif):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5foutput_53',['rfc7668_output',['../group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0',1,'rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0',1,'rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5fcontext_54',['rfc7668_set_context',['../group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e',1,'rfc7668_set_context(u8_t index, const ip6_addr_t *context):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e',1,'rfc7668_set_context(u8_t idx, const ip6_addr_t *context):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5flocal_5faddr_5feui64_55',['rfc7668_set_local_addr_eui64',['../lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2',1,'rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2',1,'rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5flocal_5faddr_5fmac48_56',['rfc7668_set_local_addr_mac48',['../lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2',1,'rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2',1,'rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5fpeer_5faddr_5feui64_57',['rfc7668_set_peer_addr_eui64',['../lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593',1,'rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593',1,'rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5fpeer_5faddr_5fmac48_58',['rfc7668_set_peer_addr_mac48',['../lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0',1,'rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0',1,'rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr):&#160;lowpan6_ble.c']]],
+  ['rs_5fcount_59',['rs_count',['../structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6',1,'netif']]],
+  ['rs_5fheader_60',['rs_header',['../structrs__header.html',1,'']]],
+  ['rx_61',['Zero-copy RX',['../zerocopyrx.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_16.js b/doc/doxygen/output/html/search/all_16.js
index e5517eb..c674049 100644
--- a/doc/doxygen/output/html/search/all_16.js
+++ b/doc/doxygen/output/html/search/all_16.js
@@ -1,7 +1,7 @@
 var searchData=
 [
   ['safe_20apis_0',['Thread-safe APIs',['../group__lwip__opts__threadsafe__apis.html',1,'']]],
-  ['sd_1',['sd',['../structapi__msg.html#a5aa22dbd74fd7ba2fa5eb8bc8aae529f',1,'api_msg']]],
+  ['sd_1',['sd',['../structapi__msg.html#a8644758cd55e0891e43717711ae7b03b',1,'api_msg']]],
   ['sections_2',['Critical sections',['../group__sys__prot.html',1,'']]],
   ['select_5fwaiting_3',['select_waiting',['../structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38',1,'lwip_sock']]],
   ['selwait_5ft_4',['SELWAIT_T',['../sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196',1,'sockets_priv.h']]],
@@ -10,343 +10,351 @@
   ['semaphores_7',['Semaphores',['../group__sys__sem.html',1,'']]],
   ['send_5ftimeout_8',['send_timeout',['../structnetconn.html#a44e55724482b8e447134f5ba4f01551a',1,'netconn']]],
   ['sendevent_9',['sendevent',['../structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8',1,'lwip_sock']]],
-  ['sent_5fnum_10',['sent_num',['../structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25',1,'autoip']]],
+  ['sent_5fnum_10',['sent_num',['../structacd.html#a4ab002648d338ae33ffd3829e23703cb',1,'acd::sent_num'],['../structmdns__host.html#a9c09b5c58b3db64f78ce8eeb14952bea',1,'mdns_host::sent_num']]],
   ['sequence_5fnumber_11',['sequence_number',['../structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869',1,'ieee_802154_hdr']]],
   ['sequential_20style_20apis_12',['Sequential-style APIs',['../group__sequential__api.html',1,'']]],
-  ['server_13',['server',['../group__httpd.html',1,'HTTP server'],['../group__iperf.html',1,'Iperf server'],['../group__tftp.html',1,'TFTP server']]],
-  ['service_14',['service',['../structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad',1,'mdns_service']]],
+  ['server_13',['server',['../group__httpd.html',1,'HTTP server'],['../group__iperf.html',1,'Iperf server'],['../group__tftp.html',1,'TFTP client/server']]],
+  ['service_14',['service',['../structmdns__request.html#aace6ab8b7de73d61d02711f26de7b751',1,'mdns_request::service'],['../structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad',1,'mdns_service::service']]],
   ['service_5fget_5ftxt_5ffn_5ft_15',['service_get_txt_fn_t',['../mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83',1,'mdns.h']]],
   ['services_16',['services',['../structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed',1,'mdns_host']]],
   ['session_5fdata_5fpacket_5fsize_17',['session_data_packet_size',['../structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c',1,'netbios_answer']]],
   ['set_5ftest_18',['set_test',['../structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd',1,'snmp_node_instance::set_test'],['../structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0',1,'snmp_table_node::set_test']]],
-  ['set_5fvalue_19',['set_value',['../structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834',1,'snmp_node_instance::set_value'],['../structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804',1,'snmp_table_node::set_value']]],
-  ['size_20',['size',['../structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3',1,'memp_desc']]],
-  ['sizes_21',['Debugging memory pool sizes',['../mem_err.html',1,'']]],
-  ['slip_22',['SLIP',['../group__slipif.html',1,'']]],
-  ['slip_5fdebug_23',['SLIP_DEBUG',['../group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857',1,'opt.h']]],
-  ['slip_5fmax_5fsize_24',['SLIP_MAX_SIZE',['../slipif_8c.html#accf448f9dabb0f33ef46b40355691cab',1,'slipif.c']]],
-  ['slip_5frx_5fqueue_25',['SLIP_RX_QUEUE',['../slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668',1,'slipif.h']]],
-  ['slip_5fsio_5fspeed_26',['SLIP_SIO_SPEED',['../slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc',1,'slipif.c']]],
-  ['slip_5fuse_5frx_5fthread_27',['SLIP_USE_RX_THREAD',['../slipif_8h.html#a198967c11f79cffc32192710294e8826',1,'slipif.h']]],
-  ['slipif_2ec_28',['slipif.c',['../slipif_8c.html',1,'']]],
-  ['slipif_2eh_29',['slipif.h',['../slipif_8h.html',1,'']]],
-  ['slipif_5finit_30',['slipif_init',['../group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3',1,'slipif_init(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3',1,'slipif_init(struct netif *netif):&#160;slipif.c']]],
-  ['slipif_5fpoll_31',['slipif_poll',['../group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6',1,'slipif_poll(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6',1,'slipif_poll(struct netif *netif):&#160;slipif.c']]],
-  ['slipif_5fprocess_5frxqueue_32',['slipif_process_rxqueue',['../group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946',1,'slipif_process_rxqueue(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946',1,'slipif_process_rxqueue(struct netif *netif):&#160;slipif.c']]],
-  ['slipif_5freceived_5fbyte_33',['slipif_received_byte',['../group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3',1,'slipif_received_byte(struct netif *netif, u8_t data):&#160;slipif.c'],['../group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3',1,'slipif_received_byte(struct netif *netif, u8_t data):&#160;slipif.c']]],
-  ['slipif_5freceived_5fbytes_34',['slipif_received_bytes',['../group__slipif.html#gabbee48569a513c90fe154632038eb6d6',1,'slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len):&#160;slipif.c'],['../group__slipif.html#gabbee48569a513c90fe154632038eb6d6',1,'slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len):&#160;slipif.c']]],
-  ['slipif_5fthread_5fname_35',['SLIPIF_THREAD_NAME',['../group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675',1,'opt.h']]],
-  ['slipif_5fthread_5fprio_36',['SLIPIF_THREAD_PRIO',['../group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e',1,'opt.h']]],
-  ['slipif_5fthread_5fstacksize_37',['SLIPIF_THREAD_STACKSIZE',['../group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258',1,'opt.h']]],
-  ['smemcpy_38',['SMEMCPY',['../group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec',1,'opt.h']]],
-  ['smtp_20client_39',['SMTP client',['../group__smtp.html',1,'']]],
-  ['smtp_2ec_40',['smtp.c',['../smtp_8c.html',1,'']]],
-  ['smtp_5fbodydh_41',['SMTP_BODYDH',['../group__smtp__opts.html#ga4b1667149354b7819847cb4f5f1ff144',1,'smtp_opts.h']]],
-  ['smtp_5fcheck_5fdata_42',['SMTP_CHECK_DATA',['../group__smtp__opts.html#ga021d8133159895a2dbf5fb0b243da9fa',1,'smtp_opts.h']]],
-  ['smtp_5fcopy_5fauthdata_43',['SMTP_COPY_AUTHDATA',['../group__smtp__opts.html#gab5559a7c976e72204d9391f655bcc07e',1,'smtp_opts.h']]],
-  ['smtp_5fdebug_44',['SMTP_DEBUG',['../group__smtp__opts.html#gae7ea4f31c521947d5127e268ae02c317',1,'smtp_opts.h']]],
-  ['smtp_5fmax_5fpass_5flen_45',['SMTP_MAX_PASS_LEN',['../group__smtp__opts.html#ga9aa5f5529121a8266947f33c5e424ccc',1,'smtp_opts.h']]],
-  ['smtp_5fmax_5fservername_5flen_46',['SMTP_MAX_SERVERNAME_LEN',['../group__smtp__opts.html#gaee3b273524a2253ce5fb44b240b0371b',1,'smtp_opts.h']]],
-  ['smtp_5fmax_5fusername_5flen_47',['SMTP_MAX_USERNAME_LEN',['../group__smtp__opts.html#gafa0c84e5279b8eb8a5dbea6fe97aa099',1,'smtp_opts.h']]],
-  ['smtp_5fpoll_5finterval_48',['SMTP_POLL_INTERVAL',['../smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e',1,'smtp.c']]],
-  ['smtp_5fsend_5fmail_49',['smtp_send_mail',['../group__smtp.html#gae43119480c4146df9eeff7ae80c767f7',1,'smtp_send_mail(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c'],['../group__smtp.html#gae43119480c4146df9eeff7ae80c767f7',1,'smtp_send_mail(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c']]],
-  ['smtp_5fsend_5fmail_5fint_50',['smtp_send_mail_int',['../group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243',1,'smtp_send_mail_int(void *arg):&#160;smtp.c'],['../group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243',1,'smtp_send_mail_int(void *arg):&#160;smtp.c']]],
-  ['smtp_5fsend_5fmail_5fstatic_51',['smtp_send_mail_static',['../group__smtp.html#ga06f6582701def2a62582373bb0be5788',1,'smtp_send_mail_static(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c'],['../group__smtp.html#ga06f6582701def2a62582373bb0be5788',1,'smtp_send_mail_static(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c']]],
-  ['smtp_5fsend_5frequest_52',['smtp_send_request',['../structsmtp__send__request.html',1,'']]],
-  ['smtp_5fsession_53',['smtp_session',['../structsmtp__session.html',1,'']]],
-  ['smtp_5fsession_5fstate_54',['smtp_session_state',['../smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae',1,'smtp.c']]],
-  ['smtp_5fset_5fauth_55',['smtp_set_auth',['../group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899',1,'smtp_set_auth(const char *username, const char *pass):&#160;smtp.c'],['../group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899',1,'smtp_set_auth(const char *username, const char *pass):&#160;smtp.c']]],
-  ['smtp_5fset_5fserver_5faddr_56',['smtp_set_server_addr',['../group__smtp.html#ga1ccf4305461ec16cf41599341ec54983',1,'smtp_set_server_addr(const char *server):&#160;smtp.c'],['../group__smtp.html#ga1ccf4305461ec16cf41599341ec54983',1,'smtp_set_server_addr(const char *server):&#160;smtp.c']]],
-  ['smtp_5fset_5fserver_5fport_57',['smtp_set_server_port',['../group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f',1,'smtp_set_server_port(u16_t port):&#160;smtp.c'],['../group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f',1,'smtp_set_server_port(u16_t port):&#160;smtp.c']]],
-  ['smtp_5fset_5ftls_5fconfig_58',['smtp_set_tls_config',['../group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e',1,'smtp_set_tls_config(struct altcp_tls_config *tls_config):&#160;smtp.c'],['../group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e',1,'smtp_set_tls_config(struct altcp_tls_config *tls_config):&#160;smtp.c']]],
-  ['smtp_5fsupport_5fauth_5flogin_59',['SMTP_SUPPORT_AUTH_LOGIN',['../group__smtp__opts.html#ga7a83e686b109fa59557c13736aeeab3b',1,'smtp_opts.h']]],
-  ['smtp_5fsupport_5fauth_5fplain_60',['SMTP_SUPPORT_AUTH_PLAIN',['../group__smtp__opts.html#ga2e6c8313006592884e89bbcf353cf5ac',1,'smtp_opts.h']]],
-  ['smtp_5ftimeout_61',['SMTP_TIMEOUT',['../smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6',1,'smtp.c']]],
-  ['smtp_5ftimeout_5fdatablock_62',['SMTP_TIMEOUT_DATABLOCK',['../smtp_8c.html#ad853ab316a3b866b87c0454053febfe3',1,'smtp.c']]],
-  ['smtp_5ftimeout_5fdataterm_63',['SMTP_TIMEOUT_DATATERM',['../smtp_8c.html#a73855e673457f748b6bcba49aab9b035',1,'smtp.c']]],
-  ['snmp_20mib2_20callbacks_64',['SNMP MIB2 callbacks',['../group__lwip__opts__mib2.html',1,'']]],
-  ['snmp_2eh_65',['snmp.h',['../apps_2snmp_8h.html',1,'(Global Namespace)'],['../snmp_8h.html',1,'(Global Namespace)']]],
-  ['snmp_5faccess_5ft_66',['snmp_access_t',['../snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760',1,'snmp_core.h']]],
-  ['snmp_5fans1_5fenc_5ftlv_67',['snmp_ans1_enc_tlv',['../snmp__asn1_8c.html#af8e905a214936995d235789f359cf015',1,'snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#af8e905a214936995d235789f359cf015',1,'snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_2ec_68',['snmp_asn1.c',['../snmp__asn1_8c.html',1,'']]],
-  ['snmp_5fasn1_2eh_69',['snmp_asn1.h',['../snmp__asn1_8h.html',1,'']]],
-  ['snmp_5fasn1_5fdec_5foid_70',['snmp_asn1_dec_oid',['../snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908',1,'snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908',1,'snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fdec_5fraw_71',['snmp_asn1_dec_raw',['../snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e',1,'snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e',1,'snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fdec_5fs32t_72',['snmp_asn1_dec_s32t',['../snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb',1,'snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb',1,'snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fdec_5ftlv_73',['snmp_asn1_dec_tlv',['../snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496',1,'snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496',1,'snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fdec_5fu32t_74',['snmp_asn1_dec_u32t',['../snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51',1,'snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51',1,'snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5flength_5fcnt_75',['snmp_asn1_enc_length_cnt',['../snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d',1,'snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d',1,'snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5foid_76',['snmp_asn1_enc_oid',['../snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218',1,'snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218',1,'snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5foid_5fcnt_77',['snmp_asn1_enc_oid_cnt',['../snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f',1,'snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f',1,'snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fraw_78',['snmp_asn1_enc_raw',['../snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6',1,'snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6',1,'snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fs32t_79',['snmp_asn1_enc_s32t',['../snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6',1,'snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6',1,'snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fs32t_5fcnt_80',['snmp_asn1_enc_s32t_cnt',['../snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f',1,'snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f',1,'snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fu32t_81',['snmp_asn1_enc_u32t',['../snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2',1,'snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2',1,'snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fu32t_5fcnt_82',['snmp_asn1_enc_u32t_cnt',['../snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4',1,'snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4',1,'snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed):&#160;snmp_asn1.c']]],
-  ['snmp_5fauthfail_5ftrap_83',['snmp_authfail_trap',['../group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee',1,'snmp_authfail_trap(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee',1,'snmp_authfail_trap(void):&#160;snmp_traps.c']]],
-  ['snmp_5fcoldstart_5ftrap_84',['snmp_coldstart_trap',['../group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be',1,'snmp_coldstart_trap(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be',1,'snmp_coldstart_trap(void):&#160;snmp_traps.c']]],
-  ['snmp_5fcommunity_85',['SNMP_COMMUNITY',['../group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db',1,'snmp_opts.h']]],
-  ['snmp_5fcommunity_86',['snmp_community',['../snmp__msg_8c.html#ac6f810ab812c44c6ca1df1fdf926a9f6',1,'snmp_community:&#160;snmp_msg.c'],['../snmp__msg_8h.html#ac6f810ab812c44c6ca1df1fdf926a9f6',1,'snmp_community:&#160;snmp_msg.c']]],
-  ['snmp_5fcommunity_5ftrap_87',['SNMP_COMMUNITY_TRAP',['../group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b',1,'snmp_opts.h']]],
-  ['snmp_5fcommunity_5ftrap_88',['snmp_community_trap',['../snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b',1,'snmp_community_trap:&#160;snmp_msg.c'],['../snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b',1,'snmp_community_trap:&#160;snmp_msg.c']]],
-  ['snmp_5fcommunity_5fwrite_89',['SNMP_COMMUNITY_WRITE',['../group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464',1,'snmp_opts.h']]],
-  ['snmp_5fcommunity_5fwrite_90',['snmp_community_write',['../snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04',1,'snmp_community_write:&#160;snmp_msg.c'],['../snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04',1,'snmp_community_write:&#160;snmp_msg.c']]],
-  ['snmp_5fcore_2ec_91',['snmp_core.c',['../snmp__core_8c.html',1,'']]],
-  ['snmp_5fcore_2eh_92',['snmp_core.h',['../snmp__core_8h.html',1,'']]],
-  ['snmp_5fcreate_5fthread_5fsync_5fnode_93',['SNMP_CREATE_THREAD_SYNC_NODE',['../snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2',1,'snmp_threadsync.h']]],
-  ['snmp_5fdebug_94',['SNMP_DEBUG',['../group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02',1,'snmp_opts.h']]],
-  ['snmp_5fdecode_5fbits_95',['snmp_decode_bits',['../snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc',1,'snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value):&#160;snmp_core.c'],['../snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc',1,'snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value):&#160;snmp_core.c']]],
-  ['snmp_5fdevice_5fenterprise_5foid_96',['SNMP_DEVICE_ENTERPRISE_OID',['../group__snmp__opts.html#ga09118b734e85df152af098744e888b34',1,'snmp_opts.h']]],
-  ['snmp_5fdevice_5fenterprise_5foid_5flen_97',['SNMP_DEVICE_ENTERPRISE_OID_LEN',['../group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f',1,'snmp_opts.h']]],
-  ['snmp_5fencode_5fbits_98',['snmp_encode_bits',['../snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03',1,'snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count):&#160;snmp_core.c'],['../snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03',1,'snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count):&#160;snmp_core.c']]],
-  ['snmp_5ferr_5ft_99',['snmp_err_t',['../snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589',1,'snmp_core.h']]],
-  ['snmp_5fgentrap_5fauth_5ffailure_100',['SNMP_GENTRAP_AUTH_FAILURE',['../apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f',1,'snmp.h']]],
-  ['snmp_5fgentrap_5fcoldstart_101',['SNMP_GENTRAP_COLDSTART',['../apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019',1,'snmp.h']]],
-  ['snmp_5fgentrap_5fegp_5fneighbor_5floss_102',['SNMP_GENTRAP_EGP_NEIGHBOR_LOSS',['../apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee',1,'snmp.h']]],
-  ['snmp_5fgentrap_5fenterprise_5fspecific_103',['SNMP_GENTRAP_ENTERPRISE_SPECIFIC',['../apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43',1,'snmp.h']]],
-  ['snmp_5fgentrap_5flinkdown_104',['SNMP_GENTRAP_LINKDOWN',['../apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16',1,'snmp.h']]],
-  ['snmp_5fgentrap_5flinkup_105',['SNMP_GENTRAP_LINKUP',['../apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186',1,'snmp.h']]],
-  ['snmp_5fgentrap_5fwarmstart_106',['SNMP_GENTRAP_WARMSTART',['../apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926',1,'snmp.h']]],
-  ['snmp_5fget_5fauth_5ftraps_5fenabled_107',['snmp_get_auth_traps_enabled',['../group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7',1,'snmp_get_auth_traps_enabled(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7',1,'snmp_get_auth_traps_enabled(void):&#160;snmp_traps.c']]],
-  ['snmp_5fget_5fcommunity_108',['snmp_get_community',['../group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8',1,'snmp_get_community(void):&#160;snmp_msg.c'],['../group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8',1,'snmp_get_community(void):&#160;snmp_msg.c']]],
-  ['snmp_5fget_5fcommunity_5ftrap_109',['snmp_get_community_trap',['../group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba',1,'snmp_get_community_trap(void):&#160;snmp_msg.c'],['../group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba',1,'snmp_get_community_trap(void):&#160;snmp_msg.c']]],
-  ['snmp_5fget_5fcommunity_5fwrite_110',['snmp_get_community_write',['../group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e',1,'snmp_get_community_write(void):&#160;snmp_msg.c'],['../group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e',1,'snmp_get_community_write(void):&#160;snmp_msg.c']]],
-  ['snmp_5fget_5fdevice_5fenterprise_5foid_111',['snmp_get_device_enterprise_oid',['../group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c'],['../group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c']]],
-  ['snmp_5fiftype_112',['snmp_ifType',['../group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba',1,'snmp.h']]],
-  ['snmp_5finit_113',['snmp_init',['../snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5',1,'snmp_init(void):&#160;snmp_netconn.c'],['../group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5',1,'snmp_init(void):&#160;snmp_raw.c']]],
-  ['snmp_5fip4_5fto_5foid_114',['snmp_ip4_to_oid',['../snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1',1,'snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1',1,'snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
-  ['snmp_5fip6_5fto_5foid_115',['snmp_ip6_to_oid',['../snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9',1,'snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9',1,'snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
-  ['snmp_5fip_5fport_5fto_5foid_116',['snmp_ip_port_to_oid',['../snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27',1,'snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27',1,'snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid):&#160;snmp_core.c']]],
-  ['snmp_5fip_5fto_5foid_117',['snmp_ip_to_oid',['../snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e',1,'snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e',1,'snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
-  ['snmp_5fleaf_5fnode_118',['snmp_leaf_node',['../structsnmp__leaf__node.html',1,'']]],
-  ['snmp_5flwip_5fenterprise_5foid_119',['SNMP_LWIP_ENTERPRISE_OID',['../group__snmp__opts.html#ga868bfef6efe05515c86291137a633479',1,'snmp_opts.h']]],
-  ['snmp_5flwip_5fgetbulk_5fmax_5frepetitions_120',['SNMP_LWIP_GETBULK_MAX_REPETITIONS',['../group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3',1,'snmp_opts.h']]],
-  ['snmp_5flwip_5fmib2_121',['SNMP_LWIP_MIB2',['../group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d',1,'snmp_opts.h']]],
-  ['snmp_5flwip_5fmib2_5fsyscontact_122',['SNMP_LWIP_MIB2_SYSCONTACT',['../group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683',1,'snmp_opts.h']]],
-  ['snmp_5flwip_5fmib2_5fsysdesc_123',['SNMP_LWIP_MIB2_SYSDESC',['../group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73',1,'snmp_opts.h']]],
-  ['snmp_5flwip_5fmib2_5fsyslocation_124',['SNMP_LWIP_MIB2_SYSLOCATION',['../group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9',1,'snmp_opts.h']]],
-  ['snmp_5flwip_5fmib2_5fsysname_125',['SNMP_LWIP_MIB2_SYSNAME',['../group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98',1,'snmp_opts.h']]],
-  ['snmp_5fmax_5fcommunity_5fstr_5flen_126',['SNMP_MAX_COMMUNITY_STR_LEN',['../group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd',1,'snmp_opts.h']]],
-  ['snmp_5fmax_5fobj_5fid_5flen_127',['SNMP_MAX_OBJ_ID_LEN',['../group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41',1,'snmp_opts.h']]],
-  ['snmp_5fmax_5foctet_5fstring_5flen_128',['SNMP_MAX_OCTET_STRING_LEN',['../group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2',1,'snmp_opts.h']]],
-  ['snmp_5fmax_5fvalue_5fsize_129',['SNMP_MAX_VALUE_SIZE',['../group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0',1,'snmp_opts.h']]],
-  ['snmp_5fmib_130',['snmp_mib',['../structsnmp__mib.html',1,'']]],
-  ['snmp_5fmib2_2ec_131',['snmp_mib2.c',['../snmp__mib2_8c.html',1,'']]],
-  ['snmp_5fmib2_2eh_132',['snmp_mib2.h',['../snmp__mib2_8h.html',1,'']]],
-  ['snmp_5fmib2_5ficmp_2ec_133',['snmp_mib2_icmp.c',['../snmp__mib2__icmp_8c.html',1,'']]],
-  ['snmp_5fmib2_5finterfaces_2ec_134',['snmp_mib2_interfaces.c',['../snmp__mib2__interfaces_8c.html',1,'']]],
-  ['snmp_5fmib2_5fip_2ec_135',['snmp_mib2_ip.c',['../snmp__mib2__ip_8c.html',1,'']]],
-  ['snmp_5fmib2_5fset_5fsyscontact_136',['snmp_mib2_set_syscontact',['../group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e',1,'snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e',1,'snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsyscontact_5freadonly_137',['snmp_mib2_set_syscontact_readonly',['../group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a',1,'snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a',1,'snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsysdescr_138',['snmp_mib2_set_sysdescr',['../group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc',1,'snmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc',1,'snmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsyslocation_139',['snmp_mib2_set_syslocation',['../group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2',1,'snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2',1,'snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsyslocation_5freadonly_140',['snmp_mib2_set_syslocation_readonly',['../group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267',1,'snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267',1,'snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsysname_141',['snmp_mib2_set_sysname',['../group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7',1,'snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7',1,'snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsysname_5freadonly_142',['snmp_mib2_set_sysname_readonly',['../group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5',1,'snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5',1,'snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fsnmp_2ec_143',['snmp_mib2_snmp.c',['../snmp__mib2__snmp_8c.html',1,'']]],
-  ['snmp_5fmib2_5fsystem_2ec_144',['snmp_mib2_system.c',['../snmp__mib2__system_8c.html',1,'']]],
-  ['snmp_5fmib2_5ftcp_2ec_145',['snmp_mib2_tcp.c',['../snmp__mib2__tcp_8c.html',1,'']]],
-  ['snmp_5fmib2_5fudp_2ec_146',['snmp_mib2_udp.c',['../snmp__mib2__udp_8c.html',1,'']]],
-  ['snmp_5fmib_5fdebug_147',['SNMP_MIB_DEBUG',['../group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16',1,'snmp_opts.h']]],
-  ['snmp_5fmib_5ftree_5fresolve_5fexact_148',['snmp_mib_tree_resolve_exact',['../snmp__core_8c.html#a8ba7d922d9eaac8cd024aed1413901f6',1,'snmp_core.c']]],
-  ['snmp_5fmin_5fvalue_5fsize_149',['SNMP_MIN_VALUE_SIZE',['../group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90',1,'snmp_opts.h']]],
-  ['snmp_5fmsg_2ec_150',['snmp_msg.c',['../snmp__msg_8c.html',1,'']]],
-  ['snmp_5fmsg_2eh_151',['snmp_msg.h',['../snmp__msg_8h.html',1,'']]],
-  ['snmp_5fnetconn_2ec_152',['snmp_netconn.c',['../snmp__netconn_8c.html',1,'']]],
-  ['snmp_5fnext_5foid_5fcheck_153',['snmp_next_oid_check',['../snmp__core_8c.html#a18126b2b13f267306c27e851e9379983',1,'snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference):&#160;snmp_core.c'],['../snmp__core_8h.html#a18126b2b13f267306c27e851e9379983',1,'snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference):&#160;snmp_core.c']]],
-  ['snmp_5fnext_5foid_5finit_154',['snmp_next_oid_init',['../snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213',1,'snmp_next_oid_init(struct snmp_next_oid_state *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213',1,'snmp_next_oid_init(struct snmp_next_oid_state *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len):&#160;snmp_core.c']]],
-  ['snmp_5fnext_5foid_5fprecheck_155',['snmp_next_oid_precheck',['../snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a',1,'snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a',1,'snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
-  ['snmp_5fnext_5foid_5fstate_156',['snmp_next_oid_state',['../structsnmp__next__oid__state.html',1,'']]],
-  ['snmp_5fnode_157',['snmp_node',['../structsnmp__node.html',1,'']]],
-  ['snmp_5fnode_5finstance_158',['snmp_node_instance',['../structsnmp__node__instance.html',1,'']]],
-  ['snmp_5fnode_5ftree_159',['SNMP_NODE_TREE',['../snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72',1,'snmp_core.h']]],
-  ['snmp_5fobj_5fid_160',['snmp_obj_id',['../structsnmp__obj__id.html',1,'']]],
-  ['snmp_5foid_5fappend_161',['snmp_oid_append',['../snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93',1,'snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93',1,'snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fassign_162',['snmp_oid_assign',['../snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6',1,'snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6',1,'snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fcombine_163',['snmp_oid_combine',['../snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904',1,'snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904',1,'snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fcompare_164',['snmp_oid_compare',['../snmp__core_8c.html#af041ab415e8063097c79be2b892174f8',1,'snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#af041ab415e8063097c79be2b892174f8',1,'snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fequal_165',['snmp_oid_equal',['../snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e',1,'snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e',1,'snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fin_5frange_166',['snmp_oid_in_range',['../snmp__core_8c.html#a5275903be5948b1c28bfadb365823504',1,'snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a5275903be5948b1c28bfadb365823504',1,'snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fprefix_167',['snmp_oid_prefix',['../snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39',1,'snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39',1,'snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5frange_168',['snmp_oid_range',['../structsnmp__oid__range.html',1,'']]],
-  ['snmp_5foid_5fto_5fip_169',['snmp_oid_to_ip',['../snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84',1,'snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84',1,'snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fto_5fip4_170',['snmp_oid_to_ip4',['../snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77',1,'snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77',1,'snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fto_5fip6_171',['snmp_oid_to_ip6',['../snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09',1,'snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09',1,'snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fto_5fip_5fport_172',['snmp_oid_to_ip_port',['../snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507',1,'snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port):&#160;snmp_core.c'],['../snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507',1,'snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port):&#160;snmp_core.c']]],
-  ['snmp_5fopts_2eh_173',['snmp_opts.h',['../snmp__opts_8h.html',1,'']]],
-  ['snmp_5fpbuf_5fstream_2ec_174',['snmp_pbuf_stream.c',['../snmp__pbuf__stream_8c.html',1,'']]],
-  ['snmp_5fpbuf_5fstream_2eh_175',['snmp_pbuf_stream.h',['../snmp__pbuf__stream_8h.html',1,'']]],
-  ['snmp_5fraw_2ec_176',['snmp_raw.c',['../snmp__raw_8c.html',1,'']]],
-  ['snmp_5fsafe_5frequests_177',['SNMP_SAFE_REQUESTS',['../group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261',1,'snmp_opts.h']]],
-  ['snmp_5fscalar_2ec_178',['snmp_scalar.c',['../snmp__scalar_8c.html',1,'']]],
-  ['snmp_5fscalar_2eh_179',['snmp_scalar.h',['../snmp__scalar_8h.html',1,'']]],
-  ['snmp_5fscalar_5farray_5fnode_180',['snmp_scalar_array_node',['../structsnmp__scalar__array__node.html',1,'']]],
-  ['snmp_5fscalar_5farray_5fnode_5fdef_181',['snmp_scalar_array_node_def',['../structsnmp__scalar__array__node__def.html',1,'']]],
-  ['snmp_5fscalar_5fnode_182',['snmp_scalar_node',['../structsnmp__scalar__node.html',1,'']]],
-  ['snmp_5fsend_5ftrap_183',['snmp_send_trap',['../group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd',1,'snmp_send_trap(const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd',1,'snmp_send_trap(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c']]],
-  ['snmp_5fsend_5ftrap_5fgeneric_184',['snmp_send_trap_generic',['../group__snmp__traps.html#ga0e044259289cb690197173f93c17607d',1,'snmp_send_trap_generic(s32_t generic_trap):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga0e044259289cb690197173f93c17607d',1,'snmp_send_trap_generic(s32_t generic_trap):&#160;snmp_traps.c']]],
-  ['snmp_5fsend_5ftrap_5fspecific_185',['snmp_send_trap_specific',['../group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1',1,'snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1',1,'snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c']]],
-  ['snmp_5fset_5fauth_5ftraps_5fenabled_186',['snmp_set_auth_traps_enabled',['../group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c',1,'snmp_set_auth_traps_enabled(u8_t enable):&#160;snmp_traps.c'],['../group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c',1,'snmp_set_auth_traps_enabled(u8_t enable):&#160;snmp_traps.c']]],
-  ['snmp_5fset_5fcommunity_187',['snmp_set_community',['../group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1',1,'snmp_set_community(const char *const community):&#160;snmp_msg.c'],['../group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1',1,'snmp_set_community(const char *const community):&#160;snmp_msg.c']]],
-  ['snmp_5fset_5fcommunity_5ftrap_188',['snmp_set_community_trap',['../group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760',1,'snmp_set_community_trap(const char *const community):&#160;snmp_msg.c'],['../group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760',1,'snmp_set_community_trap(const char *const community):&#160;snmp_msg.c']]],
-  ['snmp_5fset_5fcommunity_5fwrite_189',['snmp_set_community_write',['../group__snmp__core.html#ga341461766863cff46a44e5f431f2da01',1,'snmp_set_community_write(const char *const community):&#160;snmp_msg.c'],['../group__snmp__core.html#ga341461766863cff46a44e5f431f2da01',1,'snmp_set_community_write(const char *const community):&#160;snmp_msg.c']]],
-  ['snmp_5fset_5fdevice_5fenterprise_5foid_190',['snmp_set_device_enterprise_oid',['../group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a',1,'snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid):&#160;snmp_core.c'],['../group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a',1,'snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid):&#160;snmp_core.c']]],
-  ['snmp_5fset_5fmibs_191',['snmp_set_mibs',['../group__snmp__core.html#ga29c76474971f25d038fd486447c70e21',1,'snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs):&#160;snmp_core.c'],['../group__snmp__core.html#ga29c76474971f25d038fd486447c70e21',1,'snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs):&#160;snmp_core.c']]],
-  ['snmp_5fset_5fwrite_5fcallback_192',['snmp_set_write_callback',['../group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b',1,'snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg):&#160;snmp_msg.c'],['../group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b',1,'snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg):&#160;snmp_msg.c']]],
-  ['snmp_5fstack_5fsize_193',['SNMP_STACK_SIZE',['../group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242',1,'snmp_opts.h']]],
-  ['snmp_5ftable_2ec_194',['snmp_table.c',['../snmp__table_8c.html',1,'']]],
-  ['snmp_5ftable_2eh_195',['snmp_table.h',['../snmp__table_8h.html',1,'']]],
-  ['snmp_5ftable_5fcol_5fdef_196',['snmp_table_col_def',['../structsnmp__table__col__def.html',1,'']]],
-  ['snmp_5ftable_5fcolumn_5fdata_5ftype_5ft_197',['snmp_table_column_data_type_t',['../snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5',1,'snmp_table.h']]],
-  ['snmp_5ftable_5fnode_198',['snmp_table_node',['../structsnmp__table__node.html',1,'']]],
-  ['snmp_5ftable_5fsimple_5fnode_199',['snmp_table_simple_node',['../structsnmp__table__simple__node.html',1,'']]],
-  ['snmp_5fthread_5fprio_200',['SNMP_THREAD_PRIO',['../group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b',1,'snmp_opts.h']]],
-  ['snmp_5fthreadsync_2ec_201',['snmp_threadsync.c',['../snmp__threadsync_8c.html',1,'']]],
-  ['snmp_5fthreadsync_2eh_202',['snmp_threadsync.h',['../snmp__threadsync_8h.html',1,'']]],
-  ['snmp_5fthreadsync_5finit_203',['snmp_threadsync_init',['../snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6',1,'snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn):&#160;snmp_threadsync.c'],['../snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6',1,'snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn):&#160;snmp_threadsync.c']]],
-  ['snmp_5fthreadsync_5finstance_204',['snmp_threadsync_instance',['../structsnmp__threadsync__instance.html',1,'']]],
-  ['snmp_5fthreadsync_5fnode_205',['snmp_threadsync_node',['../structsnmp__threadsync__node.html',1,'']]],
-  ['snmp_5ftrap_5fdestinations_206',['SNMP_TRAP_DESTINATIONS',['../group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08',1,'snmp_opts.h']]],
-  ['snmp_5ftrap_5fdst_5fenable_207',['snmp_trap_dst_enable',['../group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32',1,'snmp_trap_dst_enable(u8_t dst_idx, u8_t enable):&#160;snmp_traps.c'],['../group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32',1,'snmp_trap_dst_enable(u8_t dst_idx, u8_t enable):&#160;snmp_traps.c']]],
-  ['snmp_5ftrap_5fdst_5fip_5fset_208',['snmp_trap_dst_ip_set',['../group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86',1,'snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86',1,'snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst):&#160;snmp_traps.c']]],
-  ['snmp_5ftraps_2ec_209',['snmp_traps.c',['../snmp__traps_8c.html',1,'']]],
-  ['snmp_5ftraps_5fhandle_210',['snmp_traps_handle',['../snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a',1,'snmp_traps_handle:&#160;snmp_traps.c'],['../snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a',1,'snmp_traps_handle:&#160;snmp_traps.c']]],
-  ['snmp_5ftree_5fnode_211',['snmp_tree_node',['../structsnmp__tree__node.html',1,'']]],
-  ['snmp_5fuse_5fnetconn_212',['SNMP_USE_NETCONN',['../group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078',1,'snmp_opts.h']]],
-  ['snmp_5fuse_5fraw_213',['SNMP_USE_RAW',['../group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f',1,'snmp_opts.h']]],
-  ['snmp_5fvarbind_214',['snmp_varbind',['../structsnmp__varbind.html',1,'']]],
-  ['snmp_5fvarbind_5flen_215',['snmp_varbind_len',['../structsnmp__varbind__len.html',1,'']]],
-  ['snmp_5fvarbind_5flength_216',['snmp_varbind_length',['../snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5',1,'snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len):&#160;snmp_msg.c'],['../snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5',1,'snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len):&#160;snmp_msg.c']]],
-  ['snmp_5fvariant_5fvalue_217',['snmp_variant_value',['../unionsnmp__variant__value.html',1,'']]],
-  ['snmpv2c_20v3_20agent_218',['SNMPv2c/v3 agent',['../group__snmp.html',1,'']]],
-  ['snmpv3_2ec_219',['snmpv3.c',['../snmpv3_8c.html',1,'']]],
-  ['snmpv3_2eh_220',['snmpv3.h',['../snmpv3_8h.html',1,'']]],
-  ['snmpv3_5fmbedtls_2ec_221',['snmpv3_mbedtls.c',['../snmpv3__mbedtls_8c.html',1,'']]],
-  ['snmpv3_5fpriv_2eh_222',['snmpv3_priv.h',['../snmpv3__priv_8h.html',1,'']]],
-  ['sntp_223',['SNTP',['../group__sntp.html',1,'']]],
-  ['sntp_2ec_224',['sntp.c',['../sntp_8c.html',1,'']]],
-  ['sntp_2eh_225',['sntp.h',['../sntp_8h.html',1,'']]],
-  ['sntp_5fcheck_5fresponse_226',['SNTP_CHECK_RESPONSE',['../group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446',1,'sntp_opts.h']]],
-  ['sntp_5fcomp_5froundtrip_227',['SNTP_COMP_ROUNDTRIP',['../group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7',1,'sntp_opts.h']]],
-  ['sntp_5fdebug_228',['SNTP_DEBUG',['../group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91',1,'sntp_opts.h']]],
-  ['sntp_5fenabled_229',['sntp_enabled',['../group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5',1,'sntp_enabled(void):&#160;sntp.c'],['../group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5',1,'sntp_enabled(void):&#160;sntp.c']]],
-  ['sntp_5ffrac_5fto_5fus_230',['SNTP_FRAC_TO_US',['../sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f',1,'sntp.c']]],
-  ['sntp_5fget_5fservers_5ffrom_5fdhcp_231',['SNTP_GET_SERVERS_FROM_DHCP',['../group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade',1,'sntp_opts.h']]],
-  ['sntp_5fget_5fservers_5ffrom_5fdhcpv6_232',['SNTP_GET_SERVERS_FROM_DHCPV6',['../group__sntp__opts.html#ga0d5b4f1e382d08f0df9dbe0c9da64006',1,'sntp_opts.h']]],
-  ['sntp_5fget_5fsystem_5ftime_233',['SNTP_GET_SYSTEM_TIME',['../group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63',1,'sntp_opts.h']]],
-  ['sntp_5fgetoperatingmode_234',['sntp_getoperatingmode',['../group__sntp.html#gae66404a551d5cef420cf844a71356fae',1,'sntp_getoperatingmode(void):&#160;sntp.c'],['../group__sntp.html#gae66404a551d5cef420cf844a71356fae',1,'sntp_getoperatingmode(void):&#160;sntp.c']]],
-  ['sntp_5fgetreachability_235',['sntp_getreachability',['../group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e',1,'sntp_getreachability(u8_t idx):&#160;sntp.c'],['../group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e',1,'sntp_getreachability(u8_t idx):&#160;sntp.c']]],
-  ['sntp_5fgetserver_236',['sntp_getserver',['../group__sntp.html#gab114c12154cf2c3e3a733724c6a77429',1,'sntp_getserver(u8_t idx):&#160;sntp.c'],['../group__sntp.html#gab114c12154cf2c3e3a733724c6a77429',1,'sntp_getserver(u8_t idx):&#160;sntp.c']]],
-  ['sntp_5finit_237',['sntp_init',['../group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba',1,'sntp_init(void):&#160;sntp.c'],['../group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba',1,'sntp_init(void):&#160;sntp.c']]],
-  ['sntp_5fmax_5fservers_238',['SNTP_MAX_SERVERS',['../group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2',1,'sntp_opts.h']]],
-  ['sntp_5fmonitor_5fserver_5freachability_239',['SNTP_MONITOR_SERVER_REACHABILITY',['../group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3',1,'sntp_opts.h']]],
-  ['sntp_5fmsg_240',['sntp_msg',['../structsntp__msg.html',1,'']]],
-  ['sntp_5fopts_2eh_241',['sntp_opts.h',['../sntp__opts_8h.html',1,'']]],
-  ['sntp_5fport_242',['SNTP_PORT',['../group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b',1,'sntp_opts.h']]],
-  ['sntp_5frecv_5ftimeout_243',['SNTP_RECV_TIMEOUT',['../group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08',1,'sntp_opts.h']]],
-  ['sntp_5fretry_5ftimeout_244',['SNTP_RETRY_TIMEOUT',['../group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba',1,'sntp_opts.h']]],
-  ['sntp_5fretry_5ftimeout_5fexp_245',['SNTP_RETRY_TIMEOUT_EXP',['../group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2',1,'sntp_opts.h']]],
-  ['sntp_5fretry_5ftimeout_5fmax_246',['SNTP_RETRY_TIMEOUT_MAX',['../group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699',1,'sntp_opts.h']]],
-  ['sntp_5fserver_247',['sntp_server',['../structsntp__server.html',1,'']]],
-  ['sntp_5fserver_5fdns_248',['SNTP_SERVER_DNS',['../group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f',1,'sntp_opts.h']]],
-  ['sntp_5fset_5fsystem_5ftime_249',['SNTP_SET_SYSTEM_TIME',['../group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6',1,'sntp_opts.h']]],
-  ['sntp_5fsetoperatingmode_250',['sntp_setoperatingmode',['../group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120',1,'sntp_setoperatingmode(u8_t operating_mode):&#160;sntp.c'],['../group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120',1,'sntp_setoperatingmode(u8_t operating_mode):&#160;sntp.c']]],
-  ['sntp_5fsetserver_251',['sntp_setserver',['../group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a',1,'sntp_setserver(u8_t idx, const ip_addr_t *server):&#160;sntp.c'],['../group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a',1,'sntp_setserver(u8_t idx, const ip_addr_t *addr):&#160;sntp.c']]],
-  ['sntp_5fstartup_5fdelay_252',['SNTP_STARTUP_DELAY',['../group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa',1,'sntp_opts.h']]],
-  ['sntp_5fstartup_5fdelay_5ffunc_253',['SNTP_STARTUP_DELAY_FUNC',['../group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75',1,'sntp_opts.h']]],
-  ['sntp_5fstop_254',['sntp_stop',['../group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488',1,'sntp_stop(void):&#160;sntp.c'],['../group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488',1,'sntp_stop(void):&#160;sntp.c']]],
-  ['sntp_5ftime_255',['sntp_time',['../structsntp__time.html',1,'']]],
-  ['sntp_5ftimestamps_256',['sntp_timestamps',['../structsntp__timestamps.html',1,'']]],
-  ['sntp_5fupdate_5fdelay_257',['SNTP_UPDATE_DELAY',['../group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c',1,'sntp_opts.h']]],
-  ['so_5freuse_258',['SO_REUSE',['../group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942',1,'opt.h']]],
-  ['so_5freuse_5frxtoall_259',['SO_REUSE_RXTOALL',['../group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44',1,'opt.h']]],
-  ['sockaddr_5faligned_260',['sockaddr_aligned',['../unionsockaddr__aligned.html',1,'']]],
-  ['socket_261',['socket',['../structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36',1,'netconn']]],
-  ['socket_20api_262',['Socket API',['../group__socket.html',1,'']]],
-  ['socket_2eh_263',['socket.h',['../socket_8h.html',1,'']]],
-  ['sockets_264',['Sockets',['../group__lwip__opts__socket.html',1,'']]],
-  ['sockets_2ec_265',['sockets.c',['../sockets_8c.html',1,'']]],
-  ['sockets_2eh_266',['sockets.h',['../sockets_8h.html',1,'']]],
-  ['sockets_5fdebug_267',['SOCKETS_DEBUG',['../group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934',1,'opt.h']]],
-  ['sockets_5fpriv_2eh_268',['sockets_priv.h',['../sockets__priv_8h.html',1,'']]],
-  ['source_5faddr_269',['source_addr',['../structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a',1,'mdns_packet']]],
-  ['source_5faddress_270',['source_address',['../structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937',1,'ieee_802154_hdr']]],
-  ['source_5fpan_5fid_271',['source_pan_id',['../structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2',1,'ieee_802154_hdr']]],
-  ['src_272',['src',['../structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef',1,'ip6_hdr']]],
-  ['standard_20functions_273',['Non-standard functions',['../group__sys__nonstandard.html',1,'']]],
-  ['state_274',['state',['../structsmtp__session.html#aed9c182738767279c2b58b1e3322db09',1,'smtp_session::state'],['../structnetconn.html#a936c33090ec35e5e8c0011be5515a589',1,'netconn::state'],['../structautoip.html#a51af55190548e378e310aeaddfa1fdef',1,'autoip::state'],['../structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3',1,'netif::state'],['../structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c',1,'netif_ext_callback_args_t::link_changed_s::state'],['../structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7',1,'netif_ext_callback_args_t::status_changed_s::state']]],
-  ['static_5fdata_275',['static_data',['../structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4',1,'smtp_send_request']]],
-  ['statistics_276',['Statistics',['../group__lwip__opts__stats.html',1,'']]],
-  ['statistics_277',['MIB2 statistics',['../group__netif__mib2.html',1,'']]],
-  ['stats_278',['stats',['../structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500',1,'memp_desc']]],
-  ['stats_2ec_279',['stats.c',['../stats_8c.html',1,'']]],
-  ['stats_2eh_280',['stats.h',['../stats_8h.html',1,'']]],
-  ['stats_5f_281',['stats_',['../structstats__.html',1,'']]],
-  ['stats_5figmp_282',['stats_igmp',['../structstats__igmp.html',1,'']]],
-  ['stats_5finit_283',['stats_init',['../stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d',1,'stats_init(void):&#160;stats.c'],['../stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d',1,'stats_init(void):&#160;stats.c']]],
-  ['stats_5fmem_284',['stats_mem',['../structstats__mem.html',1,'']]],
-  ['stats_5fmib2_285',['stats_mib2',['../structstats__mib2.html',1,'']]],
-  ['stats_5fmib2_5fnetif_5fctrs_286',['stats_mib2_netif_ctrs',['../structstats__mib2__netif__ctrs.html',1,'']]],
-  ['stats_5fproto_287',['stats_proto',['../structstats__proto.html',1,'']]],
-  ['stats_5fsys_288',['stats_sys',['../structstats__sys.html',1,'']]],
-  ['stats_5fsyselem_289',['stats_syselem',['../structstats__syselem.html',1,'']]],
-  ['status_5fcallback_290',['status_callback',['../structnetif.html#a1513e81d02557d2a950e965f18b53a45',1,'netif']]],
-  ['status_5fchanged_5fs_291',['status_changed_s',['../structnetif__ext__callback__args__t_1_1status__changed__s.html',1,'netif_ext_callback_args_t']]],
-  ['style_20apis_292',['style APIs',['../group__lwip__opts__callback.html',1,'Callback-style APIs'],['../group__sequential__api.html',1,'Sequential-style APIs']]],
-  ['subject_293',['subject',['../structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7',1,'smtp_session']]],
-  ['subject_5flen_294',['subject_len',['../structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c',1,'smtp_session']]],
-  ['swap_5fbytes_5fin_5fword_295',['SWAP_BYTES_IN_WORD',['../inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18',1,'inet_chksum.h']]],
-  ['sys_296',['sys',['../structstats__.html#a317123da6c92aa9d2fa40e8060357035',1,'stats_']]],
-  ['sys_2ec_297',['sys.c',['../sys_8c.html',1,'']]],
-  ['sys_2eh_298',['sys.h',['../sys_8h.html',1,'']]],
-  ['sys_5farch_5fdecl_5fprotect_299',['SYS_ARCH_DECL_PROTECT',['../group__sys__prot.html#ga945395fa326214fc9736487242710a90',1,'sys.h']]],
-  ['sys_5farch_5fmbox_5ffetch_300',['sys_arch_mbox_fetch',['../group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8',1,'sys.h']]],
-  ['sys_5farch_5fmbox_5ftryfetch_301',['sys_arch_mbox_tryfetch',['../group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c',1,'sys.h']]],
-  ['sys_5farch_5fprotect_302',['SYS_ARCH_PROTECT',['../group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab',1,'sys.h']]],
-  ['sys_5farch_5fsem_5fwait_303',['sys_arch_sem_wait',['../group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f',1,'sys.h']]],
-  ['sys_5farch_5ftimeout_304',['SYS_ARCH_TIMEOUT',['../sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b',1,'sys.h']]],
-  ['sys_5farch_5funprotect_305',['SYS_ARCH_UNPROTECT',['../group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2',1,'sys.h']]],
-  ['sys_5fcheck_5ftimeouts_306',['sys_check_timeouts',['../group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883',1,'sys_check_timeouts(void):&#160;timeouts.c'],['../group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883',1,'sys_check_timeouts(void):&#160;timeouts.c']]],
-  ['sys_5fdebug_307',['SYS_DEBUG',['../group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642',1,'opt.h']]],
-  ['sys_5finit_308',['sys_init',['../group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448',1,'sys.h']]],
-  ['sys_5fjiffies_309',['sys_jiffies',['../sys_8h.html#ac89f307e8b360eaf821b461a4f26753a',1,'sys.h']]],
-  ['sys_5flightweight_5fprot_310',['SYS_LIGHTWEIGHT_PROT',['../group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959',1,'opt.h']]],
-  ['sys_5fmbox_5fempty_311',['SYS_MBOX_EMPTY',['../sys_8h.html#ab0571e67edca0132b144106e9b319ef9',1,'sys.h']]],
-  ['sys_5fmbox_5ffree_312',['sys_mbox_free',['../group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f',1,'sys.h']]],
-  ['sys_5fmbox_5fnew_313',['sys_mbox_new',['../group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc',1,'sys.h']]],
-  ['sys_5fmbox_5fpost_314',['sys_mbox_post',['../group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555',1,'sys.h']]],
-  ['sys_5fmbox_5fset_5finvalid_315',['sys_mbox_set_invalid',['../group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172',1,'sys.h']]],
-  ['sys_5fmbox_5fset_5finvalid_5fval_316',['sys_mbox_set_invalid_val',['../sys_8h.html#ae293feebb61d36f2db99be53702b8203',1,'sys.h']]],
-  ['sys_5fmbox_5ftryfetch_317',['sys_mbox_tryfetch',['../sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13',1,'sys.h']]],
-  ['sys_5fmbox_5ftrypost_318',['sys_mbox_trypost',['../group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195',1,'sys.h']]],
-  ['sys_5fmbox_5ftrypost_5ffromisr_319',['sys_mbox_trypost_fromisr',['../group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a',1,'sys.h']]],
-  ['sys_5fmbox_5fvalid_320',['sys_mbox_valid',['../group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d',1,'sys.h']]],
-  ['sys_5fmbox_5fvalid_5fval_321',['sys_mbox_valid_val',['../sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb',1,'sys.h']]],
-  ['sys_5fmsleep_322',['sys_msleep',['../group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e',1,'sys_msleep(u32_t ms):&#160;sys.c'],['../group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e',1,'sys_msleep(u32_t ms):&#160;sys.c']]],
-  ['sys_5fmutex_5ffree_323',['sys_mutex_free',['../group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9',1,'sys.h']]],
-  ['sys_5fmutex_5flock_324',['sys_mutex_lock',['../group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a',1,'sys.h']]],
-  ['sys_5fmutex_5fnew_325',['sys_mutex_new',['../group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897',1,'sys.h']]],
-  ['sys_5fmutex_5fset_5finvalid_326',['sys_mutex_set_invalid',['../group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8',1,'sys.h']]],
-  ['sys_5fmutex_5funlock_327',['sys_mutex_unlock',['../group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb',1,'sys.h']]],
-  ['sys_5fmutex_5fvalid_328',['sys_mutex_valid',['../group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a',1,'sys.h']]],
-  ['sys_5fnow_329',['sys_now',['../group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199',1,'sys.h']]],
-  ['sys_5frestart_5ftimeouts_330',['sys_restart_timeouts',['../timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e',1,'sys_restart_timeouts(void):&#160;timeouts.c'],['../timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e',1,'sys_restart_timeouts(void):&#160;timeouts.c']]],
-  ['sys_5fsem_5ffree_331',['sys_sem_free',['../group__sys__sem.html#ga83b781f96c30e915c752065a757da283',1,'sys.h']]],
-  ['sys_5fsem_5fnew_332',['sys_sem_new',['../group__sys__sem.html#gaf99da9e34a71855285c535183133dfde',1,'sys.h']]],
-  ['sys_5fsem_5fset_5finvalid_333',['sys_sem_set_invalid',['../group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33',1,'sys.h']]],
-  ['sys_5fsem_5fset_5finvalid_5fval_334',['sys_sem_set_invalid_val',['../sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8',1,'sys.h']]],
-  ['sys_5fsem_5fsignal_335',['sys_sem_signal',['../group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875',1,'sys.h']]],
-  ['sys_5fsem_5fvalid_336',['sys_sem_valid',['../group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4',1,'sys.h']]],
-  ['sys_5fsem_5fvalid_5fval_337',['sys_sem_valid_val',['../sys_8h.html#a9e8ad541356786936f23ab83b8f550cc',1,'sys.h']]],
-  ['sys_5fsem_5fwait_338',['sys_sem_wait',['../sys_8h.html#a84e7e4bc00255aee84e6e7289a985703',1,'sys.h']]],
-  ['sys_5fstats_339',['SYS_STATS',['../group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218',1,'opt.h']]],
-  ['sys_5fthread_5fnew_340',['sys_thread_new',['../group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a',1,'sys.h']]],
-  ['sys_5ftimeout_341',['sys_timeout',['../timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8',1,'sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg):&#160;timeouts.c'],['../timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8',1,'sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg):&#160;timeouts.c']]],
-  ['sys_5ftimeout_5fhandler_342',['sys_timeout_handler',['../timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25',1,'timeouts.h']]],
-  ['sys_5ftimeouts_5finit_343',['sys_timeouts_init',['../timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c',1,'sys_timeouts_init(void):&#160;timeouts.c'],['../timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c',1,'sys_timeouts_init(void):&#160;timeouts.c']]],
-  ['sys_5ftimeouts_5fsleeptime_344',['sys_timeouts_sleeptime',['../timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664',1,'sys_timeouts_sleeptime(void):&#160;timeouts.c'],['../timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664',1,'sys_timeouts_sleeptime(void):&#160;timeouts.c']]],
-  ['sys_5ftimeouts_5fsleeptime_5finfinite_345',['SYS_TIMEOUTS_SLEEPTIME_INFINITE',['../timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0',1,'timeouts.h']]],
-  ['sys_5funtimeout_346',['sys_untimeout',['../timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6',1,'sys_untimeout(sys_timeout_handler handler, void *arg):&#160;timeouts.c'],['../timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6',1,'sys_untimeout(sys_timeout_handler handler, void *arg):&#160;timeouts.c']]],
-  ['system_20abstraction_20layer_347',['Porting (system abstraction layer)',['../group__sys__layer.html',1,'']]],
-  ['system_20initalization_348',['System initalization',['../sys_init.html',1,'']]]
+  ['set_5ftimeout_5ffrom_5foffered_19',['SET_TIMEOUT_FROM_OFFERED',['../dhcp_8c.html#a33f306da575f8a437996d073b374df82',1,'dhcp.c']]],
+  ['set_5fvalue_20',['set_value',['../structsnmp__node__instance.html#a55fb4cadefcab9c74c3fb529c2560834',1,'snmp_node_instance::set_value'],['../structsnmp__table__node.html#a2a3e8ac0dcce64604fc17e1de3c5a804',1,'snmp_table_node::set_value']]],
+  ['size_21',['size',['../structmemp__desc.html#a1688d2bdd5a7b77700e1fa627f025ba3',1,'memp_desc']]],
+  ['sizes_22',['Debugging memory pool sizes',['../mem_err.html',1,'']]],
+  ['slip_23',['SLIP',['../group__slipif.html',1,'']]],
+  ['slip_5fdebug_24',['SLIP_DEBUG',['../group__lwip__opts__debugmsg.html#gab986f95183559d8678c6d80969b01857',1,'opt.h']]],
+  ['slip_5fmax_5fsize_25',['SLIP_MAX_SIZE',['../slipif_8c.html#accf448f9dabb0f33ef46b40355691cab',1,'slipif.c']]],
+  ['slip_5frx_5fqueue_26',['SLIP_RX_QUEUE',['../slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668',1,'slipif.h']]],
+  ['slip_5fsio_5fspeed_27',['SLIP_SIO_SPEED',['../slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc',1,'slipif.c']]],
+  ['slip_5fuse_5frx_5fthread_28',['SLIP_USE_RX_THREAD',['../slipif_8h.html#a198967c11f79cffc32192710294e8826',1,'slipif.h']]],
+  ['slipif_2ec_29',['slipif.c',['../slipif_8c.html',1,'']]],
+  ['slipif_2eh_30',['slipif.h',['../slipif_8h.html',1,'']]],
+  ['slipif_5finit_31',['slipif_init',['../group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3',1,'slipif_init(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3',1,'slipif_init(struct netif *netif):&#160;slipif.c']]],
+  ['slipif_5fpoll_32',['slipif_poll',['../group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6',1,'slipif_poll(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6',1,'slipif_poll(struct netif *netif):&#160;slipif.c']]],
+  ['slipif_5fprocess_5frxqueue_33',['slipif_process_rxqueue',['../group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946',1,'slipif_process_rxqueue(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946',1,'slipif_process_rxqueue(struct netif *netif):&#160;slipif.c']]],
+  ['slipif_5freceived_5fbyte_34',['slipif_received_byte',['../group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3',1,'slipif_received_byte(struct netif *netif, u8_t data):&#160;slipif.c'],['../group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3',1,'slipif_received_byte(struct netif *netif, u8_t data):&#160;slipif.c']]],
+  ['slipif_5freceived_5fbytes_35',['slipif_received_bytes',['../group__slipif.html#gabbee48569a513c90fe154632038eb6d6',1,'slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len):&#160;slipif.c'],['../group__slipif.html#gabbee48569a513c90fe154632038eb6d6',1,'slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len):&#160;slipif.c']]],
+  ['slipif_5fthread_5fname_36',['SLIPIF_THREAD_NAME',['../group__lwip__opts__thread.html#gae9cd260c56472324a2f0ee5f9597a675',1,'opt.h']]],
+  ['slipif_5fthread_5fprio_37',['SLIPIF_THREAD_PRIO',['../group__lwip__opts__thread.html#gab1b9fc2efcbf1f804bfd0191bc019c4e',1,'opt.h']]],
+  ['slipif_5fthread_5fstacksize_38',['SLIPIF_THREAD_STACKSIZE',['../group__lwip__opts__thread.html#gae8ab54a25007ce997bbab6289815e258',1,'opt.h']]],
+  ['smemcpy_39',['SMEMCPY',['../group__lwip__opts__memcpy.html#ga8c6e3c1e4f74acb16376188dbf8909ec',1,'opt.h']]],
+  ['smtp_20client_40',['SMTP client',['../group__smtp.html',1,'']]],
+  ['smtp_2ec_41',['smtp.c',['../smtp_8c.html',1,'']]],
+  ['smtp_5fbodydh_42',['SMTP_BODYDH',['../group__smtp__opts.html#ga4b1667149354b7819847cb4f5f1ff144',1,'smtp_opts.h']]],
+  ['smtp_5fcheck_5fdata_43',['SMTP_CHECK_DATA',['../group__smtp__opts.html#ga021d8133159895a2dbf5fb0b243da9fa',1,'smtp_opts.h']]],
+  ['smtp_5fcopy_5fauthdata_44',['SMTP_COPY_AUTHDATA',['../group__smtp__opts.html#gab5559a7c976e72204d9391f655bcc07e',1,'smtp_opts.h']]],
+  ['smtp_5fdebug_45',['SMTP_DEBUG',['../group__smtp__opts.html#gae7ea4f31c521947d5127e268ae02c317',1,'smtp_opts.h']]],
+  ['smtp_5fmax_5fpass_5flen_46',['SMTP_MAX_PASS_LEN',['../group__smtp__opts.html#ga9aa5f5529121a8266947f33c5e424ccc',1,'smtp_opts.h']]],
+  ['smtp_5fmax_5fservername_5flen_47',['SMTP_MAX_SERVERNAME_LEN',['../group__smtp__opts.html#gaee3b273524a2253ce5fb44b240b0371b',1,'smtp_opts.h']]],
+  ['smtp_5fmax_5fusername_5flen_48',['SMTP_MAX_USERNAME_LEN',['../group__smtp__opts.html#gafa0c84e5279b8eb8a5dbea6fe97aa099',1,'smtp_opts.h']]],
+  ['smtp_5fpoll_5finterval_49',['SMTP_POLL_INTERVAL',['../smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e',1,'smtp.c']]],
+  ['smtp_5fsend_5fmail_50',['smtp_send_mail',['../group__smtp.html#gae43119480c4146df9eeff7ae80c767f7',1,'smtp_send_mail(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c'],['../group__smtp.html#gae43119480c4146df9eeff7ae80c767f7',1,'smtp_send_mail(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c']]],
+  ['smtp_5fsend_5fmail_5fint_51',['smtp_send_mail_int',['../group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243',1,'smtp_send_mail_int(void *arg):&#160;smtp.c'],['../group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243',1,'smtp_send_mail_int(void *arg):&#160;smtp.c']]],
+  ['smtp_5fsend_5fmail_5fstatic_52',['smtp_send_mail_static',['../group__smtp.html#ga06f6582701def2a62582373bb0be5788',1,'smtp_send_mail_static(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c'],['../group__smtp.html#ga06f6582701def2a62582373bb0be5788',1,'smtp_send_mail_static(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c']]],
+  ['smtp_5fsend_5frequest_53',['smtp_send_request',['../structsmtp__send__request.html',1,'']]],
+  ['smtp_5fsession_54',['smtp_session',['../structsmtp__session.html',1,'']]],
+  ['smtp_5fsession_5fstate_55',['smtp_session_state',['../smtp_8c.html#a04947fff2d3a3803e6c716aecc7f2bae',1,'smtp.c']]],
+  ['smtp_5fset_5fauth_56',['smtp_set_auth',['../group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899',1,'smtp_set_auth(const char *username, const char *pass):&#160;smtp.c'],['../group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899',1,'smtp_set_auth(const char *username, const char *pass):&#160;smtp.c']]],
+  ['smtp_5fset_5fserver_5faddr_57',['smtp_set_server_addr',['../group__smtp.html#ga1ccf4305461ec16cf41599341ec54983',1,'smtp_set_server_addr(const char *server):&#160;smtp.c'],['../group__smtp.html#ga1ccf4305461ec16cf41599341ec54983',1,'smtp_set_server_addr(const char *server):&#160;smtp.c']]],
+  ['smtp_5fset_5fserver_5fport_58',['smtp_set_server_port',['../group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f',1,'smtp_set_server_port(u16_t port):&#160;smtp.c'],['../group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f',1,'smtp_set_server_port(u16_t port):&#160;smtp.c']]],
+  ['smtp_5fset_5ftls_5fconfig_59',['smtp_set_tls_config',['../group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e',1,'smtp_set_tls_config(struct altcp_tls_config *tls_config):&#160;smtp.c'],['../group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e',1,'smtp_set_tls_config(struct altcp_tls_config *tls_config):&#160;smtp.c']]],
+  ['smtp_5fsupport_5fauth_5flogin_60',['SMTP_SUPPORT_AUTH_LOGIN',['../group__smtp__opts.html#ga7a83e686b109fa59557c13736aeeab3b',1,'smtp_opts.h']]],
+  ['smtp_5fsupport_5fauth_5fplain_61',['SMTP_SUPPORT_AUTH_PLAIN',['../group__smtp__opts.html#ga2e6c8313006592884e89bbcf353cf5ac',1,'smtp_opts.h']]],
+  ['smtp_5ftimeout_62',['SMTP_TIMEOUT',['../smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6',1,'smtp.c']]],
+  ['smtp_5ftimeout_5fdatablock_63',['SMTP_TIMEOUT_DATABLOCK',['../smtp_8c.html#ad853ab316a3b866b87c0454053febfe3',1,'smtp.c']]],
+  ['smtp_5ftimeout_5fdataterm_64',['SMTP_TIMEOUT_DATATERM',['../smtp_8c.html#a73855e673457f748b6bcba49aab9b035',1,'smtp.c']]],
+  ['snmp_20mib2_20callbacks_65',['SNMP MIB2 callbacks',['../group__lwip__opts__mib2.html',1,'']]],
+  ['snmp_2eh_66',['snmp.h',['../apps_2snmp_8h.html',1,'(Global Namespace)'],['../snmp_8h.html',1,'(Global Namespace)']]],
+  ['snmp_5faccess_5ft_67',['snmp_access_t',['../snmp__core_8h.html#ad5a33687d1a6fcf970266b41b0633760',1,'snmp_core.h']]],
+  ['snmp_5fans1_5fenc_5ftlv_68',['snmp_ans1_enc_tlv',['../snmp__asn1_8c.html#af8e905a214936995d235789f359cf015',1,'snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#af8e905a214936995d235789f359cf015',1,'snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_2ec_69',['snmp_asn1.c',['../snmp__asn1_8c.html',1,'']]],
+  ['snmp_5fasn1_2eh_70',['snmp_asn1.h',['../snmp__asn1_8h.html',1,'']]],
+  ['snmp_5fasn1_5fdec_5foid_71',['snmp_asn1_dec_oid',['../snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908',1,'snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908',1,'snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fdec_5fraw_72',['snmp_asn1_dec_raw',['../snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e',1,'snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e',1,'snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fdec_5fs32t_73',['snmp_asn1_dec_s32t',['../snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb',1,'snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb',1,'snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fdec_5ftlv_74',['snmp_asn1_dec_tlv',['../snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496',1,'snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496',1,'snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fdec_5fu32t_75',['snmp_asn1_dec_u32t',['../snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51',1,'snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51',1,'snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5flength_5fcnt_76',['snmp_asn1_enc_length_cnt',['../snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d',1,'snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d',1,'snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5foid_77',['snmp_asn1_enc_oid',['../snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218',1,'snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218',1,'snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5foid_5fcnt_78',['snmp_asn1_enc_oid_cnt',['../snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f',1,'snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f',1,'snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fraw_79',['snmp_asn1_enc_raw',['../snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6',1,'snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6',1,'snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fs32t_80',['snmp_asn1_enc_s32t',['../snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6',1,'snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6',1,'snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fs32t_5fcnt_81',['snmp_asn1_enc_s32t_cnt',['../snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f',1,'snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f',1,'snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fu32t_82',['snmp_asn1_enc_u32t',['../snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2',1,'snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2',1,'snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fu32t_5fcnt_83',['snmp_asn1_enc_u32t_cnt',['../snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4',1,'snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4',1,'snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed):&#160;snmp_asn1.c']]],
+  ['snmp_5fauthfail_5ftrap_84',['snmp_authfail_trap',['../group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee',1,'snmp_authfail_trap(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee',1,'snmp_authfail_trap(void):&#160;snmp_traps.c']]],
+  ['snmp_5fcoldstart_5ftrap_85',['snmp_coldstart_trap',['../group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be',1,'snmp_coldstart_trap(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be',1,'snmp_coldstart_trap(void):&#160;snmp_traps.c']]],
+  ['snmp_5fcommunity_86',['SNMP_COMMUNITY',['../group__snmp__opts.html#ga316c1e1f06f0c7ca56589563809e64db',1,'snmp_opts.h']]],
+  ['snmp_5fcommunity_87',['snmp_community',['../snmp__msg_8c.html#ac6f810ab812c44c6ca1df1fdf926a9f6',1,'snmp_community:&#160;snmp_msg.c'],['../snmp__msg_8h.html#ac6f810ab812c44c6ca1df1fdf926a9f6',1,'snmp_community:&#160;snmp_msg.c']]],
+  ['snmp_5fcommunity_5ftrap_88',['SNMP_COMMUNITY_TRAP',['../group__snmp__opts.html#gaaefc9dda5f8e5c296018a463cdbac39b',1,'snmp_opts.h']]],
+  ['snmp_5fcommunity_5ftrap_89',['snmp_community_trap',['../snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b',1,'snmp_community_trap:&#160;snmp_msg.c'],['../snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b',1,'snmp_community_trap:&#160;snmp_msg.c']]],
+  ['snmp_5fcommunity_5fwrite_90',['SNMP_COMMUNITY_WRITE',['../group__snmp__opts.html#gafb9414dc7a33978b62a3a9838b659464',1,'snmp_opts.h']]],
+  ['snmp_5fcommunity_5fwrite_91',['snmp_community_write',['../snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04',1,'snmp_community_write:&#160;snmp_msg.c'],['../snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04',1,'snmp_community_write:&#160;snmp_msg.c']]],
+  ['snmp_5fcore_2ec_92',['snmp_core.c',['../snmp__core_8c.html',1,'']]],
+  ['snmp_5fcore_2eh_93',['snmp_core.h',['../snmp__core_8h.html',1,'']]],
+  ['snmp_5fcreate_5fthread_5fsync_5fnode_94',['SNMP_CREATE_THREAD_SYNC_NODE',['../snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2',1,'snmp_threadsync.h']]],
+  ['snmp_5fdebug_95',['SNMP_DEBUG',['../group__snmp__opts.html#gac041000361342f51ad5ee5d8f6254e02',1,'snmp_opts.h']]],
+  ['snmp_5fdecode_5fbits_96',['snmp_decode_bits',['../snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc',1,'snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value):&#160;snmp_core.c'],['../snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc',1,'snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value):&#160;snmp_core.c']]],
+  ['snmp_5fdevice_5fenterprise_5foid_97',['SNMP_DEVICE_ENTERPRISE_OID',['../group__snmp__opts.html#ga09118b734e85df152af098744e888b34',1,'snmp_opts.h']]],
+  ['snmp_5fdevice_5fenterprise_5foid_5flen_98',['SNMP_DEVICE_ENTERPRISE_OID_LEN',['../group__snmp__opts.html#ga9e39ba5308f5c7ac5296c7d05fdfa97f',1,'snmp_opts.h']]],
+  ['snmp_5fencode_5fbits_99',['snmp_encode_bits',['../snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03',1,'snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count):&#160;snmp_core.c'],['../snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03',1,'snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count):&#160;snmp_core.c']]],
+  ['snmp_5ferr_5ft_100',['snmp_err_t',['../snmp__core_8h.html#abaa9cdad345ad93da515d31625a54589',1,'snmp_core.h']]],
+  ['snmp_5fgentrap_5fauth_5ffailure_101',['SNMP_GENTRAP_AUTH_FAILURE',['../apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fcoldstart_102',['SNMP_GENTRAP_COLDSTART',['../apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fegp_5fneighbor_5floss_103',['SNMP_GENTRAP_EGP_NEIGHBOR_LOSS',['../apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fenterprise_5fspecific_104',['SNMP_GENTRAP_ENTERPRISE_SPECIFIC',['../apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43',1,'snmp.h']]],
+  ['snmp_5fgentrap_5flinkdown_105',['SNMP_GENTRAP_LINKDOWN',['../apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16',1,'snmp.h']]],
+  ['snmp_5fgentrap_5flinkup_106',['SNMP_GENTRAP_LINKUP',['../apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fwarmstart_107',['SNMP_GENTRAP_WARMSTART',['../apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926',1,'snmp.h']]],
+  ['snmp_5fget_5fauth_5ftraps_5fenabled_108',['snmp_get_auth_traps_enabled',['../group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7',1,'snmp_get_auth_traps_enabled(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7',1,'snmp_get_auth_traps_enabled(void):&#160;snmp_traps.c']]],
+  ['snmp_5fget_5fcommunity_109',['snmp_get_community',['../group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8',1,'snmp_get_community(void):&#160;snmp_msg.c'],['../group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8',1,'snmp_get_community(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fcommunity_5ftrap_110',['snmp_get_community_trap',['../group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba',1,'snmp_get_community_trap(void):&#160;snmp_msg.c'],['../group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba',1,'snmp_get_community_trap(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fcommunity_5fwrite_111',['snmp_get_community_write',['../group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e',1,'snmp_get_community_write(void):&#160;snmp_msg.c'],['../group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e',1,'snmp_get_community_write(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fdefault_5ftrap_5fversion_112',['snmp_get_default_trap_version',['../group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359',1,'snmp_get_default_trap_version(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359',1,'snmp_get_default_trap_version(void):&#160;snmp_traps.c']]],
+  ['snmp_5fget_5fdevice_5fenterprise_5foid_113',['snmp_get_device_enterprise_oid',['../group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c'],['../group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c']]],
+  ['snmp_5fiftype_114',['snmp_ifType',['../group__netif__mib2.html#ga15378b8dcd2a9dc2985142d864a767ba',1,'snmp.h']]],
+  ['snmp_5finit_115',['snmp_init',['../snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5',1,'snmp_init(void):&#160;snmp_netconn.c'],['../group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5',1,'snmp_init(void):&#160;snmp_raw.c']]],
+  ['snmp_5fip4_5fto_5foid_116',['snmp_ip4_to_oid',['../snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1',1,'snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1',1,'snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
+  ['snmp_5fip6_5fto_5foid_117',['snmp_ip6_to_oid',['../snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9',1,'snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9',1,'snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
+  ['snmp_5fip_5fport_5fto_5foid_118',['snmp_ip_port_to_oid',['../snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27',1,'snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27',1,'snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid):&#160;snmp_core.c']]],
+  ['snmp_5fip_5fto_5foid_119',['snmp_ip_to_oid',['../snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e',1,'snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e',1,'snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
+  ['snmp_5fleaf_5fnode_120',['snmp_leaf_node',['../structsnmp__leaf__node.html',1,'']]],
+  ['snmp_5flwip_5fenterprise_5foid_121',['SNMP_LWIP_ENTERPRISE_OID',['../group__snmp__opts.html#ga868bfef6efe05515c86291137a633479',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fgetbulk_5fmax_5frepetitions_122',['SNMP_LWIP_GETBULK_MAX_REPETITIONS',['../group__snmp__opts.html#ga5a24152aa5f3c2837b9a3145aa3c59f3',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2_123',['SNMP_LWIP_MIB2',['../group__snmp__opts.html#gaab667d48f48ee89f8bdbc7f134e6037d',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2_5fsyscontact_124',['SNMP_LWIP_MIB2_SYSCONTACT',['../group__snmp__opts.html#ga1a57501c615b630d363e0af1a504e683',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2_5fsysdesc_125',['SNMP_LWIP_MIB2_SYSDESC',['../group__snmp__opts.html#gae93a105b421a2ca91e862da5087cec73',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2_5fsyslocation_126',['SNMP_LWIP_MIB2_SYSLOCATION',['../group__snmp__opts.html#ga311cec98c8f7e4851d325fffe96cf8d9',1,'snmp_opts.h']]],
+  ['snmp_5flwip_5fmib2_5fsysname_127',['SNMP_LWIP_MIB2_SYSNAME',['../group__snmp__opts.html#ga80ba46f9517a51b5477f13082b2bcf98',1,'snmp_opts.h']]],
+  ['snmp_5fmax_5fcommunity_5fstr_5flen_128',['SNMP_MAX_COMMUNITY_STR_LEN',['../group__snmp__opts.html#ga0e98b58159a77688f87f9f50479177fd',1,'snmp_opts.h']]],
+  ['snmp_5fmax_5fobj_5fid_5flen_129',['SNMP_MAX_OBJ_ID_LEN',['../group__snmp__opts.html#ga3ad9d293f90e3c885c4e3263a9064a41',1,'snmp_opts.h']]],
+  ['snmp_5fmax_5foctet_5fstring_5flen_130',['SNMP_MAX_OCTET_STRING_LEN',['../group__snmp__opts.html#gae50cdd09697aa54a8b9f26432ac55ac2',1,'snmp_opts.h']]],
+  ['snmp_5fmax_5fvalue_5fsize_131',['SNMP_MAX_VALUE_SIZE',['../group__snmp__opts.html#gafb4362575bc50476a7401a1ed14787f0',1,'snmp_opts.h']]],
+  ['snmp_5fmib_132',['snmp_mib',['../structsnmp__mib.html',1,'']]],
+  ['snmp_5fmib2_2ec_133',['snmp_mib2.c',['../snmp__mib2_8c.html',1,'']]],
+  ['snmp_5fmib2_2eh_134',['snmp_mib2.h',['../snmp__mib2_8h.html',1,'']]],
+  ['snmp_5fmib2_5ficmp_2ec_135',['snmp_mib2_icmp.c',['../snmp__mib2__icmp_8c.html',1,'']]],
+  ['snmp_5fmib2_5finterfaces_2ec_136',['snmp_mib2_interfaces.c',['../snmp__mib2__interfaces_8c.html',1,'']]],
+  ['snmp_5fmib2_5fip_2ec_137',['snmp_mib2_ip.c',['../snmp__mib2__ip_8c.html',1,'']]],
+  ['snmp_5fmib2_5fset_5fsyscontact_138',['snmp_mib2_set_syscontact',['../group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e',1,'snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e',1,'snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsyscontact_5freadonly_139',['snmp_mib2_set_syscontact_readonly',['../group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a',1,'snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a',1,'snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsysdescr_140',['snmp_mib2_set_sysdescr',['../group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc',1,'snmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc',1,'snmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsyslocation_141',['snmp_mib2_set_syslocation',['../group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2',1,'snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2',1,'snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsyslocation_5freadonly_142',['snmp_mib2_set_syslocation_readonly',['../group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267',1,'snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267',1,'snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsysname_143',['snmp_mib2_set_sysname',['../group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7',1,'snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7',1,'snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsysname_5freadonly_144',['snmp_mib2_set_sysname_readonly',['../group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5',1,'snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5',1,'snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fsnmp_2ec_145',['snmp_mib2_snmp.c',['../snmp__mib2__snmp_8c.html',1,'']]],
+  ['snmp_5fmib2_5fsystem_2ec_146',['snmp_mib2_system.c',['../snmp__mib2__system_8c.html',1,'']]],
+  ['snmp_5fmib2_5ftcp_2ec_147',['snmp_mib2_tcp.c',['../snmp__mib2__tcp_8c.html',1,'']]],
+  ['snmp_5fmib2_5fudp_2ec_148',['snmp_mib2_udp.c',['../snmp__mib2__udp_8c.html',1,'']]],
+  ['snmp_5fmib_5fdebug_149',['SNMP_MIB_DEBUG',['../group__snmp__opts.html#gac12240265db443eaf9d31d187e586c16',1,'snmp_opts.h']]],
+  ['snmp_5fmib_5ftree_5fresolve_5fexact_150',['snmp_mib_tree_resolve_exact',['../snmp__core_8c.html#a8ba7d922d9eaac8cd024aed1413901f6',1,'snmp_core.c']]],
+  ['snmp_5fmin_5fvalue_5fsize_151',['SNMP_MIN_VALUE_SIZE',['../group__snmp__opts.html#gac815d0dbe576299546ac612e7eaf3f90',1,'snmp_opts.h']]],
+  ['snmp_5fmsg_2ec_152',['snmp_msg.c',['../snmp__msg_8c.html',1,'']]],
+  ['snmp_5fmsg_2eh_153',['snmp_msg.h',['../snmp__msg_8h.html',1,'']]],
+  ['snmp_5fnetconn_2ec_154',['snmp_netconn.c',['../snmp__netconn_8c.html',1,'']]],
+  ['snmp_5fnext_5foid_5fcheck_155',['snmp_next_oid_check',['../snmp__core_8c.html#a18126b2b13f267306c27e851e9379983',1,'snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference):&#160;snmp_core.c'],['../snmp__core_8h.html#a18126b2b13f267306c27e851e9379983',1,'snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference):&#160;snmp_core.c']]],
+  ['snmp_5fnext_5foid_5finit_156',['snmp_next_oid_init',['../snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213',1,'snmp_next_oid_init(struct snmp_next_oid_state *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213',1,'snmp_next_oid_init(struct snmp_next_oid_state *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len):&#160;snmp_core.c']]],
+  ['snmp_5fnext_5foid_5fprecheck_157',['snmp_next_oid_precheck',['../snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a',1,'snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a',1,'snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
+  ['snmp_5fnext_5foid_5fstate_158',['snmp_next_oid_state',['../structsnmp__next__oid__state.html',1,'']]],
+  ['snmp_5fnode_159',['snmp_node',['../structsnmp__node.html',1,'']]],
+  ['snmp_5fnode_5finstance_160',['snmp_node_instance',['../structsnmp__node__instance.html',1,'']]],
+  ['snmp_5fnode_5ftree_161',['SNMP_NODE_TREE',['../snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72',1,'snmp_core.h']]],
+  ['snmp_5fobj_5fid_162',['snmp_obj_id',['../structsnmp__obj__id.html',1,'']]],
+  ['snmp_5foid_5fappend_163',['snmp_oid_append',['../snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93',1,'snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93',1,'snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fassign_164',['snmp_oid_assign',['../snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6',1,'snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6',1,'snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fcombine_165',['snmp_oid_combine',['../snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904',1,'snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904',1,'snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fcompare_166',['snmp_oid_compare',['../snmp__core_8c.html#af041ab415e8063097c79be2b892174f8',1,'snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#af041ab415e8063097c79be2b892174f8',1,'snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fequal_167',['snmp_oid_equal',['../snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e',1,'snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e',1,'snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fin_5frange_168',['snmp_oid_in_range',['../snmp__core_8c.html#a5275903be5948b1c28bfadb365823504',1,'snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a5275903be5948b1c28bfadb365823504',1,'snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fprefix_169',['snmp_oid_prefix',['../snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39',1,'snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39',1,'snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5frange_170',['snmp_oid_range',['../structsnmp__oid__range.html',1,'']]],
+  ['snmp_5foid_5fto_5fip_171',['snmp_oid_to_ip',['../snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84',1,'snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84',1,'snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fto_5fip4_172',['snmp_oid_to_ip4',['../snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77',1,'snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77',1,'snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fto_5fip6_173',['snmp_oid_to_ip6',['../snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09',1,'snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09',1,'snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fto_5fip_5fport_174',['snmp_oid_to_ip_port',['../snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507',1,'snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port):&#160;snmp_core.c'],['../snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507',1,'snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port):&#160;snmp_core.c']]],
+  ['snmp_5fopts_2eh_175',['snmp_opts.h',['../snmp__opts_8h.html',1,'']]],
+  ['snmp_5fpbuf_5fstream_2ec_176',['snmp_pbuf_stream.c',['../snmp__pbuf__stream_8c.html',1,'']]],
+  ['snmp_5fpbuf_5fstream_2eh_177',['snmp_pbuf_stream.h',['../snmp__pbuf__stream_8h.html',1,'']]],
+  ['snmp_5fraw_2ec_178',['snmp_raw.c',['../snmp__raw_8c.html',1,'']]],
+  ['snmp_5fsafe_5frequests_179',['SNMP_SAFE_REQUESTS',['../group__snmp__opts.html#ga95e39047b9bcb385780b06b35af49261',1,'snmp_opts.h']]],
+  ['snmp_5fscalar_2ec_180',['snmp_scalar.c',['../snmp__scalar_8c.html',1,'']]],
+  ['snmp_5fscalar_2eh_181',['snmp_scalar.h',['../snmp__scalar_8h.html',1,'']]],
+  ['snmp_5fscalar_5farray_5fnode_182',['snmp_scalar_array_node',['../structsnmp__scalar__array__node.html',1,'']]],
+  ['snmp_5fscalar_5farray_5fnode_5fdef_183',['snmp_scalar_array_node_def',['../structsnmp__scalar__array__node__def.html',1,'']]],
+  ['snmp_5fscalar_5fnode_184',['snmp_scalar_node',['../structsnmp__scalar__node.html',1,'']]],
+  ['snmp_5fsend_5finform_185',['snmp_send_inform',['../group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692',1,'snmp_send_inform(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c'],['../group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692',1,'snmp_send_inform(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5finform_5fgeneric_186',['snmp_send_inform_generic',['../group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275',1,'snmp_send_inform_generic(s32_t generic_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c'],['../group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275',1,'snmp_send_inform_generic(s32_t generic_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5finform_5fspecific_187',['snmp_send_inform_specific',['../group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210',1,'snmp_send_inform_specific(s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210',1,'snmp_send_inform_specific(s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5ftrap_188',['snmp_send_trap',['../group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c',1,'snmp_send_trap(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c',1,'snmp_send_trap(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5ftrap_5fgeneric_189',['snmp_send_trap_generic',['../group__snmp__traps.html#ga0e044259289cb690197173f93c17607d',1,'snmp_send_trap_generic(s32_t generic_trap):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga0e044259289cb690197173f93c17607d',1,'snmp_send_trap_generic(s32_t generic_trap):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5ftrap_5fspecific_190',['snmp_send_trap_specific',['../group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1',1,'snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1',1,'snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c']]],
+  ['snmp_5fset_5fauth_5ftraps_5fenabled_191',['snmp_set_auth_traps_enabled',['../group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c',1,'snmp_set_auth_traps_enabled(u8_t enable):&#160;snmp_traps.c'],['../group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c',1,'snmp_set_auth_traps_enabled(u8_t enable):&#160;snmp_traps.c']]],
+  ['snmp_5fset_5fcommunity_192',['snmp_set_community',['../group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1',1,'snmp_set_community(const char *const community):&#160;snmp_msg.c'],['../group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1',1,'snmp_set_community(const char *const community):&#160;snmp_msg.c']]],
+  ['snmp_5fset_5fcommunity_5ftrap_193',['snmp_set_community_trap',['../group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760',1,'snmp_set_community_trap(const char *const community):&#160;snmp_msg.c'],['../group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760',1,'snmp_set_community_trap(const char *const community):&#160;snmp_msg.c']]],
+  ['snmp_5fset_5fcommunity_5fwrite_194',['snmp_set_community_write',['../group__snmp__core.html#ga341461766863cff46a44e5f431f2da01',1,'snmp_set_community_write(const char *const community):&#160;snmp_msg.c'],['../group__snmp__core.html#ga341461766863cff46a44e5f431f2da01',1,'snmp_set_community_write(const char *const community):&#160;snmp_msg.c']]],
+  ['snmp_5fset_5fdefault_5ftrap_5fversion_195',['snmp_set_default_trap_version',['../group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455',1,'snmp_set_default_trap_version(u8_t snmp_version):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455',1,'snmp_set_default_trap_version(u8_t snmp_version):&#160;snmp_traps.c']]],
+  ['snmp_5fset_5fdevice_5fenterprise_5foid_196',['snmp_set_device_enterprise_oid',['../group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a',1,'snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid):&#160;snmp_core.c'],['../group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a',1,'snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid):&#160;snmp_core.c']]],
+  ['snmp_5fset_5finform_5fcallback_197',['snmp_set_inform_callback',['../group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838',1,'snmp_set_inform_callback(snmp_inform_callback_fct inform_callback, void *callback_arg):&#160;snmp_msg.c'],['../group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838',1,'snmp_set_inform_callback(snmp_inform_callback_fct inform_callback, void *callback_arg):&#160;snmp_msg.c']]],
+  ['snmp_5fset_5fmibs_198',['snmp_set_mibs',['../group__snmp__core.html#ga29c76474971f25d038fd486447c70e21',1,'snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs):&#160;snmp_core.c'],['../group__snmp__core.html#ga29c76474971f25d038fd486447c70e21',1,'snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs):&#160;snmp_core.c']]],
+  ['snmp_5fset_5fwrite_5fcallback_199',['snmp_set_write_callback',['../group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b',1,'snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg):&#160;snmp_msg.c'],['../group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b',1,'snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg):&#160;snmp_msg.c']]],
+  ['snmp_5fstack_5fsize_200',['SNMP_STACK_SIZE',['../group__snmp__opts.html#ga0dcacdccc61216c6773943ad3fd31242',1,'snmp_opts.h']]],
+  ['snmp_5ftable_2ec_201',['snmp_table.c',['../snmp__table_8c.html',1,'']]],
+  ['snmp_5ftable_2eh_202',['snmp_table.h',['../snmp__table_8h.html',1,'']]],
+  ['snmp_5ftable_5fcol_5fdef_203',['snmp_table_col_def',['../structsnmp__table__col__def.html',1,'']]],
+  ['snmp_5ftable_5fcolumn_5fdata_5ftype_5ft_204',['snmp_table_column_data_type_t',['../snmp__table_8h.html#af9b59f3ba7dccf338fe6e5bc1c4b1db5',1,'snmp_table.h']]],
+  ['snmp_5ftable_5fnode_205',['snmp_table_node',['../structsnmp__table__node.html',1,'']]],
+  ['snmp_5ftable_5fsimple_5fnode_206',['snmp_table_simple_node',['../structsnmp__table__simple__node.html',1,'']]],
+  ['snmp_5fthread_5fprio_207',['SNMP_THREAD_PRIO',['../group__snmp__opts.html#gad9bce0d9c05ed4607d72de7b75f2a80b',1,'snmp_opts.h']]],
+  ['snmp_5fthreadsync_2ec_208',['snmp_threadsync.c',['../snmp__threadsync_8c.html',1,'']]],
+  ['snmp_5fthreadsync_2eh_209',['snmp_threadsync.h',['../snmp__threadsync_8h.html',1,'']]],
+  ['snmp_5fthreadsync_5finit_210',['snmp_threadsync_init',['../snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6',1,'snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn):&#160;snmp_threadsync.c'],['../snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6',1,'snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn):&#160;snmp_threadsync.c']]],
+  ['snmp_5fthreadsync_5finstance_211',['snmp_threadsync_instance',['../structsnmp__threadsync__instance.html',1,'']]],
+  ['snmp_5fthreadsync_5fnode_212',['snmp_threadsync_node',['../structsnmp__threadsync__node.html',1,'']]],
+  ['snmp_5ftrap_5fdestinations_213',['SNMP_TRAP_DESTINATIONS',['../group__snmp__opts.html#ga692343b0cc555c302fd713003d4f8a08',1,'snmp_opts.h']]],
+  ['snmp_5ftrap_5fdst_5fenable_214',['snmp_trap_dst_enable',['../group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32',1,'snmp_trap_dst_enable(u8_t dst_idx, u8_t enable):&#160;snmp_traps.c'],['../group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32',1,'snmp_trap_dst_enable(u8_t dst_idx, u8_t enable):&#160;snmp_traps.c']]],
+  ['snmp_5ftrap_5fdst_5fip_5fset_215',['snmp_trap_dst_ip_set',['../group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86',1,'snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86',1,'snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst):&#160;snmp_traps.c']]],
+  ['snmp_5ftraps_2ec_216',['snmp_traps.c',['../snmp__traps_8c.html',1,'']]],
+  ['snmp_5ftraps_5fhandle_217',['snmp_traps_handle',['../snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a',1,'snmp_traps_handle:&#160;snmp_traps.c'],['../snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a',1,'snmp_traps_handle:&#160;snmp_traps.c']]],
+  ['snmp_5ftree_5fnode_218',['snmp_tree_node',['../structsnmp__tree__node.html',1,'']]],
+  ['snmp_5fuse_5fnetconn_219',['SNMP_USE_NETCONN',['../group__snmp__opts.html#gaf02e8b4b69e99df784e9953401477078',1,'snmp_opts.h']]],
+  ['snmp_5fuse_5fraw_220',['SNMP_USE_RAW',['../group__snmp__opts.html#ga8c93f4260af2eb3c50d4bc603f716f1f',1,'snmp_opts.h']]],
+  ['snmp_5fvarbind_221',['snmp_varbind',['../structsnmp__varbind.html',1,'']]],
+  ['snmp_5fvarbind_5flen_222',['snmp_varbind_len',['../structsnmp__varbind__len.html',1,'']]],
+  ['snmp_5fvarbind_5flength_223',['snmp_varbind_length',['../snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5',1,'snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len):&#160;snmp_msg.c'],['../snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5',1,'snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len):&#160;snmp_msg.c']]],
+  ['snmp_5fvariant_5fvalue_224',['snmp_variant_value',['../unionsnmp__variant__value.html',1,'']]],
+  ['snmpv2c_20v3_20agent_225',['SNMPv2c/v3 agent',['../group__snmp.html',1,'']]],
+  ['snmpv3_2ec_226',['snmpv3.c',['../snmpv3_8c.html',1,'']]],
+  ['snmpv3_2eh_227',['snmpv3.h',['../snmpv3_8h.html',1,'']]],
+  ['snmpv3_5fmbedtls_2ec_228',['snmpv3_mbedtls.c',['../snmpv3__mbedtls_8c.html',1,'']]],
+  ['snmpv3_5fpriv_2eh_229',['snmpv3_priv.h',['../snmpv3__priv_8h.html',1,'']]],
+  ['sntp_230',['SNTP',['../group__sntp.html',1,'']]],
+  ['sntp_2ec_231',['sntp.c',['../sntp_8c.html',1,'']]],
+  ['sntp_2eh_232',['sntp.h',['../sntp_8h.html',1,'']]],
+  ['sntp_5fcheck_5fresponse_233',['SNTP_CHECK_RESPONSE',['../group__sntp__opts.html#ga7d4e12d90912d486e64f289d7f3ca446',1,'sntp_opts.h']]],
+  ['sntp_5fcomp_5froundtrip_234',['SNTP_COMP_ROUNDTRIP',['../group__sntp__opts.html#ga1e21781705d3549a305339fd7fca63e7',1,'sntp_opts.h']]],
+  ['sntp_5fdebug_235',['SNTP_DEBUG',['../group__sntp__opts.html#ga25c6f9c14c17e218d110d826b09f8d91',1,'sntp_opts.h']]],
+  ['sntp_5fenabled_236',['sntp_enabled',['../group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5',1,'sntp_enabled(void):&#160;sntp.c'],['../group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5',1,'sntp_enabled(void):&#160;sntp.c']]],
+  ['sntp_5ffrac_5fto_5fus_237',['SNTP_FRAC_TO_US',['../sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f',1,'sntp.c']]],
+  ['sntp_5fget_5fservers_5ffrom_5fdhcp_238',['SNTP_GET_SERVERS_FROM_DHCP',['../group__sntp__opts.html#ga961a61eef942ab5378cff1e3742b3ade',1,'sntp_opts.h']]],
+  ['sntp_5fget_5fservers_5ffrom_5fdhcpv6_239',['SNTP_GET_SERVERS_FROM_DHCPV6',['../group__sntp__opts.html#ga0d5b4f1e382d08f0df9dbe0c9da64006',1,'sntp_opts.h']]],
+  ['sntp_5fget_5fsystem_5ftime_240',['SNTP_GET_SYSTEM_TIME',['../group__sntp__opts.html#gab0ea385479a5c5c8c173f165ded2fb63',1,'sntp_opts.h']]],
+  ['sntp_5fgetkodreceived_241',['sntp_getkodreceived',['../group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e',1,'sntp_getkodreceived(u8_t idx):&#160;sntp.c'],['../group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e',1,'sntp_getkodreceived(u8_t idx):&#160;sntp.c']]],
+  ['sntp_5fgetoperatingmode_242',['sntp_getoperatingmode',['../group__sntp.html#gae66404a551d5cef420cf844a71356fae',1,'sntp_getoperatingmode(void):&#160;sntp.c'],['../group__sntp.html#gae66404a551d5cef420cf844a71356fae',1,'sntp_getoperatingmode(void):&#160;sntp.c']]],
+  ['sntp_5fgetreachability_243',['sntp_getreachability',['../group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e',1,'sntp_getreachability(u8_t idx):&#160;sntp.c'],['../group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e',1,'sntp_getreachability(u8_t idx):&#160;sntp.c']]],
+  ['sntp_5fgetserver_244',['sntp_getserver',['../group__sntp.html#gab114c12154cf2c3e3a733724c6a77429',1,'sntp_getserver(u8_t idx):&#160;sntp.c'],['../group__sntp.html#gab114c12154cf2c3e3a733724c6a77429',1,'sntp_getserver(u8_t idx):&#160;sntp.c']]],
+  ['sntp_5finit_245',['sntp_init',['../group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba',1,'sntp_init(void):&#160;sntp.c'],['../group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba',1,'sntp_init(void):&#160;sntp.c']]],
+  ['sntp_5fmax_5fservers_246',['SNTP_MAX_SERVERS',['../group__sntp__opts.html#ga5d9dc0827f402849f5c18d44e311dbc2',1,'sntp_opts.h']]],
+  ['sntp_5fmonitor_5fserver_5freachability_247',['SNTP_MONITOR_SERVER_REACHABILITY',['../group__sntp__opts.html#ga5782f21ef24ebddd5ba2ce9a889094e3',1,'sntp_opts.h']]],
+  ['sntp_5fmsg_248',['sntp_msg',['../structsntp__msg.html',1,'']]],
+  ['sntp_5fopts_2eh_249',['sntp_opts.h',['../sntp__opts_8h.html',1,'']]],
+  ['sntp_5fport_250',['SNTP_PORT',['../group__sntp__opts.html#gacbee62c27f54371fc2c5259a834a0f9b',1,'sntp_opts.h']]],
+  ['sntp_5frecv_5ftimeout_251',['SNTP_RECV_TIMEOUT',['../group__sntp__opts.html#ga44cf26b9b19832d88599244711a12d08',1,'sntp_opts.h']]],
+  ['sntp_5fretry_5ftimeout_252',['SNTP_RETRY_TIMEOUT',['../group__sntp__opts.html#ga86d651d8eb07687208308deef95a23ba',1,'sntp_opts.h']]],
+  ['sntp_5fretry_5ftimeout_5fexp_253',['SNTP_RETRY_TIMEOUT_EXP',['../group__sntp__opts.html#gafdb7e98f608cc429188d7dac356614c2',1,'sntp_opts.h']]],
+  ['sntp_5fretry_5ftimeout_5fmax_254',['SNTP_RETRY_TIMEOUT_MAX',['../group__sntp__opts.html#gafde10b3ed7cb4bb2cd2c4daa389db699',1,'sntp_opts.h']]],
+  ['sntp_5fserver_255',['sntp_server',['../structsntp__server.html',1,'']]],
+  ['sntp_5fserver_5fdns_256',['SNTP_SERVER_DNS',['../group__sntp__opts.html#gaef477c145ae404d77188b26b79b6996f',1,'sntp_opts.h']]],
+  ['sntp_5fset_5fsystem_5ftime_257',['SNTP_SET_SYSTEM_TIME',['../group__sntp__opts.html#gafe340b98c52dedcbc041267fe13b2da6',1,'sntp_opts.h']]],
+  ['sntp_5fsetoperatingmode_258',['sntp_setoperatingmode',['../group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120',1,'sntp_setoperatingmode(u8_t operating_mode):&#160;sntp.c'],['../group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120',1,'sntp_setoperatingmode(u8_t operating_mode):&#160;sntp.c']]],
+  ['sntp_5fsetserver_259',['sntp_setserver',['../group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a',1,'sntp_setserver(u8_t idx, const ip_addr_t *server):&#160;sntp.c'],['../group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a',1,'sntp_setserver(u8_t idx, const ip_addr_t *addr):&#160;sntp.c']]],
+  ['sntp_5fstartup_5fdelay_260',['SNTP_STARTUP_DELAY',['../group__sntp__opts.html#ga22017d43da7d4bf8d42e786b4ced4dfa',1,'sntp_opts.h']]],
+  ['sntp_5fstartup_5fdelay_5ffunc_261',['SNTP_STARTUP_DELAY_FUNC',['../group__sntp__opts.html#gae082c2f3044d500ca5e1be1d4928de75',1,'sntp_opts.h']]],
+  ['sntp_5fstop_262',['sntp_stop',['../group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488',1,'sntp_stop(void):&#160;sntp.c'],['../group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488',1,'sntp_stop(void):&#160;sntp.c']]],
+  ['sntp_5ftime_263',['sntp_time',['../structsntp__time.html',1,'']]],
+  ['sntp_5ftimestamps_264',['sntp_timestamps',['../structsntp__timestamps.html',1,'']]],
+  ['sntp_5fupdate_5fdelay_265',['SNTP_UPDATE_DELAY',['../group__sntp__opts.html#ga9232c56443115be05a2f852eba21979c',1,'sntp_opts.h']]],
+  ['so_5freuse_266',['SO_REUSE',['../group__lwip__opts__socket.html#gaf3822feed320cf8439b083ee525e4942',1,'opt.h']]],
+  ['so_5freuse_5frxtoall_267',['SO_REUSE_RXTOALL',['../group__lwip__opts__socket.html#gae9395d83af89002343e5782130f52f44',1,'opt.h']]],
+  ['sockaddr_5faligned_268',['sockaddr_aligned',['../unionsockaddr__aligned.html',1,'']]],
+  ['socket_20api_269',['Socket API',['../group__socket.html',1,'']]],
+  ['socket_2eh_270',['socket.h',['../socket_8h.html',1,'']]],
+  ['sockets_271',['Sockets',['../group__lwip__opts__socket.html',1,'']]],
+  ['sockets_2ec_272',['sockets.c',['../sockets_8c.html',1,'']]],
+  ['sockets_2eh_273',['sockets.h',['../sockets_8h.html',1,'']]],
+  ['sockets_5fdebug_274',['SOCKETS_DEBUG',['../group__lwip__opts__debugmsg.html#ga509594f3ba7d8b1356628b50b55a0934',1,'opt.h']]],
+  ['sockets_5fpriv_2eh_275',['sockets_priv.h',['../sockets__priv_8h.html',1,'']]],
+  ['source_5faddr_276',['source_addr',['../structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a',1,'mdns_packet']]],
+  ['source_5faddress_277',['source_address',['../structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937',1,'ieee_802154_hdr']]],
+  ['source_5fpan_5fid_278',['source_pan_id',['../structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2',1,'ieee_802154_hdr']]],
+  ['src_279',['src',['../structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef',1,'ip6_hdr']]],
+  ['standard_20functions_280',['Non-standard functions',['../group__sys__nonstandard.html',1,'']]],
+  ['state_281',['state',['../structsmtp__session.html#aed9c182738767279c2b58b1e3322db09',1,'smtp_session::state'],['../structacd.html#a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb',1,'acd::state'],['../structnetconn.html#a936c33090ec35e5e8c0011be5515a589',1,'netconn::state'],['../structmdns__host.html#a2ed51b16771590917e0eef5cf25ada71',1,'mdns_host::state'],['../structautoip.html#a51af55190548e378e310aeaddfa1fdef',1,'autoip::state'],['../structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3',1,'netif::state'],['../structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c',1,'netif_ext_callback_args_t::link_changed_s::state'],['../structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7',1,'netif_ext_callback_args_t::status_changed_s::state']]],
+  ['static_5fdata_282',['static_data',['../structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4',1,'smtp_send_request']]],
+  ['statistics_283',['Statistics',['../group__lwip__opts__stats.html',1,'']]],
+  ['statistics_284',['MIB2 statistics',['../group__netif__mib2.html',1,'']]],
+  ['stats_285',['stats',['../structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500',1,'memp_desc']]],
+  ['stats_2ec_286',['stats.c',['../stats_8c.html',1,'']]],
+  ['stats_2eh_287',['stats.h',['../stats_8h.html',1,'']]],
+  ['stats_5f_288',['stats_',['../structstats__.html',1,'']]],
+  ['stats_5figmp_289',['stats_igmp',['../structstats__igmp.html',1,'']]],
+  ['stats_5finit_290',['stats_init',['../stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d',1,'stats_init(void):&#160;stats.c'],['../stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d',1,'stats_init(void):&#160;stats.c']]],
+  ['stats_5fmem_291',['stats_mem',['../structstats__mem.html',1,'']]],
+  ['stats_5fmib2_292',['stats_mib2',['../structstats__mib2.html',1,'']]],
+  ['stats_5fmib2_5fnetif_5fctrs_293',['stats_mib2_netif_ctrs',['../structstats__mib2__netif__ctrs.html',1,'']]],
+  ['stats_5fproto_294',['stats_proto',['../structstats__proto.html',1,'']]],
+  ['stats_5fsys_295',['stats_sys',['../structstats__sys.html',1,'']]],
+  ['stats_5fsyselem_296',['stats_syselem',['../structstats__syselem.html',1,'']]],
+  ['status_5fcallback_297',['status_callback',['../structnetif.html#a1513e81d02557d2a950e965f18b53a45',1,'netif']]],
+  ['status_5fchanged_5fs_298',['status_changed_s',['../structnetif__ext__callback__args__t_1_1status__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['style_20apis_299',['style APIs',['../group__lwip__opts__callback.html',1,'Callback-style APIs'],['../group__sequential__api.html',1,'Sequential-style APIs']]],
+  ['subject_300',['subject',['../structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7',1,'smtp_session']]],
+  ['subject_5flen_301',['subject_len',['../structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c',1,'smtp_session']]],
+  ['swap_5fbytes_5fin_5fword_302',['SWAP_BYTES_IN_WORD',['../inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18',1,'inet_chksum.h']]],
+  ['sys_303',['sys',['../structstats__.html#a317123da6c92aa9d2fa40e8060357035',1,'stats_']]],
+  ['sys_2ec_304',['sys.c',['../sys_8c.html',1,'']]],
+  ['sys_2eh_305',['sys.h',['../sys_8h.html',1,'']]],
+  ['sys_5farch_5fdecl_5fprotect_306',['SYS_ARCH_DECL_PROTECT',['../group__sys__prot.html#ga945395fa326214fc9736487242710a90',1,'sys.h']]],
+  ['sys_5farch_5fmbox_5ffetch_307',['sys_arch_mbox_fetch',['../group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8',1,'sys.h']]],
+  ['sys_5farch_5fmbox_5ftryfetch_308',['sys_arch_mbox_tryfetch',['../group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c',1,'sys.h']]],
+  ['sys_5farch_5fprotect_309',['SYS_ARCH_PROTECT',['../group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab',1,'sys.h']]],
+  ['sys_5farch_5fsem_5fwait_310',['sys_arch_sem_wait',['../group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f',1,'sys.h']]],
+  ['sys_5farch_5ftimeout_311',['SYS_ARCH_TIMEOUT',['../sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b',1,'sys.h']]],
+  ['sys_5farch_5funprotect_312',['SYS_ARCH_UNPROTECT',['../group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2',1,'sys.h']]],
+  ['sys_5fcheck_5ftimeouts_313',['sys_check_timeouts',['../group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883',1,'sys_check_timeouts(void):&#160;timeouts.c'],['../group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883',1,'sys_check_timeouts(void):&#160;timeouts.c']]],
+  ['sys_5fdebug_314',['SYS_DEBUG',['../group__lwip__opts__debugmsg.html#ga2960ae20008f05da8cc0714f36365642',1,'opt.h']]],
+  ['sys_5finit_315',['sys_init',['../group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448',1,'sys.h']]],
+  ['sys_5fjiffies_316',['sys_jiffies',['../sys_8h.html#ac89f307e8b360eaf821b461a4f26753a',1,'sys.h']]],
+  ['sys_5flightweight_5fprot_317',['SYS_LIGHTWEIGHT_PROT',['../group__lwip__opts__lock.html#gae85efb3a5fcf8585c94b3c2669978959',1,'opt.h']]],
+  ['sys_5fmbox_5fempty_318',['SYS_MBOX_EMPTY',['../sys_8h.html#ab0571e67edca0132b144106e9b319ef9',1,'sys.h']]],
+  ['sys_5fmbox_5ffree_319',['sys_mbox_free',['../group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f',1,'sys.h']]],
+  ['sys_5fmbox_5fnew_320',['sys_mbox_new',['../group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc',1,'sys.h']]],
+  ['sys_5fmbox_5fpost_321',['sys_mbox_post',['../group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555',1,'sys.h']]],
+  ['sys_5fmbox_5fset_5finvalid_322',['sys_mbox_set_invalid',['../group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172',1,'sys.h']]],
+  ['sys_5fmbox_5fset_5finvalid_5fval_323',['sys_mbox_set_invalid_val',['../sys_8h.html#ae293feebb61d36f2db99be53702b8203',1,'sys.h']]],
+  ['sys_5fmbox_5ftryfetch_324',['sys_mbox_tryfetch',['../sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13',1,'sys.h']]],
+  ['sys_5fmbox_5ftrypost_325',['sys_mbox_trypost',['../group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195',1,'sys.h']]],
+  ['sys_5fmbox_5ftrypost_5ffromisr_326',['sys_mbox_trypost_fromisr',['../group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a',1,'sys.h']]],
+  ['sys_5fmbox_5fvalid_327',['sys_mbox_valid',['../group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d',1,'sys.h']]],
+  ['sys_5fmbox_5fvalid_5fval_328',['sys_mbox_valid_val',['../sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb',1,'sys.h']]],
+  ['sys_5fmsleep_329',['sys_msleep',['../group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e',1,'sys_msleep(u32_t ms):&#160;sys.c'],['../group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e',1,'sys_msleep(u32_t ms):&#160;sys.c']]],
+  ['sys_5fmutex_5ffree_330',['sys_mutex_free',['../group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9',1,'sys.h']]],
+  ['sys_5fmutex_5flock_331',['sys_mutex_lock',['../group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a',1,'sys.h']]],
+  ['sys_5fmutex_5fnew_332',['sys_mutex_new',['../group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897',1,'sys.h']]],
+  ['sys_5fmutex_5fset_5finvalid_333',['sys_mutex_set_invalid',['../group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8',1,'sys.h']]],
+  ['sys_5fmutex_5funlock_334',['sys_mutex_unlock',['../group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb',1,'sys.h']]],
+  ['sys_5fmutex_5fvalid_335',['sys_mutex_valid',['../group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a',1,'sys.h']]],
+  ['sys_5fnow_336',['sys_now',['../group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199',1,'sys.h']]],
+  ['sys_5frestart_5ftimeouts_337',['sys_restart_timeouts',['../timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e',1,'sys_restart_timeouts(void):&#160;timeouts.c'],['../timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e',1,'sys_restart_timeouts(void):&#160;timeouts.c']]],
+  ['sys_5fsem_5ffree_338',['sys_sem_free',['../group__sys__sem.html#ga83b781f96c30e915c752065a757da283',1,'sys.h']]],
+  ['sys_5fsem_5fnew_339',['sys_sem_new',['../group__sys__sem.html#gaf99da9e34a71855285c535183133dfde',1,'sys.h']]],
+  ['sys_5fsem_5fset_5finvalid_340',['sys_sem_set_invalid',['../group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33',1,'sys.h']]],
+  ['sys_5fsem_5fset_5finvalid_5fval_341',['sys_sem_set_invalid_val',['../sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8',1,'sys.h']]],
+  ['sys_5fsem_5fsignal_342',['sys_sem_signal',['../group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875',1,'sys.h']]],
+  ['sys_5fsem_5fvalid_343',['sys_sem_valid',['../group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4',1,'sys.h']]],
+  ['sys_5fsem_5fvalid_5fval_344',['sys_sem_valid_val',['../sys_8h.html#a9e8ad541356786936f23ab83b8f550cc',1,'sys.h']]],
+  ['sys_5fsem_5fwait_345',['sys_sem_wait',['../sys_8h.html#a84e7e4bc00255aee84e6e7289a985703',1,'sys.h']]],
+  ['sys_5fstats_346',['SYS_STATS',['../group__lwip__opts__stats.html#ga0173549afa76553583e5a02c6a791218',1,'opt.h']]],
+  ['sys_5fthread_5fnew_347',['sys_thread_new',['../group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a',1,'sys.h']]],
+  ['sys_5ftimeout_348',['sys_timeout',['../timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8',1,'sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg):&#160;timeouts.c'],['../timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8',1,'sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg):&#160;timeouts.c']]],
+  ['sys_5ftimeout_5fhandler_349',['sys_timeout_handler',['../timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25',1,'timeouts.h']]],
+  ['sys_5ftimeouts_5finit_350',['sys_timeouts_init',['../timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c',1,'sys_timeouts_init(void):&#160;timeouts.c'],['../timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c',1,'sys_timeouts_init(void):&#160;timeouts.c']]],
+  ['sys_5ftimeouts_5fsleeptime_351',['sys_timeouts_sleeptime',['../timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664',1,'sys_timeouts_sleeptime(void):&#160;timeouts.c'],['../timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664',1,'sys_timeouts_sleeptime(void):&#160;timeouts.c']]],
+  ['sys_5ftimeouts_5fsleeptime_5finfinite_352',['SYS_TIMEOUTS_SLEEPTIME_INFINITE',['../timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0',1,'timeouts.h']]],
+  ['sys_5funtimeout_353',['sys_untimeout',['../timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6',1,'sys_untimeout(sys_timeout_handler handler, void *arg):&#160;timeouts.c'],['../timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6',1,'sys_untimeout(sys_timeout_handler handler, void *arg):&#160;timeouts.c']]],
+  ['system_354',['CMake build system',['../cmake.html',1,'']]],
+  ['system_20abstraction_20layer_355',['Porting (system abstraction layer)',['../group__sys__layer.html',1,'']]],
+  ['system_20initialization_356',['System initialization',['../sys_init.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_17.js b/doc/doxygen/output/html/search/all_17.js
index bf1cdaf..fc58f51 100644
--- a/doc/doxygen/output/html/search/all_17.js
+++ b/doc/doxygen/output/html/search/all_17.js
@@ -39,10 +39,10 @@
   ['tcp_5ferr_5ffn_36',['tcp_err_fn',['../tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55',1,'tcp.h']]],
   ['tcp_5fext_5farg_5falloc_5fid_37',['tcp_ext_arg_alloc_id',['../group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616',1,'tcp_ext_arg_alloc_id(void):&#160;tcp.c'],['../group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616',1,'tcp_ext_arg_alloc_id(void):&#160;tcp.c']]],
   ['tcp_5fext_5farg_5fcallbacks_38',['tcp_ext_arg_callbacks',['../structtcp__ext__arg__callbacks.html',1,'']]],
-  ['tcp_5fext_5farg_5fget_39',['tcp_ext_arg_get',['../group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id):&#160;tcp.c'],['../group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5fget_39',['tcp_ext_arg_get',['../group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, u8_t id):&#160;tcp.c'],['../group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, u8_t id):&#160;tcp.c']]],
   ['tcp_5fext_5farg_5finvoke_5fcallbacks_5fpassive_5fopen_40',['tcp_ext_arg_invoke_callbacks_passive_open',['../tcp_8c.html#a5265b1df024d04287ed3edc02b1b9ccc',1,'tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb):&#160;tcp.c'],['../tcp__priv_8h.html#a5265b1df024d04287ed3edc02b1b9ccc',1,'tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb):&#160;tcp.c']]],
-  ['tcp_5fext_5farg_5fset_41',['tcp_ext_arg_set',['../group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318',1,'tcp_ext_arg_set(struct tcp_pcb *pcb, uint8_t id, void *arg):&#160;tcp.c'],['../group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318',1,'tcp_ext_arg_set(struct tcp_pcb *pcb, uint8_t id, void *arg):&#160;tcp.c']]],
-  ['tcp_5fext_5farg_5fset_5fcallbacks_42',['tcp_ext_arg_set_callbacks',['../group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316',1,'tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, uint8_t id, const struct tcp_ext_arg_callbacks *const callbacks):&#160;tcp.c'],['../group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316',1,'tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, uint8_t id, const struct tcp_ext_arg_callbacks *const callbacks):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5fset_41',['tcp_ext_arg_set',['../group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e',1,'tcp_ext_arg_set(struct tcp_pcb *pcb, u8_t id, void *arg):&#160;tcp.c'],['../group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e',1,'tcp_ext_arg_set(struct tcp_pcb *pcb, u8_t id, void *arg):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5fset_5fcallbacks_42',['tcp_ext_arg_set_callbacks',['../group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5',1,'tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, u8_t id, const struct tcp_ext_arg_callbacks *const callbacks):&#160;tcp.c'],['../group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5',1,'tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, u8_t id, const struct tcp_ext_arg_callbacks *const callbacks):&#160;tcp.c']]],
   ['tcp_5fextarg_5fcallback_5fpassive_5fopen_5ffn_43',['tcp_extarg_callback_passive_open_fn',['../tcp_8h.html#aba649c5bdf19d47e39643392b6d88588',1,'tcp.h']]],
   ['tcp_5fextarg_5fcallback_5fpcb_5fdestroyed_5ffn_44',['tcp_extarg_callback_pcb_destroyed_fn',['../tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd',1,'tcp.h']]],
   ['tcp_5ffasttmr_45',['tcp_fasttmr',['../tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d',1,'tcp_fasttmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d',1,'tcp_fasttmr(void):&#160;tcp.c']]],
@@ -94,107 +94,113 @@
   ['tcp_5frexmit_5frto_5fprepare_91',['tcp_rexmit_rto_prepare',['../tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39',1,'tcp_rexmit_rto_prepare(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39',1,'tcp_rexmit_rto_prepare(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
   ['tcp_5frst_92',['tcp_rst',['../tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014',1,'tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c'],['../tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014',1,'tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c']]],
   ['tcp_5frst_5fdebug_93',['TCP_RST_DEBUG',['../group__lwip__opts__debugmsg.html#ga37596f7bbb9b7663826244ba54486679',1,'opt.h']]],
-  ['tcp_5frto_5fdebug_94',['TCP_RTO_DEBUG',['../group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662',1,'opt.h']]],
-  ['tcp_5fseg_5fcopy_95',['tcp_seg_copy',['../tcp_8c.html#a9384b436de95d5bf8550438b9d3c8cd4',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c']]],
-  ['tcp_5fseg_5ffree_96',['tcp_seg_free',['../tcp_8c.html#ac6283651b26f74dba2444159aee88b20',1,'tcp_seg_free(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20',1,'tcp_seg_free(struct tcp_seg *seg):&#160;tcp.c']]],
-  ['tcp_5fsegs_5ffree_97',['tcp_segs_free',['../tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c',1,'tcp_segs_free(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c',1,'tcp_segs_free(struct tcp_seg *seg):&#160;tcp.c']]],
-  ['tcp_5fsend_5fempty_5fack_98',['tcp_send_empty_ack',['../tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996',1,'tcp_send_empty_ack(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996',1,'tcp_send_empty_ack(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5fsend_5ffin_99',['tcp_send_fin',['../tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342',1,'tcp_send_fin(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342',1,'tcp_send_fin(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5fsent_100',['tcp_sent',['../group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808',1,'tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent):&#160;tcp.c'],['../group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808',1,'tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent):&#160;tcp.c']]],
-  ['tcp_5fsent_5ffn_101',['tcp_sent_fn',['../tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18',1,'tcp.h']]],
-  ['tcp_5fsetprio_102',['tcp_setprio',['../tcp_8c.html#a2c4234f1e95b6bde0e84d4ea97ae95bc',1,'tcp_setprio(struct tcp_pcb *pcb, u8_t prio):&#160;tcp.c'],['../tcp_8h.html#a2c4234f1e95b6bde0e84d4ea97ae95bc',1,'tcp_setprio(struct tcp_pcb *pcb, u8_t prio):&#160;tcp.c']]],
-  ['tcp_5fshutdown_103',['tcp_shutdown',['../group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd',1,'tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx):&#160;tcp.c'],['../group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd',1,'tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx):&#160;tcp.c']]],
-  ['tcp_5fslowtmr_104',['tcp_slowtmr',['../tcp_8c.html#a421fb42ef919018e14ae413adfee9905',1,'tcp_slowtmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905',1,'tcp_slowtmr(void):&#160;tcp.c']]],
-  ['tcp_5fsnd_5fbuf_105',['TCP_SND_BUF',['../group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd',1,'opt.h']]],
-  ['tcp_5fsnd_5fqueuelen_106',['TCP_SND_QUEUELEN',['../group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904',1,'opt.h']]],
-  ['tcp_5fsndlowat_107',['TCP_SNDLOWAT',['../group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec',1,'opt.h']]],
-  ['tcp_5fsndqueuelowat_108',['TCP_SNDQUEUELOWAT',['../group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698',1,'opt.h']]],
-  ['tcp_5fsplit_5funsent_5fseg_109',['tcp_split_unsent_seg',['../tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5',1,'tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split):&#160;tcp_out.c'],['../tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5',1,'tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split):&#160;tcp_out.c']]],
-  ['tcp_5fstats_110',['TCP_STATS',['../group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58',1,'opt.h']]],
-  ['tcp_5fsynmaxrtx_111',['TCP_SYNMAXRTX',['../group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6',1,'opt.h']]],
-  ['tcp_5ftimer_5fneeded_112',['tcp_timer_needed',['../timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249',1,'tcp_timer_needed(void):&#160;timeouts.c'],['../tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249',1,'tcp_timer_needed(void):&#160;timeouts.c']]],
-  ['tcp_5ftmr_113',['tcp_tmr',['../tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb',1,'tcp_tmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb',1,'tcp_tmr(void):&#160;tcp.c']]],
-  ['tcp_5fttl_114',['TCP_TTL',['../group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4',1,'opt.h']]],
-  ['tcp_5ftw_5fpcbs_115',['tcp_tw_pcbs',['../tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3',1,'tcp_tw_pcbs:&#160;tcp.c'],['../tcp__priv_8h.html#a9a522a66c5e1f1a4e28fe7a672cc64e3',1,'tcp_tw_pcbs:&#160;tcp.c']]],
-  ['tcp_5ftxnow_116',['tcp_txnow',['../tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547',1,'tcp_txnow(void):&#160;tcp.c'],['../tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547',1,'tcp_txnow(void):&#160;tcp.c']]],
-  ['tcp_5fupdate_5frcv_5fann_5fwnd_117',['tcp_update_rcv_ann_wnd',['../tcp_8c.html#a6d2c254b779db4e517cb34e41301588d',1,'tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d',1,'tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5fwnd_118',['TCP_WND',['../group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7',1,'opt.h']]],
-  ['tcp_5fwnd_5fdebug_119',['TCP_WND_DEBUG',['../group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1',1,'opt.h']]],
-  ['tcp_5fwnd_5fupdate_5fthreshold_120',['TCP_WND_UPDATE_THRESHOLD',['../group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d',1,'opt.h']]],
-  ['tcp_5fwrite_121',['tcp_write',['../group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5',1,'tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags):&#160;tcp_out.c'],['../group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5',1,'tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len, u8_t apiflags):&#160;tcp_out.c']]],
-  ['tcp_5fzero_5fwindow_5fprobe_122',['tcp_zero_window_probe',['../tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6',1,'tcp_zero_window_probe(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6',1,'tcp_zero_window_probe(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcpbase_2eh_123',['tcpbase.h',['../tcpbase_8h.html',1,'']]],
-  ['tcpip_20thread_124',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
-  ['tcpip_2ec_125',['tcpip.c',['../tcpip_8c.html',1,'']]],
-  ['tcpip_2eh_126',['tcpip.h',['../tcpip_8h.html',1,'']]],
-  ['tcpip_5f6lowpan_5finput_127',['tcpip_6lowpan_input',['../group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b',1,'tcpip_6lowpan_input(struct pbuf *p, struct netif *inp):&#160;lowpan6.c'],['../group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b',1,'tcpip_6lowpan_input(struct pbuf *p, struct netif *inp):&#160;lowpan6.c']]],
-  ['tcpip_5fapi_5fcall_128',['tcpip_api_call',['../tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08',1,'tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call):&#160;tcpip.c'],['../tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08',1,'tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call):&#160;tcpip.c']]],
-  ['tcpip_5fcallback_129',['tcpip_callback',['../group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a',1,'tcpip_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a',1,'tcpip_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
-  ['tcpip_5fcallback_5ffn_130',['tcpip_callback_fn',['../tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d',1,'tcpip.h']]],
-  ['tcpip_5fcallback_5fwith_5fblock_131',['tcpip_callback_with_block',['../group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df',1,'tcpip.h']]],
-  ['tcpip_5fcallbackmsg_5fdelete_132',['tcpip_callbackmsg_delete',['../group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd',1,'tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd',1,'tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
-  ['tcpip_5fcallbackmsg_5fnew_133',['tcpip_callbackmsg_new',['../group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
-  ['tcpip_5fcallbackmsg_5ftrycallback_134',['tcpip_callbackmsg_trycallback',['../group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8',1,'tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8',1,'tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
-  ['tcpip_5fcallbackmsg_5ftrycallback_5ffromisr_135',['tcpip_callbackmsg_trycallback_fromisr',['../group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666',1,'tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666',1,'tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
-  ['tcpip_5fdebug_136',['TCPIP_DEBUG',['../group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f',1,'opt.h']]],
-  ['tcpip_5finit_137',['tcpip_init',['../group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db',1,'tcpip_init(tcpip_init_done_fn initfunc, void *arg):&#160;tcpip.c'],['../group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db',1,'tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg):&#160;tcpip.c']]],
-  ['tcpip_5finit_5fdone_5ffn_138',['tcpip_init_done_fn',['../tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992',1,'tcpip.h']]],
-  ['tcpip_5finpkt_139',['tcpip_inpkt',['../tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102',1,'tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn):&#160;tcpip.c'],['../tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102',1,'tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn):&#160;tcpip.c']]],
-  ['tcpip_5finput_140',['tcpip_input',['../group__lwip__os.html#gae510f195171bed8499ae94e264a92717',1,'tcpip_input(struct pbuf *p, struct netif *inp):&#160;tcpip.c'],['../group__lwip__os.html#gae510f195171bed8499ae94e264a92717',1,'tcpip_input(struct pbuf *p, struct netif *inp):&#160;tcpip.c']]],
-  ['tcpip_5fmbox_5fsize_141',['TCPIP_MBOX_SIZE',['../group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06',1,'opt.h']]],
-  ['tcpip_5fpriv_2eh_142',['tcpip_priv.h',['../tcpip__priv_8h.html',1,'']]],
-  ['tcpip_5frfc7668_5finput_143',['tcpip_rfc7668_input',['../lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a',1,'tcpip_rfc7668_input(struct pbuf *p, struct netif *inp):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a',1,'tcpip_rfc7668_input(struct pbuf *p, struct netif *inp):&#160;lowpan6_ble.c']]],
-  ['tcpip_5fsend_5fmsg_5fwait_5fsem_144',['tcpip_send_msg_wait_sem',['../tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d',1,'tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem):&#160;tcpip.c'],['../tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d',1,'tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem):&#160;tcpip.c']]],
-  ['tcpip_5fthread_5fname_145',['TCPIP_THREAD_NAME',['../group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587',1,'opt.h']]],
-  ['tcpip_5fthread_5fprio_146',['TCPIP_THREAD_PRIO',['../group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435',1,'opt.h']]],
-  ['tcpip_5fthread_5fstacksize_147',['TCPIP_THREAD_STACKSIZE',['../group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0',1,'opt.h']]],
-  ['tcpip_5ftry_5fcallback_148',['tcpip_try_callback',['../group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020',1,'tcpip_try_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020',1,'tcpip_try_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
-  ['test_5fresult_149',['test_result',['../structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f',1,'netbios_answer']]],
-  ['tf_5freset_150',['TF_RESET',['../tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990',1,'tcp_priv.h']]],
-  ['tftp_20server_151',['TFTP server',['../group__tftp.html',1,'']]],
-  ['tftp_5fcleanup_152',['tftp_cleanup',['../group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec',1,'tftp_cleanup(void):&#160;tftp_server.c'],['../group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec',1,'tftp_cleanup(void):&#160;tftp_server.c']]],
-  ['tftp_5fcontext_153',['tftp_context',['../structtftp__context.html',1,'']]],
-  ['tftp_5fdebug_154',['TFTP_DEBUG',['../group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981',1,'tftp_opts.h']]],
-  ['tftp_5finit_155',['tftp_init',['../group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3',1,'tftp_init(const struct tftp_context *ctx):&#160;tftp_server.c'],['../group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3',1,'tftp_init(const struct tftp_context *ctx):&#160;tftp_server.c']]],
-  ['tftp_5fmax_5ffilename_5flen_156',['TFTP_MAX_FILENAME_LEN',['../group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b',1,'tftp_opts.h']]],
-  ['tftp_5fmax_5fmode_5flen_157',['TFTP_MAX_MODE_LEN',['../group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055',1,'tftp_opts.h']]],
-  ['tftp_5fmax_5fretries_158',['TFTP_MAX_RETRIES',['../group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313',1,'tftp_opts.h']]],
-  ['tftp_5fopts_2eh_159',['tftp_opts.h',['../tftp__opts_8h.html',1,'']]],
-  ['tftp_5fport_160',['TFTP_PORT',['../group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1',1,'tftp_opts.h']]],
-  ['tftp_5fserver_2ec_161',['tftp_server.c',['../tftp__server_8c.html',1,'']]],
-  ['tftp_5fserver_2eh_162',['tftp_server.h',['../tftp__server_8h.html',1,'']]],
-  ['tftp_5ftimeout_5fmsecs_163',['TFTP_TIMEOUT_MSECS',['../group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63',1,'tftp_opts.h']]],
-  ['tftp_5ftimer_5fmsecs_164',['TFTP_TIMER_MSECS',['../group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea',1,'tftp_opts.h']]],
-  ['thread_165',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
-  ['thread_20safe_20apis_166',['Thread-safe APIs',['../group__lwip__opts__threadsafe__apis.html',1,'']]],
-  ['threading_167',['Threading',['../group__lwip__opts__thread.html',1,'']]],
-  ['threadsync_5fdata_168',['threadsync_data',['../structthreadsync__data.html',1,'']]],
-  ['time_169',['Time',['../group__sys__time.html',1,'']]],
-  ['timeout_5fdiff_170',['timeout_diff',['../structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073',1,'mqtt_request_t']]],
-  ['timeouts_2ec_171',['timeouts.c',['../timeouts_8c.html',1,'']]],
-  ['timeouts_2eh_172',['timeouts.h',['../timeouts_8h.html',1,'']]],
-  ['timer_173',['timer',['../structsmtp__session.html#a5884425cb5ce964d8383b29cc20208d7',1,'smtp_session::timer'],['../structigmp__group.html#a8e2227e486652603fcd7f88681d4c75b',1,'igmp_group::timer'],['../structmld__group.html#a21f31e845cb11d2aca4ae7120736f69a',1,'mld_group::timer']]],
-  ['timers_174',['Timers',['../group__lwip__opts__timers.html',1,'']]],
-  ['timers_5fdebug_175',['TIMERS_DEBUG',['../group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15',1,'opt.h']]],
-  ['tls_20layer_176',['TLS layer',['../group__altcp__tls.html',1,'']]],
-  ['tls_5fconfig_177',['tls_config',['../structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4',1,'mqtt_connect_client_info_t']]],
-  ['to_178',['to',['../structsmtp__session.html#a70b3753bc70e65f779279c246617faea',1,'smtp_session']]],
-  ['to_20contribute_20to_20lwip_179',['How to contribute to lwIP',['../contrib.html',1,'']]],
-  ['to_20lwip_180',['How to contribute to lwIP',['../contrib.html',1,'']]],
-  ['to_5flen_181',['to_len',['../structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402',1,'smtp_session']]],
-  ['tot_5flen_182',['tot_len',['../structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f',1,'pbuf']]],
-  ['total_5fnumber_5fof_5fcommand_5fblocks_183',['total_number_of_command_blocks',['../structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2',1,'netbios_answer']]],
-  ['traps_184',['Traps',['../group__snmp__traps.html',1,'']]],
-  ['tried_5fllipaddr_185',['tried_llipaddr',['../structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853',1,'autoip']]],
-  ['ts_186',['ts',['../structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971',1,'netif']]],
-  ['tssihandler_187',['tSSIHandler',['../group__httpd.html#gaf88dacc4f18d299084cab75252001319',1,'httpd.h']]],
-  ['ttw_188',['ttw',['../structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf',1,'autoip']]],
-  ['tx_5fbuf_189',['tx_buf',['../structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61',1,'smtp_session']]],
-  ['tx_5fdatagram_5ftag_190',['tx_datagram_tag',['../structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c',1,'lowpan6_ieee802154_data']]],
-  ['tx_5fframe_5fseq_5fnum_191',['tx_frame_seq_num',['../structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c',1,'lowpan6_ieee802154_data']]],
-  ['tx_5fid_192',['tx_id',['../structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00',1,'mdns_packet::tx_id'],['../structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348',1,'mdns_outpacket::tx_id']]],
-  ['txt_5ffn_193',['txt_fn',['../structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c',1,'mdns_service']]],
-  ['txtdata_194',['txtdata',['../structmdns__service.html#a35daff90a18d19b14f23fa02df424f94',1,'mdns_service']]],
-  ['type_195',['type',['../structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6',1,'netconn::type'],['../structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950',1,'snmp_varbind::type'],['../structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a',1,'ip_addr::type']]],
-  ['type_5finternal_196',['type_internal',['../structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131',1,'pbuf']]]
+  ['tcp_5frst_5fnetif_94',['tcp_rst_netif',['../tcp__out_8c.html#a7cf7cbc5aa473de8116dc9f00cbc5d57',1,'tcp_rst_netif(struct netif *netif, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c'],['../tcp__priv_8h.html#a7cf7cbc5aa473de8116dc9f00cbc5d57',1,'tcp_rst_netif(struct netif *netif, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c']]],
+  ['tcp_5frto_5fdebug_95',['TCP_RTO_DEBUG',['../group__lwip__opts__debugmsg.html#gad6e52e37415d0d0cbe4931a28f5a9662',1,'opt.h']]],
+  ['tcp_5fseg_5fcopy_96',['tcp_seg_copy',['../tcp_8c.html#a9384b436de95d5bf8550438b9d3c8cd4',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c']]],
+  ['tcp_5fseg_5ffree_97',['tcp_seg_free',['../tcp_8c.html#ac6283651b26f74dba2444159aee88b20',1,'tcp_seg_free(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20',1,'tcp_seg_free(struct tcp_seg *seg):&#160;tcp.c']]],
+  ['tcp_5fsegs_5ffree_98',['tcp_segs_free',['../tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c',1,'tcp_segs_free(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c',1,'tcp_segs_free(struct tcp_seg *seg):&#160;tcp.c']]],
+  ['tcp_5fsend_5fempty_5fack_99',['tcp_send_empty_ack',['../tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996',1,'tcp_send_empty_ack(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996',1,'tcp_send_empty_ack(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5fsend_5ffin_100',['tcp_send_fin',['../tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342',1,'tcp_send_fin(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342',1,'tcp_send_fin(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5fsent_101',['tcp_sent',['../group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808',1,'tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent):&#160;tcp.c'],['../group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808',1,'tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent):&#160;tcp.c']]],
+  ['tcp_5fsent_5ffn_102',['tcp_sent_fn',['../tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18',1,'tcp.h']]],
+  ['tcp_5fsetprio_103',['tcp_setprio',['../group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc',1,'tcp_setprio(struct tcp_pcb *pcb, u8_t prio):&#160;tcp.c'],['../group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc',1,'tcp_setprio(struct tcp_pcb *pcb, u8_t prio):&#160;tcp.c']]],
+  ['tcp_5fshutdown_104',['tcp_shutdown',['../group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd',1,'tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx):&#160;tcp.c'],['../group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd',1,'tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx):&#160;tcp.c']]],
+  ['tcp_5fslowtmr_105',['tcp_slowtmr',['../tcp_8c.html#a421fb42ef919018e14ae413adfee9905',1,'tcp_slowtmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905',1,'tcp_slowtmr(void):&#160;tcp.c']]],
+  ['tcp_5fsnd_5fbuf_106',['TCP_SND_BUF',['../group__lwip__opts__tcp.html#ga871d111968d8c6c7880ff36b93c5c4dd',1,'opt.h']]],
+  ['tcp_5fsnd_5fqueuelen_107',['TCP_SND_QUEUELEN',['../group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904',1,'opt.h']]],
+  ['tcp_5fsndlowat_108',['TCP_SNDLOWAT',['../group__lwip__opts__tcp.html#gae5c9866d7cd463ac7b36792182145aec',1,'opt.h']]],
+  ['tcp_5fsndqueuelowat_109',['TCP_SNDQUEUELOWAT',['../group__lwip__opts__tcp.html#ga75659867592a6b01c198532ed1b65698',1,'opt.h']]],
+  ['tcp_5fsplit_5funsent_5fseg_110',['tcp_split_unsent_seg',['../tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5',1,'tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split):&#160;tcp_out.c'],['../tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5',1,'tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split):&#160;tcp_out.c']]],
+  ['tcp_5fstats_111',['TCP_STATS',['../group__lwip__opts__stats.html#gaa02ec5c5bc0edebe418680c54d044f58',1,'opt.h']]],
+  ['tcp_5fsynmaxrtx_112',['TCP_SYNMAXRTX',['../group__lwip__opts__tcp.html#ga50b434a8541a4813f7b27f576c05d1b6',1,'opt.h']]],
+  ['tcp_5ftimer_5fneeded_113',['tcp_timer_needed',['../timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249',1,'tcp_timer_needed(void):&#160;timeouts.c'],['../tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249',1,'tcp_timer_needed(void):&#160;timeouts.c']]],
+  ['tcp_5ftmr_114',['tcp_tmr',['../tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb',1,'tcp_tmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb',1,'tcp_tmr(void):&#160;tcp.c']]],
+  ['tcp_5fttl_115',['TCP_TTL',['../group__lwip__opts__tcp.html#gacd5b25ea81d2894790d25da5393cdab4',1,'opt.h']]],
+  ['tcp_5ftw_5fpcbs_116',['tcp_tw_pcbs',['../tcp_8c.html#a9a522a66c5e1f1a4e28fe7a672cc64e3',1,'tcp_tw_pcbs:&#160;tcp.c'],['../tcp__priv_8h.html#a9a522a66c5e1f1a4e28fe7a672cc64e3',1,'tcp_tw_pcbs:&#160;tcp.c']]],
+  ['tcp_5ftxnow_117',['tcp_txnow',['../tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547',1,'tcp_txnow(void):&#160;tcp.c'],['../tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547',1,'tcp_txnow(void):&#160;tcp.c']]],
+  ['tcp_5fupdate_5frcv_5fann_5fwnd_118',['tcp_update_rcv_ann_wnd',['../tcp_8c.html#a6d2c254b779db4e517cb34e41301588d',1,'tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d',1,'tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5fwnd_119',['TCP_WND',['../group__lwip__opts__tcp.html#ga7f535a6efb5cdf86c3210e35ece1d6a7',1,'opt.h']]],
+  ['tcp_5fwnd_5fdebug_120',['TCP_WND_DEBUG',['../group__lwip__opts__debugmsg.html#ga3704f433e947d6342da77c74e33627e1',1,'opt.h']]],
+  ['tcp_5fwnd_5fupdate_5fthreshold_121',['TCP_WND_UPDATE_THRESHOLD',['../group__lwip__opts__tcp.html#ga5d45732ba3a8438b141096d86e07ef8d',1,'opt.h']]],
+  ['tcp_5fwrite_122',['tcp_write',['../group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5',1,'tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags):&#160;tcp_out.c'],['../group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5',1,'tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len, u8_t apiflags):&#160;tcp_out.c']]],
+  ['tcp_5fzero_5fwindow_5fprobe_123',['tcp_zero_window_probe',['../tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6',1,'tcp_zero_window_probe(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6',1,'tcp_zero_window_probe(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcpbase_2eh_124',['tcpbase.h',['../tcpbase_8h.html',1,'']]],
+  ['tcpip_20thread_125',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
+  ['tcpip_2ec_126',['tcpip.c',['../tcpip_8c.html',1,'']]],
+  ['tcpip_2eh_127',['tcpip.h',['../tcpip_8h.html',1,'']]],
+  ['tcpip_5f6lowpan_5finput_128',['tcpip_6lowpan_input',['../group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b',1,'tcpip_6lowpan_input(struct pbuf *p, struct netif *inp):&#160;lowpan6.c'],['../group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b',1,'tcpip_6lowpan_input(struct pbuf *p, struct netif *inp):&#160;lowpan6.c']]],
+  ['tcpip_5fapi_5fcall_129',['tcpip_api_call',['../tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08',1,'tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call):&#160;tcpip.c'],['../tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08',1,'tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call):&#160;tcpip.c']]],
+  ['tcpip_5fcallback_130',['tcpip_callback',['../group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a',1,'tcpip_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a',1,'tcpip_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['tcpip_5fcallback_5ffn_131',['tcpip_callback_fn',['../tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d',1,'tcpip.h']]],
+  ['tcpip_5fcallback_5fwait_132',['tcpip_callback_wait',['../tcpip_8c.html#a8d8a2ac0271def71a4ca31b24a31228f',1,'tcpip_callback_wait(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../tcpip_8h.html#a8d8a2ac0271def71a4ca31b24a31228f',1,'tcpip_callback_wait(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['tcpip_5fcallback_5fwith_5fblock_133',['tcpip_callback_with_block',['../group__lwip__os.html#gacd0a865623921ada2dd08962eb82c9df',1,'tcpip.h']]],
+  ['tcpip_5fcallbackmsg_5fdelete_134',['tcpip_callbackmsg_delete',['../group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd',1,'tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd',1,'tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
+  ['tcpip_5fcallbackmsg_5fnew_135',['tcpip_callbackmsg_new',['../group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['tcpip_5fcallbackmsg_5ftrycallback_136',['tcpip_callbackmsg_trycallback',['../group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8',1,'tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8',1,'tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
+  ['tcpip_5fcallbackmsg_5ftrycallback_5ffromisr_137',['tcpip_callbackmsg_trycallback_fromisr',['../group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666',1,'tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666',1,'tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
+  ['tcpip_5fdebug_138',['TCPIP_DEBUG',['../group__lwip__opts__debugmsg.html#ga52d6c83451936c3de3b0338d4a3f921f',1,'opt.h']]],
+  ['tcpip_5finit_139',['tcpip_init',['../group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db',1,'tcpip_init(tcpip_init_done_fn initfunc, void *arg):&#160;tcpip.c'],['../group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db',1,'tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg):&#160;tcpip.c']]],
+  ['tcpip_5finit_5fdone_5ffn_140',['tcpip_init_done_fn',['../tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992',1,'tcpip.h']]],
+  ['tcpip_5finpkt_141',['tcpip_inpkt',['../tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102',1,'tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn):&#160;tcpip.c'],['../tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102',1,'tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn):&#160;tcpip.c']]],
+  ['tcpip_5finput_142',['tcpip_input',['../group__lwip__os.html#gae510f195171bed8499ae94e264a92717',1,'tcpip_input(struct pbuf *p, struct netif *inp):&#160;tcpip.c'],['../group__lwip__os.html#gae510f195171bed8499ae94e264a92717',1,'tcpip_input(struct pbuf *p, struct netif *inp):&#160;tcpip.c']]],
+  ['tcpip_5fmbox_5fsize_143',['TCPIP_MBOX_SIZE',['../group__lwip__opts__thread.html#ga8cf210ad4e4bf616860a45fbd140fd06',1,'opt.h']]],
+  ['tcpip_5fpriv_2eh_144',['tcpip_priv.h',['../tcpip__priv_8h.html',1,'']]],
+  ['tcpip_5frfc7668_5finput_145',['tcpip_rfc7668_input',['../lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a',1,'tcpip_rfc7668_input(struct pbuf *p, struct netif *inp):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a',1,'tcpip_rfc7668_input(struct pbuf *p, struct netif *inp):&#160;lowpan6_ble.c']]],
+  ['tcpip_5fsend_5fmsg_5fwait_5fsem_146',['tcpip_send_msg_wait_sem',['../tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d',1,'tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem):&#160;tcpip.c'],['../tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d',1,'tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem):&#160;tcpip.c']]],
+  ['tcpip_5fthread_5fname_147',['TCPIP_THREAD_NAME',['../group__lwip__opts__thread.html#ga405e604e4328e1feb878c6fe1798a587',1,'opt.h']]],
+  ['tcpip_5fthread_5fprio_148',['TCPIP_THREAD_PRIO',['../group__lwip__opts__thread.html#ga42b2c7a3042d7c3efd00f367f5837435',1,'opt.h']]],
+  ['tcpip_5fthread_5fstacksize_149',['TCPIP_THREAD_STACKSIZE',['../group__lwip__opts__thread.html#gaa02b84eafa0c8b09b158b97c96d79db0',1,'opt.h']]],
+  ['tcpip_5ftry_5fcallback_150',['tcpip_try_callback',['../group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020',1,'tcpip_try_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020',1,'tcpip_try_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['test_5fresult_151',['test_result',['../structnetbios__answer.html#a91116fe26c8050ee166053f377b40c7f',1,'netbios_answer']]],
+  ['tf_5freset_152',['TF_RESET',['../tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990',1,'tcp_priv.h']]],
+  ['tftp_20client_20server_153',['TFTP client/server',['../group__tftp.html',1,'']]],
+  ['tftp_2ec_154',['tftp.c',['../tftp_8c.html',1,'']]],
+  ['tftp_5fcleanup_155',['tftp_cleanup',['../group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec',1,'tftp_cleanup(void):&#160;tftp.c'],['../group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec',1,'tftp_cleanup(void):&#160;tftp.c']]],
+  ['tftp_5fclient_2eh_156',['tftp_client.h',['../tftp__client_8h.html',1,'']]],
+  ['tftp_5fcommon_2eh_157',['tftp_common.h',['../tftp__common_8h.html',1,'']]],
+  ['tftp_5fcontext_158',['tftp_context',['../structtftp__context.html',1,'']]],
+  ['tftp_5fdebug_159',['TFTP_DEBUG',['../group__tftp__opts.html#ga2dd54a1d0c3006527b8a7a8604b81981',1,'tftp_opts.h']]],
+  ['tftp_5finit_5fclient_160',['tftp_init_client',['../group__tftp.html#gaa6b743a64287206acb825bd60448e5f8',1,'tftp_init_client(const struct tftp_context *ctx):&#160;tftp.c'],['../group__tftp.html#gaa6b743a64287206acb825bd60448e5f8',1,'tftp_init_client(const struct tftp_context *ctx):&#160;tftp.c']]],
+  ['tftp_5finit_5fcommon_161',['tftp_init_common',['../tftp_8c.html#a5c6cf3de84a0dc990c055d66e574ca70',1,'tftp_init_common(u8_t mode, const struct tftp_context *ctx):&#160;tftp.c'],['../tftp__common_8h.html#a5c6cf3de84a0dc990c055d66e574ca70',1,'tftp_init_common(u8_t mode, const struct tftp_context *ctx):&#160;tftp.c']]],
+  ['tftp_5finit_5fserver_162',['tftp_init_server',['../group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40',1,'tftp_init_server(const struct tftp_context *ctx):&#160;tftp.c'],['../group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40',1,'tftp_init_server(const struct tftp_context *ctx):&#160;tftp.c']]],
+  ['tftp_5fmax_5ffilename_5flen_163',['TFTP_MAX_FILENAME_LEN',['../group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b',1,'tftp_opts.h']]],
+  ['tftp_5fmax_5fmode_5flen_164',['TFTP_MAX_MODE_LEN',['../group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055',1,'tftp_opts.h']]],
+  ['tftp_5fmax_5fretries_165',['TFTP_MAX_RETRIES',['../group__tftp__opts.html#ga6a01757ad942eb602e8a87e2be42d313',1,'tftp_opts.h']]],
+  ['tftp_5fopts_2eh_166',['tftp_opts.h',['../tftp__opts_8h.html',1,'']]],
+  ['tftp_5fport_167',['TFTP_PORT',['../group__tftp__opts.html#gad9230620a5d3bb87a7ac280ff99875d1',1,'tftp_opts.h']]],
+  ['tftp_5fserver_2eh_168',['tftp_server.h',['../tftp__server_8h.html',1,'']]],
+  ['tftp_5ftimeout_5fmsecs_169',['TFTP_TIMEOUT_MSECS',['../group__tftp__opts.html#ga36986e5465dc2ccb6184fc57f9a37d63',1,'tftp_opts.h']]],
+  ['tftp_5ftimer_5fmsecs_170',['TFTP_TIMER_MSECS',['../group__tftp__opts.html#ga3e6caacb3f4d43f780b2d68ffe4258ea',1,'tftp_opts.h']]],
+  ['thread_171',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
+  ['thread_20safe_20apis_172',['Thread-safe APIs',['../group__lwip__opts__threadsafe__apis.html',1,'']]],
+  ['threading_173',['Threading',['../group__lwip__opts__thread.html',1,'']]],
+  ['threadsync_5fdata_174',['threadsync_data',['../structthreadsync__data.html',1,'']]],
+  ['time_175',['Time',['../group__sys__time.html',1,'']]],
+  ['timeout_5fdiff_176',['timeout_diff',['../structmqtt__request__t.html#a65a7292669bc1f2d9df8f30bbcd77073',1,'mqtt_request_t']]],
+  ['timeouts_2ec_177',['timeouts.c',['../timeouts_8c.html',1,'']]],
+  ['timeouts_2eh_178',['timeouts.h',['../timeouts_8h.html',1,'']]],
+  ['timer_179',['timer',['../structsmtp__session.html#a5884425cb5ce964d8383b29cc20208d7',1,'smtp_session::timer'],['../structigmp__group.html#a8e2227e486652603fcd7f88681d4c75b',1,'igmp_group::timer'],['../structmld__group.html#a21f31e845cb11d2aca4ae7120736f69a',1,'mld_group::timer']]],
+  ['timers_180',['Timers',['../group__lwip__opts__timers.html',1,'']]],
+  ['timers_5fdebug_181',['TIMERS_DEBUG',['../group__lwip__opts__debugmsg.html#ga24a6644ba9cc82665a7bf209b3870c15',1,'opt.h']]],
+  ['tls_20layer_182',['TLS layer',['../group__altcp__tls.html',1,'']]],
+  ['tls_5fconfig_183',['tls_config',['../structmqtt__connect__client__info__t.html#a45987acc116de5d27fff6856778e55b4',1,'mqtt_connect_client_info_t']]],
+  ['to_184',['to',['../structsmtp__session.html#a70b3753bc70e65f779279c246617faea',1,'smtp_session']]],
+  ['to_20contribute_20to_20lwip_185',['How to contribute to lwIP',['../contrib.html',1,'']]],
+  ['to_20lwip_186',['How to contribute to lwIP',['../contrib.html',1,'']]],
+  ['to_5flen_187',['to_len',['../structsmtp__session.html#a66b8e1dd314976788e9ac9a81f59a402',1,'smtp_session']]],
+  ['tot_5flen_188',['tot_len',['../structpbuf.html#a5259e7ec29bab9c0999b64f2e86b411f',1,'pbuf']]],
+  ['total_5fnumber_5fof_5fcommand_5fblocks_189',['total_number_of_command_blocks',['../structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2',1,'netbios_answer']]],
+  ['traps_190',['Traps',['../group__snmp__traps.html',1,'']]],
+  ['tried_5fllipaddr_191',['tried_llipaddr',['../structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853',1,'autoip']]],
+  ['ts_192',['ts',['../structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971',1,'netif']]],
+  ['tssihandler_193',['tSSIHandler',['../group__httpd.html#gaf88dacc4f18d299084cab75252001319',1,'httpd.h']]],
+  ['ttw_194',['ttw',['../structacd.html#aabde1967e37d685b19b9701af641a97c',1,'acd']]],
+  ['tx_5fbuf_195',['tx_buf',['../structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61',1,'smtp_session']]],
+  ['tx_5fdatagram_5ftag_196',['tx_datagram_tag',['../structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c',1,'lowpan6_ieee802154_data']]],
+  ['tx_5fframe_5fseq_5fnum_197',['tx_frame_seq_num',['../structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c',1,'lowpan6_ieee802154_data']]],
+  ['tx_5fid_198',['tx_id',['../structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00',1,'mdns_packet::tx_id'],['../structmdns__outmsg.html#a1d2d5f1d5d366f31d65ca18a239bfd4e',1,'mdns_outmsg::tx_id']]],
+  ['txt_5ffn_199',['txt_fn',['../structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c',1,'mdns_service']]],
+  ['txtdata_200',['txtdata',['../structmdns__service.html#a35daff90a18d19b14f23fa02df424f94',1,'mdns_service']]],
+  ['type_201',['type',['../structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6',1,'netconn::type'],['../structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950',1,'snmp_varbind::type'],['../structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a',1,'ip_addr::type']]],
+  ['type_5finternal_202',['type_internal',['../structpbuf.html#a61a26ac8393dc9e549016b86c2cf5131',1,'pbuf']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_18.js b/doc/doxygen/output/html/search/all_18.js
index 1717693..e7d50c0 100644
--- a/doc/doxygen/output/html/search/all_18.js
+++ b/doc/doxygen/output/html/search/all_18.js
@@ -25,11 +25,12 @@
   ['udp_5fsendto_5fif_5fsrc_22',['udp_sendto_if_src',['../group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7',1,'udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip):&#160;udp.c'],['../group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7',1,'udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip):&#160;udp.c']]],
   ['udp_5fstats_23',['UDP_STATS',['../group__lwip__opts__stats.html#gaef64b11bf71f0d6d5bafaf6092462276',1,'opt.h']]],
   ['udp_5fttl_24',['UDP_TTL',['../group__lwip__opts__udp.html#ga97908a317bcba89174b5d1ccbdca0096',1,'opt.h']]],
-  ['unicast_5freply_25',['unicast_reply',['../structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d',1,'mdns_outpacket']]],
-  ['unit_5fid_26',['unit_id',['../structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787',1,'netbios_answer']]],
-  ['unlock_5ftcpip_5fcore_27',['UNLOCK_TCPIP_CORE',['../tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d',1,'tcpip.h']]],
-  ['upgrading_28',['Upgrading',['../upgrading.html',1,'']]],
-  ['use_29',['use',['../structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852',1,'igmp_group::use'],['../structmld__group.html#addc67094f83c9352fe039c392c480f9e',1,'mld_group::use']]],
-  ['used_30',['used',['../structmem.html#aa76b6a39425617435978dce903f0d456',1,'mem']]],
-  ['username_31',['username',['../structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb',1,'smtp_session']]]
+  ['unicast_5fmsg_5fin_5fuse_25',['unicast_msg_in_use',['../structmdns__delayed__msg.html#abd5210624394fece45e57e16da85a47d',1,'mdns_delayed_msg']]],
+  ['unicast_5freply_5frequested_26',['unicast_reply_requested',['../structmdns__outmsg.html#a8abcd5b3e04c16a75752b36cf613ac6f',1,'mdns_outmsg']]],
+  ['unit_5fid_27',['unit_id',['../structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787',1,'netbios_answer']]],
+  ['unlock_5ftcpip_5fcore_28',['UNLOCK_TCPIP_CORE',['../tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d',1,'tcpip.h']]],
+  ['upgrading_29',['Upgrading',['../upgrading.html',1,'']]],
+  ['use_30',['use',['../structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852',1,'igmp_group::use'],['../structmld__group.html#addc67094f83c9352fe039c392c480f9e',1,'mld_group::use']]],
+  ['used_31',['used',['../structmem.html#aa76b6a39425617435978dce903f0d456',1,'mem']]],
+  ['username_32',['username',['../structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb',1,'smtp_session']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_1a.js b/doc/doxygen/output/html/search/all_1a.js
index e1f2642..7e07d05 100644
--- a/doc/doxygen/output/html/search/all_1a.js
+++ b/doc/doxygen/output/html/search/all_1a.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['w_0',['w',['../structapi__msg.html#ac0637c6f4dbb3f64f95d5181d55e663c',1,'api_msg']]],
+  ['w_0',['w',['../structapi__msg.html#a0abfc9bda0b00554628bc3169d8f21bf',1,'api_msg']]],
   ['will_5fmsg_1',['will_msg',['../structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7',1,'mqtt_connect_client_info_t']]],
   ['will_5fqos_2',['will_qos',['../structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9',1,'mqtt_connect_client_info_t']]],
   ['will_5fretain_3',['will_retain',['../structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3',1,'mqtt_connect_client_info_t']]],
diff --git a/doc/doxygen/output/html/search/all_4.js b/doc/doxygen/output/html/search/all_4.js
index ea83d3d..9e7388d 100644
--- a/doc/doxygen/output/html/search/all_4.js
+++ b/doc/doxygen/output/html/search/all_4.js
@@ -4,125 +4,151 @@
   ['abstraction_20layer_1',['abstraction layer',['../group__sys__os.html',1,'OS abstraction layer'],['../group__sys__layer.html',1,'Porting (system abstraction layer)']]],
   ['acceptmbox_2',['acceptmbox',['../structnetconn.html#a9b59188f300828d2b5814e27ab27cad0',1,'netconn']]],
   ['access_3',['access',['../structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c',1,'snmp_node_instance']]],
-  ['ad_4',['ad',['../structapi__msg.html#af9817721045b7ebe98ad484730e5e9cc',1,'api_msg']]],
-  ['additional_5',['additional',['../structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce',1,'mdns_outpacket']]],
-  ['addr_6',['addr',['../structdns__api__msg.html#a217814594564077d21b0f2696280b2a8',1,'dns_api_msg::addr'],['../structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d',1,'zepif_init::addr']]],
-  ['addr_5findex_7',['addr_index',['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd',1,'netif_ext_callback_args_t::ipv6_set_s::addr_index'],['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s::addr_index']]],
-  ['address_8',['address',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s']]],
-  ['address_20handling_9',['address handling',['../group__ipaddr.html',1,'IP address handling'],['../group__netif__ip4.html',1,'IPv4 address handling'],['../group__netif__ip6.html',1,'IPv6 address handling']]],
-  ['agent_10',['SNMPv2c/v3 agent',['../group__snmp.html',1,'']]],
-  ['altcp_2ec_11',['altcp.c',['../altcp_8c.html',1,'']]],
-  ['altcp_2eh_12',['altcp.h',['../altcp_8h.html',1,'']]],
-  ['altcp_5fabort_13',['altcp_abort',['../group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab',1,'altcp_abort(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab',1,'altcp_abort(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5faccept_14',['altcp_accept',['../group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9',1,'altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept):&#160;altcp.c'],['../group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9',1,'altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept):&#160;altcp.c']]],
-  ['altcp_5falloc_15',['altcp_alloc',['../altcp_8c.html#aa74c9fc358cffeeb7311b4212b0d6fc7',1,'altcp_alloc(void):&#160;altcp.c'],['../altcp__priv_8h.html#aa74c9fc358cffeeb7311b4212b0d6fc7',1,'altcp_alloc(void):&#160;altcp.c']]],
-  ['altcp_5falloc_2ec_16',['altcp_alloc.c',['../altcp__alloc_8c.html',1,'']]],
-  ['altcp_5farg_17',['altcp_arg',['../group__altcp.html#ga197a33af038556a04d8f27c7033d771f',1,'altcp_arg(struct altcp_pcb *conn, void *arg):&#160;altcp.c'],['../group__altcp.html#ga197a33af038556a04d8f27c7033d771f',1,'altcp_arg(struct altcp_pcb *conn, void *arg):&#160;altcp.c']]],
-  ['altcp_5fbind_18',['altcp_bind',['../group__altcp.html#ga485b248680f73b9876d8674029c5157c',1,'altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port):&#160;altcp.c'],['../group__altcp.html#ga485b248680f73b9876d8674029c5157c',1,'altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port):&#160;altcp.c']]],
-  ['altcp_5fclose_19',['altcp_close',['../group__altcp.html#ga4329798afdf3709c789a2ee060ee3993',1,'altcp_close(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga4329798afdf3709c789a2ee060ee3993',1,'altcp_close(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5fconnect_20',['altcp_connect',['../group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492',1,'altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected):&#160;altcp.c'],['../group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492',1,'altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected):&#160;altcp.c']]],
-  ['altcp_5ferr_21',['altcp_err',['../group__altcp.html#gadc76a1f3b2448559dc87da1b33291644',1,'altcp_err(struct altcp_pcb *conn, altcp_err_fn err):&#160;altcp.c'],['../group__altcp.html#gadc76a1f3b2448559dc87da1b33291644',1,'altcp_err(struct altcp_pcb *conn, altcp_err_fn err):&#160;altcp.c']]],
-  ['altcp_5ffree_22',['altcp_free',['../altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d',1,'altcp_free(struct altcp_pcb *conn):&#160;altcp.c'],['../altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d',1,'altcp_free(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5flisten_5fwith_5fbacklog_5fand_5ferr_23',['altcp_listen_with_backlog_and_err',['../group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c'],['../group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c']]],
-  ['altcp_5fmbedtls_5fdebug_24',['ALTCP_MBEDTLS_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5flib_5fdebug_25',['ALTCP_MBEDTLS_LIB_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5flib_5fdebug_5flevel_5fmin_26',['ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN',['../altcp__tls__mbedtls__opts_8h.html#ad8561bbfabb4ec81ad1c4d7304d16bb5',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fsession_5fcache_5fsize_27',['ALTCP_MBEDTLS_SESSION_CACHE_SIZE',['../altcp__tls__mbedtls__opts_8h.html#a1c8a3f37f8ede74835b03eedcdc41973',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fsession_5fcache_5ftimeout_5fseconds_28',['ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fsession_5fticket_5fcipher_29',['ALTCP_MBEDTLS_SESSION_TICKET_CIPHER',['../altcp__tls__mbedtls__opts_8h.html#a4917dbc00f43f88eb703c8ba89bd37f6',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fsession_5fticket_5ftimeout_5fseconds_30',['ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a66eff71890153166578b0b78d780ac50',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fuse_5fsession_5fcache_31',['ALTCP_MBEDTLS_USE_SESSION_CACHE',['../altcp__tls__mbedtls__opts_8h.html#abd6b53a101f046337a4d77c749dbab66',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fuse_5fsession_5ftickets_32',['ALTCP_MBEDTLS_USE_SESSION_TICKETS',['../altcp__tls__mbedtls__opts_8h.html#ae3dbc4de0fc53bcda746c9dfd5618d3b',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmss_33',['altcp_mss',['../group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08',1,'altcp_mss(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08',1,'altcp_mss(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5fnew_34',['altcp_new',['../group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c']]],
-  ['altcp_5fnew_5fip6_35',['altcp_new_ip6',['../group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c']]],
-  ['altcp_5fnew_5fip_5ftype_36',['altcp_new_ip_type',['../group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c'],['../group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c']]],
-  ['altcp_5foutput_37',['altcp_output',['../group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6',1,'altcp_output(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6',1,'altcp_output(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5fpoll_38',['altcp_poll',['../group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0',1,'altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval):&#160;altcp.c'],['../group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0',1,'altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval):&#160;altcp.c']]],
-  ['altcp_5fpriv_2eh_39',['altcp_priv.h',['../altcp__priv_8h.html',1,'']]],
-  ['altcp_5fproxyconnect_2ec_40',['altcp_proxyconnect.c',['../altcp__proxyconnect_8c.html',1,'']]],
-  ['altcp_5fproxyconnect_2eh_41',['altcp_proxyconnect.h',['../altcp__proxyconnect_8h.html',1,'']]],
-  ['altcp_5fproxyconnect_5falloc_42',['altcp_proxyconnect_alloc',['../altcp__proxyconnect_8c.html#a371cd4386fcbc5f0a0ff6e2fa0408e68',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a371cd4386fcbc5f0a0ff6e2fa0408e68',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
-  ['altcp_5fproxyconnect_5fclient_5fagent_43',['ALTCP_PROXYCONNECT_CLIENT_AGENT',['../altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f',1,'altcp_proxyconnect.c']]],
-  ['altcp_5fproxyconnect_5fnew_44',['altcp_proxyconnect_new',['../altcp__proxyconnect_8c.html#a389937c9441d4e3f67412603b3d1d236',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a389937c9441d4e3f67412603b3d1d236',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c']]],
-  ['altcp_5fproxyconnect_5fnew_5ftcp_45',['altcp_proxyconnect_new_tcp',['../altcp__proxyconnect_8c.html#ab0072ee857af8a28b555f14c0f2c9183',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#ab0072ee857af8a28b555f14c0f2c9183',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
-  ['altcp_5fproxyconnect_5ftls_5falloc_46',['altcp_proxyconnect_tls_alloc',['../altcp__proxyconnect_8c.html#aa807e0476719f0ec41b2344d4a0df2f4',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#aa807e0476719f0ec41b2344d4a0df2f4',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
-  ['altcp_5frecv_47',['altcp_recv',['../group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71',1,'altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv):&#160;altcp.c'],['../group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71',1,'altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv):&#160;altcp.c']]],
-  ['altcp_5frecved_48',['altcp_recved',['../group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83',1,'altcp_recved(struct altcp_pcb *conn, u16_t len):&#160;altcp.c'],['../group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83',1,'altcp_recved(struct altcp_pcb *conn, u16_t len):&#160;altcp.c']]],
-  ['altcp_5fsent_49',['altcp_sent',['../group__altcp.html#gab2b228c77c827fb14bfc513171c79f47',1,'altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent):&#160;altcp.c'],['../group__altcp.html#gab2b228c77c827fb14bfc513171c79f47',1,'altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent):&#160;altcp.c']]],
-  ['altcp_5fsetprio_50',['altcp_setprio',['../group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5',1,'altcp_setprio(struct altcp_pcb *conn, u8_t prio):&#160;altcp.c'],['../group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5',1,'altcp_setprio(struct altcp_pcb *conn, u8_t prio):&#160;altcp.c']]],
-  ['altcp_5fshutdown_51',['altcp_shutdown',['../group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319',1,'altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx):&#160;altcp.c'],['../group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319',1,'altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx):&#160;altcp.c']]],
-  ['altcp_5fsndbuf_52',['altcp_sndbuf',['../group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c',1,'altcp_sndbuf(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c',1,'altcp_sndbuf(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5fsndqueuelen_53',['altcp_sndqueuelen',['../group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5',1,'altcp_sndqueuelen(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5',1,'altcp_sndqueuelen(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5ftcp_2ec_54',['altcp_tcp.c',['../altcp__tcp_8c.html',1,'']]],
-  ['altcp_5ftcp_2eh_55',['altcp_tcp.h',['../altcp__tcp_8h.html',1,'']]],
-  ['altcp_5ftcp_5falloc_56',['altcp_tcp_alloc',['../altcp__tcp_8c.html#a77582c93bb8a0aa2719e86b8c8505e8a',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c'],['../altcp__tcp_8h.html#a77582c93bb8a0aa2719e86b8c8505e8a',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c']]],
-  ['altcp_5ftls_2eh_57',['altcp_tls.h',['../altcp__tls_8h.html',1,'']]],
-  ['altcp_5ftls_5falloc_58',['altcp_tls_alloc',['../group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c']]],
-  ['altcp_5ftls_5fconfig_5fserver_5fadd_5fprivkey_5fcert_59',['altcp_tls_config_server_add_privkey_cert',['../group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcontext_60',['altcp_tls_context',['../group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcreate_5fconfig_5fclient_61',['altcp_tls_create_config_client',['../group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcreate_5fconfig_5fclient_5f2wayauth_62',['altcp_tls_create_config_client_2wayauth',['../group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcreate_5fconfig_5fserver_63',['altcp_tls_create_config_server',['../group__altcp__tls.html#gaf6ed13271394371cc89d70ef5128c411',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcreate_5fconfig_5fserver_5fprivkey_5fcert_64',['altcp_tls_create_config_server_privkey_cert',['../group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5ffree_5fconfig_65',['altcp_tls_free_config',['../group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5ffree_5fentropy_66',['altcp_tls_free_entropy',['../group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fmbedtls_2ec_67',['altcp_tls_mbedtls.c',['../altcp__tls__mbedtls_8c.html',1,'']]],
-  ['altcp_5ftls_5fmbedtls_5fmem_2ec_68',['altcp_tls_mbedtls_mem.c',['../altcp__tls__mbedtls__mem_8c.html',1,'']]],
-  ['altcp_5ftls_5fmbedtls_5fmem_2eh_69',['altcp_tls_mbedtls_mem.h',['../altcp__tls__mbedtls__mem_8h.html',1,'']]],
-  ['altcp_5ftls_5fmbedtls_5fopts_2eh_70',['altcp_tls_mbedtls_opts.h',['../altcp__tls__mbedtls__opts_8h.html',1,'']]],
-  ['altcp_5ftls_5fmbedtls_5fstructs_2eh_71',['altcp_tls_mbedtls_structs.h',['../altcp__tls__mbedtls__structs_8h.html',1,'']]],
-  ['altcp_5ftls_5fnew_72',['altcp_tls_new',['../group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c']]],
-  ['altcp_5ftls_5fwrap_73',['altcp_tls_wrap',['../group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c',1,'altcp_tls.h']]],
-  ['altcp_5fwrite_74',['altcp_write',['../group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d',1,'altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags):&#160;altcp.c'],['../group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d',1,'altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags):&#160;altcp.c']]],
-  ['and_20lwip_5fdbg_5ftypes_5fon_20values_75',['LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values',['../group__debugging__levels.html',1,'']]],
-  ['and_20memory_20pools_76',['Heap and memory pools',['../group__lwip__opts__mem.html',1,'']]],
-  ['and_20mpu_77',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
-  ['answer_5fname_78',['answer_name',['../structnetbios__answer.html#abf746cd54add594216ddc3683c741406',1,'netbios_answer']]],
-  ['answer_5fname_5fflags_79',['answer_name_flags',['../structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4',1,'netbios_answer']]],
-  ['answers_80',['answers',['../structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7',1,'mdns_packet::answers'],['../structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad',1,'mdns_outpacket::answers']]],
-  ['answers_5fleft_81',['answers_left',['../structmdns__packet.html#a56ba495a1458a21982e65d746468849d',1,'mdns_packet']]],
-  ['api_82',['API',['../group__if__api.html',1,'Interface Identification API'],['../group__netconn.html',1,'Netconn API'],['../group__netdbapi.html',1,'NETDB API'],['../group__netifapi.html',1,'NETIF API'],['../group__socket.html',1,'Socket API']]],
-  ['api_2eh_83',['api.h',['../api_8h.html',1,'']]],
-  ['api_5fevent_84',['API_EVENT',['../api_8h.html#a3ce590f58be8f60dbde361920863b26d',1,'api.h']]],
-  ['api_5flib_2ec_85',['api_lib.c',['../api__lib_8c.html',1,'']]],
-  ['api_5flib_5fdebug_86',['API_LIB_DEBUG',['../group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160',1,'opt.h']]],
-  ['api_5fmsg_87',['api_msg',['../structapi__msg.html',1,'']]],
-  ['api_5fmsg_2ec_88',['api_msg.c',['../api__msg_8c.html',1,'']]],
-  ['api_5fmsg_2eh_89',['api_msg.h',['../api__msg_8h.html',1,'']]],
-  ['api_5fmsg_5fdebug_90',['API_MSG_DEBUG',['../group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697',1,'opt.h']]],
-  ['apis_91',['APIs',['../group__callbackstyle__api.html',1,'&quot;raw&quot; APIs'],['../group__api.html',1,'APIs'],['../group__lwip__opts__callback.html',1,'Callback-style APIs'],['../group__sequential__api.html',1,'Sequential-style APIs'],['../group__lwip__opts__threadsafe__apis.html',1,'Thread-safe APIs']]],
-  ['application_20layered_20tcp_20functions_92',['Application layered TCP Functions',['../group__altcp.html',1,'']]],
-  ['application_20layered_20tcp_20introduction_93',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
-  ['applications_94',['Applications',['../group__apps.html',1,'']]],
-  ['arch_2eh_95',['arch.h',['../arch_8h.html',1,'']]],
-  ['arguments_96',['ext arguments',['../group__tcp__raw__extargs.html',1,'']]],
-  ['arp_97',['ARP',['../group__lwip__opts__arp.html',1,'']]],
-  ['arp_5fage_5frerequest_5fused_5funicast_98',['ARP_AGE_REREQUEST_USED_UNICAST',['../etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a',1,'etharp.c']]],
-  ['arp_5fmaxage_99',['ARP_MAXAGE',['../group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432',1,'opt.h']]],
-  ['arp_5fmaxpending_100',['ARP_MAXPENDING',['../etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9',1,'etharp.c']]],
-  ['arp_5fqueue_5flen_101',['ARP_QUEUE_LEN',['../group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1',1,'opt.h']]],
-  ['arp_5fqueueing_102',['ARP_QUEUEING',['../group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58',1,'opt.h']]],
-  ['arp_5ftable_5fsize_103',['ARP_TABLE_SIZE',['../group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9',1,'opt.h']]],
-  ['arp_5ftmr_5finterval_104',['ARP_TMR_INTERVAL',['../lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37',1,'etharp.h']]],
-  ['asn1_5ftype_105',['asn1_type',['../structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9',1,'snmp_node_instance']]],
-  ['assertion_20handling_106',['Assertion handling',['../group__lwip__assertions.html',1,'']]],
-  ['assigned_20numbers_107',['assigned numbers',['../group__iana.html',1,'IANA assigned numbers'],['../group__ieee.html',1,'IEEE assigned numbers']]],
-  ['auth_5fplain_108',['auth_plain',['../structsmtp__session.html#a561389328fb1fefcb4d4d17fd0d43301',1,'smtp_session']]],
-  ['auth_5fplain_5flen_109',['auth_plain_len',['../structsmtp__session.html#a003dfd03ac58252b575a7c965e532461',1,'smtp_session']]],
-  ['authoritative_110',['authoritative',['../structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035',1,'mdns_outpacket']]],
-  ['autoip_111',['AUTOIP',['../group__autoip.html',1,'AUTOIP'],['../group__netifapi__autoip.html',1,'AUTOIP'],['../group__lwip__opts__autoip.html',1,'AUTOIP']]],
-  ['autoip_112',['autoip',['../structautoip.html',1,'']]],
-  ['autoip_2ec_113',['autoip.c',['../autoip_8c.html',1,'']]],
-  ['autoip_2eh_114',['autoip.h',['../autoip_8h.html',1,'(Global Namespace)'],['../prot_2autoip_8h.html',1,'(Global Namespace)']]],
-  ['autoip_5farp_5freply_115',['autoip_arp_reply',['../autoip_8c.html#acaf2793325c60dc4531c21a3fd55c16e',1,'autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr):&#160;autoip.c'],['../autoip_8h.html#acaf2793325c60dc4531c21a3fd55c16e',1,'autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr):&#160;autoip.c']]],
-  ['autoip_5fdebug_116',['AUTOIP_DEBUG',['../group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5',1,'opt.h']]],
-  ['autoip_5fnetwork_5fchanged_117',['autoip_network_changed',['../autoip_8c.html#a11df7a20d52680cd8c1c18fba2b91e9e',1,'autoip_network_changed(struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#a11df7a20d52680cd8c1c18fba2b91e9e',1,'autoip_network_changed(struct netif *netif):&#160;autoip.c']]],
-  ['autoip_5fremove_5fstruct_118',['autoip_remove_struct',['../autoip_8h.html#aaeb4b778fce078bee84144ab50916b15',1,'autoip.h']]],
-  ['autoip_5fset_5fstruct_119',['autoip_set_struct',['../group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90',1,'autoip_set_struct(struct netif *netif, struct autoip *autoip):&#160;autoip.c'],['../group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90',1,'autoip_set_struct(struct netif *netif, struct autoip *autoip):&#160;autoip.c']]],
-  ['autoip_5fstart_120',['autoip_start',['../group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8',1,'autoip_start(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8',1,'autoip_start(struct netif *netif):&#160;autoip.c']]],
-  ['autoip_5fstop_121',['autoip_stop',['../group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4',1,'autoip_stop(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4',1,'autoip_stop(struct netif *netif):&#160;autoip.c']]],
-  ['autoip_5fsupplied_5faddress_122',['autoip_supplied_address',['../autoip_8c.html#a1b4f0c53da17395d9de92a85708a1bb9',1,'autoip_supplied_address(const struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#a1b4f0c53da17395d9de92a85708a1bb9',1,'autoip_supplied_address(const struct netif *netif):&#160;autoip.c']]],
-  ['autoip_5ftmr_123',['autoip_tmr',['../autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d',1,'autoip_tmr(void):&#160;autoip.c'],['../autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d',1,'autoip_tmr(void):&#160;autoip.c']]],
-  ['autoip_5ftmr_5finterval_124',['AUTOIP_TMR_INTERVAL',['../autoip_8h.html#a8986919a452ab77eec9a199ff6668e92',1,'autoip.h']]]
+  ['acd_4',['ACD',['../group__acd.html',1,'ACD'],['../group__lwip__opts__acd.html',1,'ACD']]],
+  ['acd_5',['acd',['../structacd.html',1,'acd'],['../structautoip.html#a1965250cda881d229e2a1fe146a0bb9e',1,'autoip::acd']]],
+  ['acd_2ec_6',['acd.c',['../acd_8c.html',1,'']]],
+  ['acd_2eh_7',['acd.h',['../acd_8h.html',1,'(Global Namespace)'],['../prot_2acd_8h.html',1,'(Global Namespace)']]],
+  ['acd_5fadd_8',['acd_add',['../group__acd.html#ga158856bf139cb2761837ddfa07303bdc',1,'acd_add(struct netif *netif, struct acd *acd, acd_conflict_callback_t acd_conflict_callback):&#160;acd.c'],['../group__acd.html#ga158856bf139cb2761837ddfa07303bdc',1,'acd_add(struct netif *netif, struct acd *acd, acd_conflict_callback_t acd_conflict_callback):&#160;acd.c']]],
+  ['acd_5farp_5freply_9',['acd_arp_reply',['../acd_8c.html#aa92e21410d0f0d357ab9166cda24937a',1,'acd_arp_reply(struct netif *netif, struct etharp_hdr *hdr):&#160;acd.c'],['../acd_8h.html#aa92e21410d0f0d357ab9166cda24937a',1,'acd_arp_reply(struct netif *netif, struct etharp_hdr *hdr):&#160;acd.c']]],
+  ['acd_5fconflict_5fcallback_10',['acd_conflict_callback',['../structacd.html#a3a03aa687716055a4f75f6e5e380e46e',1,'acd']]],
+  ['acd_5fconflict_5fcallback_5ft_11',['acd_conflict_callback_t',['../acd_8h.html#abb446404752f56b028eafa8302db955f',1,'acd.h']]],
+  ['acd_5fdebug_12',['ACD_DEBUG',['../group__lwip__opts__debugmsg.html#ga87ff0c6077b9a36b05c3fc5b8fae8ad3',1,'opt.h']]],
+  ['acd_5fnetif_5fip_5faddr_5fchanged_13',['acd_netif_ip_addr_changed',['../group__acd.html#ga18b444f6fc69325416b463208a754c97',1,'acd_netif_ip_addr_changed(struct netif *netif, const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;acd.c'],['../group__acd.html#ga18b444f6fc69325416b463208a754c97',1,'acd_netif_ip_addr_changed(struct netif *netif, const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;acd.c']]],
+  ['acd_5fnetwork_5fchanged_5flink_5fdown_14',['acd_network_changed_link_down',['../group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff',1,'acd_network_changed_link_down(struct netif *netif):&#160;acd.c'],['../group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff',1,'acd_network_changed_link_down(struct netif *netif):&#160;acd.c']]],
+  ['acd_5fremove_15',['acd_remove',['../group__acd.html#ga70503696bca25e1cfb61fad38b4327da',1,'acd_remove(struct netif *netif, struct acd *acd):&#160;acd.c'],['../group__acd.html#ga70503696bca25e1cfb61fad38b4327da',1,'acd_remove(struct netif *netif, struct acd *acd):&#160;acd.c']]],
+  ['acd_5fstart_16',['acd_start',['../group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb',1,'acd_start(struct netif *netif, struct acd *acd, ip4_addr_t ipaddr):&#160;acd.c'],['../group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb',1,'acd_start(struct netif *netif, struct acd *acd, ip4_addr_t ipaddr):&#160;acd.c']]],
+  ['acd_5fstop_17',['acd_stop',['../group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7',1,'acd_stop(struct acd *acd):&#160;acd.c'],['../group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7',1,'acd_stop(struct acd *acd):&#160;acd.c']]],
+  ['acd_5ftmr_18',['acd_tmr',['../acd_8c.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e',1,'acd_tmr(void):&#160;acd.c'],['../acd_8h.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e',1,'acd_tmr(void):&#160;acd.c']]],
+  ['acd_5ftmr_5finterval_19',['ACD_TMR_INTERVAL',['../acd_8h.html#aace6da0b0dacd77a9d6bd11f424ffa82',1,'acd.h']]],
+  ['ad_20',['ad',['../structapi__msg.html#a1831a18bdfe88ca89a773fc477966894',1,'api_msg']]],
+  ['additional_21',['additional',['../structmdns__packet.html#ab7d1d004dcac3cb6761241c5fe58b0ab',1,'mdns_packet::additional'],['../structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce',1,'mdns_outpacket::additional']]],
+  ['additional_5fleft_22',['additional_left',['../structmdns__packet.html#ac47f5a84c173a1565c69673536537c89',1,'mdns_packet']]],
+  ['addr_23',['addr',['../structdns__api__msg.html#a217814594564077d21b0f2696280b2a8',1,'dns_api_msg::addr'],['../structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d',1,'zepif_init::addr']]],
+  ['addr_5findex_24',['addr_index',['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd',1,'netif_ext_callback_args_t::ipv6_set_s::addr_index'],['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s::addr_index']]],
+  ['address_25',['address',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s']]],
+  ['address_20handling_26',['address handling',['../group__ipaddr.html',1,'IP address handling'],['../group__netif__ip4.html',1,'IPv4 address handling'],['../group__netif__ip6.html',1,'IPv6 address handling']]],
+  ['agent_27',['SNMPv2c/v3 agent',['../group__snmp.html',1,'']]],
+  ['alloc_28',['alloc',['../structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687',1,'altcp_allocator_s']]],
+  ['altcp_2ec_29',['altcp.c',['../altcp_8c.html',1,'']]],
+  ['altcp_2eh_30',['altcp.h',['../altcp_8h.html',1,'']]],
+  ['altcp_5fabort_31',['altcp_abort',['../group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab',1,'altcp_abort(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab',1,'altcp_abort(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5faccept_32',['altcp_accept',['../group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9',1,'altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept):&#160;altcp.c'],['../group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9',1,'altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept):&#160;altcp.c']]],
+  ['altcp_5falloc_33',['altcp_alloc',['../altcp_8c.html#aa74c9fc358cffeeb7311b4212b0d6fc7',1,'altcp_alloc(void):&#160;altcp.c'],['../altcp__priv_8h.html#aa74c9fc358cffeeb7311b4212b0d6fc7',1,'altcp_alloc(void):&#160;altcp.c']]],
+  ['altcp_5falloc_2ec_34',['altcp_alloc.c',['../altcp__alloc_8c.html',1,'']]],
+  ['altcp_5fallocator_5fs_35',['altcp_allocator_s',['../structaltcp__allocator__s.html',1,'']]],
+  ['altcp_5fallocator_5ft_36',['altcp_allocator_t',['../group__altcp.html#ga04a328f67359ee03d1ec6824978b7209',1,'altcp.h']]],
+  ['altcp_5farg_37',['altcp_arg',['../group__altcp.html#ga197a33af038556a04d8f27c7033d771f',1,'altcp_arg(struct altcp_pcb *conn, void *arg):&#160;altcp.c'],['../group__altcp.html#ga197a33af038556a04d8f27c7033d771f',1,'altcp_arg(struct altcp_pcb *conn, void *arg):&#160;altcp.c']]],
+  ['altcp_5fbind_38',['altcp_bind',['../group__altcp.html#ga485b248680f73b9876d8674029c5157c',1,'altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port):&#160;altcp.c'],['../group__altcp.html#ga485b248680f73b9876d8674029c5157c',1,'altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port):&#160;altcp.c']]],
+  ['altcp_5fclose_39',['altcp_close',['../group__altcp.html#ga4329798afdf3709c789a2ee060ee3993',1,'altcp_close(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga4329798afdf3709c789a2ee060ee3993',1,'altcp_close(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5fconnect_40',['altcp_connect',['../group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492',1,'altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected):&#160;altcp.c'],['../group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492',1,'altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected):&#160;altcp.c']]],
+  ['altcp_5ferr_41',['altcp_err',['../group__altcp.html#gadc76a1f3b2448559dc87da1b33291644',1,'altcp_err(struct altcp_pcb *conn, altcp_err_fn err):&#160;altcp.c'],['../group__altcp.html#gadc76a1f3b2448559dc87da1b33291644',1,'altcp_err(struct altcp_pcb *conn, altcp_err_fn err):&#160;altcp.c']]],
+  ['altcp_5ffree_42',['altcp_free',['../altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d',1,'altcp_free(struct altcp_pcb *conn):&#160;altcp.c'],['../altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d',1,'altcp_free(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5flisten_5fwith_5fbacklog_5fand_5ferr_43',['altcp_listen_with_backlog_and_err',['../group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c'],['../group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c']]],
+  ['altcp_5fmbedtls_5fauthmode_44',['ALTCP_MBEDTLS_AUTHMODE',['../altcp__tls__mbedtls__opts_8h.html#a12aba61586bd71cb42b0925b9211b366',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fdebug_45',['ALTCP_MBEDTLS_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5flib_5fdebug_46',['ALTCP_MBEDTLS_LIB_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5flib_5fdebug_5flevel_5fmin_47',['ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN',['../altcp__tls__mbedtls__opts_8h.html#ad8561bbfabb4ec81ad1c4d7304d16bb5',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fcache_5fsize_48',['ALTCP_MBEDTLS_SESSION_CACHE_SIZE',['../altcp__tls__mbedtls__opts_8h.html#a1c8a3f37f8ede74835b03eedcdc41973',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fcache_5ftimeout_5fseconds_49',['ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fticket_5fcipher_50',['ALTCP_MBEDTLS_SESSION_TICKET_CIPHER',['../altcp__tls__mbedtls__opts_8h.html#a4917dbc00f43f88eb703c8ba89bd37f6',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fticket_5ftimeout_5fseconds_51',['ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a66eff71890153166578b0b78d780ac50',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fuse_5fsession_5fcache_52',['ALTCP_MBEDTLS_USE_SESSION_CACHE',['../altcp__tls__mbedtls__opts_8h.html#abd6b53a101f046337a4d77c749dbab66',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fuse_5fsession_5ftickets_53',['ALTCP_MBEDTLS_USE_SESSION_TICKETS',['../altcp__tls__mbedtls__opts_8h.html#ae3dbc4de0fc53bcda746c9dfd5618d3b',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmss_54',['altcp_mss',['../group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08',1,'altcp_mss(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08',1,'altcp_mss(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5fnew_55',['altcp_new',['../group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c']]],
+  ['altcp_5fnew_5fip6_56',['altcp_new_ip6',['../group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c']]],
+  ['altcp_5fnew_5fip_5ftype_57',['altcp_new_ip_type',['../group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c'],['../group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c']]],
+  ['altcp_5foutput_58',['altcp_output',['../group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6',1,'altcp_output(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6',1,'altcp_output(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5fpoll_59',['altcp_poll',['../group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0',1,'altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval):&#160;altcp.c'],['../group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0',1,'altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval):&#160;altcp.c']]],
+  ['altcp_5fpriv_2eh_60',['altcp_priv.h',['../altcp__priv_8h.html',1,'']]],
+  ['altcp_5fproxyconnect_2ec_61',['altcp_proxyconnect.c',['../altcp__proxyconnect_8c.html',1,'']]],
+  ['altcp_5fproxyconnect_2eh_62',['altcp_proxyconnect.h',['../altcp__proxyconnect_8h.html',1,'']]],
+  ['altcp_5fproxyconnect_5falloc_63',['altcp_proxyconnect_alloc',['../altcp__proxyconnect_8c.html#a371cd4386fcbc5f0a0ff6e2fa0408e68',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a371cd4386fcbc5f0a0ff6e2fa0408e68',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fclient_5fagent_64',['ALTCP_PROXYCONNECT_CLIENT_AGENT',['../altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f',1,'altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fnew_65',['altcp_proxyconnect_new',['../altcp__proxyconnect_8c.html#a389937c9441d4e3f67412603b3d1d236',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a389937c9441d4e3f67412603b3d1d236',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fnew_5ftcp_66',['altcp_proxyconnect_new_tcp',['../altcp__proxyconnect_8c.html#ab0072ee857af8a28b555f14c0f2c9183',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#ab0072ee857af8a28b555f14c0f2c9183',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5ftls_5falloc_67',['altcp_proxyconnect_tls_alloc',['../altcp__proxyconnect_8c.html#aa807e0476719f0ec41b2344d4a0df2f4',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#aa807e0476719f0ec41b2344d4a0df2f4',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5frecv_68',['altcp_recv',['../group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71',1,'altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv):&#160;altcp.c'],['../group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71',1,'altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv):&#160;altcp.c']]],
+  ['altcp_5frecved_69',['altcp_recved',['../group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83',1,'altcp_recved(struct altcp_pcb *conn, u16_t len):&#160;altcp.c'],['../group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83',1,'altcp_recved(struct altcp_pcb *conn, u16_t len):&#160;altcp.c']]],
+  ['altcp_5fsent_70',['altcp_sent',['../group__altcp.html#gab2b228c77c827fb14bfc513171c79f47',1,'altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent):&#160;altcp.c'],['../group__altcp.html#gab2b228c77c827fb14bfc513171c79f47',1,'altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent):&#160;altcp.c']]],
+  ['altcp_5fsetprio_71',['altcp_setprio',['../group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5',1,'altcp_setprio(struct altcp_pcb *conn, u8_t prio):&#160;altcp.c'],['../group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5',1,'altcp_setprio(struct altcp_pcb *conn, u8_t prio):&#160;altcp.c']]],
+  ['altcp_5fshutdown_72',['altcp_shutdown',['../group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319',1,'altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx):&#160;altcp.c'],['../group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319',1,'altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx):&#160;altcp.c']]],
+  ['altcp_5fsndbuf_73',['altcp_sndbuf',['../group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c',1,'altcp_sndbuf(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c',1,'altcp_sndbuf(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5fsndqueuelen_74',['altcp_sndqueuelen',['../group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5',1,'altcp_sndqueuelen(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5',1,'altcp_sndqueuelen(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5ftcp_2ec_75',['altcp_tcp.c',['../altcp__tcp_8c.html',1,'']]],
+  ['altcp_5ftcp_2eh_76',['altcp_tcp.h',['../altcp__tcp_8h.html',1,'']]],
+  ['altcp_5ftcp_5falloc_77',['altcp_tcp_alloc',['../altcp__tcp_8c.html#a77582c93bb8a0aa2719e86b8c8505e8a',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c'],['../altcp__tcp_8h.html#a77582c93bb8a0aa2719e86b8c8505e8a',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c']]],
+  ['altcp_5ftls_2eh_78',['altcp_tls.h',['../altcp__tls_8h.html',1,'']]],
+  ['altcp_5ftls_5falloc_79',['altcp_tls_alloc',['../group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c']]],
+  ['altcp_5ftls_5fconfig_5fserver_5fadd_5fprivkey_5fcert_80',['altcp_tls_config_server_add_privkey_cert',['../group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fconfigure_5falpn_5fprotocols_81',['altcp_tls_configure_alpn_protocols',['../group__altcp__tls.html#ga1f60b12a6a4440214b7bcf2e3ba43126',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcontext_82',['altcp_tls_context',['../group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fclient_83',['altcp_tls_create_config_client',['../group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fclient_5f2wayauth_84',['altcp_tls_create_config_client_2wayauth',['../group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fserver_85',['altcp_tls_create_config_server',['../group__altcp__tls.html#gaa37649bf24ebea235a8e3e8f50b9831f',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fserver_5fprivkey_5fcert_86',['altcp_tls_create_config_server_privkey_cert',['../group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5ffree_5fconfig_87',['altcp_tls_free_config',['../group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5ffree_5fentropy_88',['altcp_tls_free_entropy',['../group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5ffree_5fsession_89',['altcp_tls_free_session',['../group__altcp__tls.html#ga906eefcef66e9dd2b43c3392704905f5',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fget_5fsession_90',['altcp_tls_get_session',['../group__altcp__tls.html#ga827c76a0bddc4923b9a17c813e13891e',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5finit_5fsession_91',['altcp_tls_init_session',['../group__altcp__tls.html#gae6c3cf72fcd29e6ea4c74181370420c3',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fmbedtls_2ec_92',['altcp_tls_mbedtls.c',['../altcp__tls__mbedtls_8c.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fmem_2ec_93',['altcp_tls_mbedtls_mem.c',['../altcp__tls__mbedtls__mem_8c.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fmem_2eh_94',['altcp_tls_mbedtls_mem.h',['../altcp__tls__mbedtls__mem_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fopts_2eh_95',['altcp_tls_mbedtls_opts.h',['../altcp__tls__mbedtls__opts_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fstructs_2eh_96',['altcp_tls_mbedtls_structs.h',['../altcp__tls__mbedtls__structs_8h.html',1,'']]],
+  ['altcp_5ftls_5fnew_97',['altcp_tls_new',['../group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c']]],
+  ['altcp_5ftls_5fset_5fsession_98',['altcp_tls_set_session',['../group__altcp__tls.html#ga4aed4aa55d0e1b15f4118863cea06d18',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fwrap_99',['altcp_tls_wrap',['../group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c',1,'altcp_tls.h']]],
+  ['altcp_5fwrite_100',['altcp_write',['../group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d',1,'altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags):&#160;altcp.c'],['../group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d',1,'altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags):&#160;altcp.c']]],
+  ['and_20lwip_5fdbg_5ftypes_5fon_20values_101',['LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values',['../group__debugging__levels.html',1,'']]],
+  ['and_20memory_20pools_102',['Heap and memory pools',['../group__lwip__opts__mem.html',1,'']]],
+  ['and_20mpu_103',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
+  ['answer_5fname_104',['answer_name',['../structnetbios__answer.html#abf746cd54add594216ddc3683c741406',1,'netbios_answer']]],
+  ['answer_5fname_5fflags_105',['answer_name_flags',['../structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4',1,'netbios_answer']]],
+  ['answers_106',['answers',['../structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7',1,'mdns_packet::answers'],['../structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad',1,'mdns_outpacket::answers']]],
+  ['answers_5fleft_107',['answers_left',['../structmdns__packet.html#a56ba495a1458a21982e65d746468849d',1,'mdns_packet']]],
+  ['api_108',['API',['../group__if__api.html',1,'Interface Identification API'],['../group__netconn.html',1,'Netconn API'],['../group__netdbapi.html',1,'NETDB API'],['../group__netifapi.html',1,'NETIF API'],['../group__socket.html',1,'Socket API']]],
+  ['api_2eh_109',['api.h',['../api_8h.html',1,'']]],
+  ['api_5fevent_110',['API_EVENT',['../api_8h.html#a3ce590f58be8f60dbde361920863b26d',1,'api.h']]],
+  ['api_5flib_2ec_111',['api_lib.c',['../api__lib_8c.html',1,'']]],
+  ['api_5flib_5fdebug_112',['API_LIB_DEBUG',['../group__lwip__opts__debugmsg.html#ga671009550216f7dc03e67ba5751e3160',1,'opt.h']]],
+  ['api_5fmsg_113',['api_msg',['../structapi__msg.html',1,'']]],
+  ['api_5fmsg_2ec_114',['api_msg.c',['../api__msg_8c.html',1,'']]],
+  ['api_5fmsg_2eh_115',['api_msg.h',['../api__msg_8h.html',1,'']]],
+  ['api_5fmsg_5fdebug_116',['API_MSG_DEBUG',['../group__lwip__opts__debugmsg.html#ga4279d7ff9f986b2ff3eb068bb012b697',1,'opt.h']]],
+  ['apis_117',['APIs',['../group__callbackstyle__api.html',1,'&quot;raw&quot; APIs'],['../group__api.html',1,'APIs'],['../group__lwip__opts__callback.html',1,'Callback-style APIs'],['../group__sequential__api.html',1,'Sequential-style APIs'],['../group__lwip__opts__threadsafe__apis.html',1,'Thread-safe APIs']]],
+  ['application_20layered_20tcp_20functions_118',['Application layered TCP Functions',['../group__altcp.html',1,'']]],
+  ['application_20layered_20tcp_20introduction_119',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
+  ['applications_120',['Applications',['../group__apps.html',1,'']]],
+  ['arch_2eh_121',['arch.h',['../arch_8h.html',1,'']]],
+  ['arg_122',['arg',['../structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1',1,'altcp_allocator_s']]],
+  ['arguments_123',['ext arguments',['../group__tcp__raw__extargs.html',1,'']]],
+  ['arp_124',['ARP',['../group__netifapi__arp.html',1,'ARP'],['../group__lwip__opts__arp.html',1,'ARP']]],
+  ['arp_5fage_5frerequest_5fused_5funicast_125',['ARP_AGE_REREQUEST_USED_UNICAST',['../etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a',1,'etharp.c']]],
+  ['arp_5fmaxage_126',['ARP_MAXAGE',['../group__lwip__opts__arp.html#ga741a0710dc126ed3ae9e305472df3432',1,'opt.h']]],
+  ['arp_5fmaxpending_127',['ARP_MAXPENDING',['../etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9',1,'etharp.c']]],
+  ['arp_5fqueue_5flen_128',['ARP_QUEUE_LEN',['../group__lwip__opts__arp.html#ga29f41a6ebdbb23f46688d381b3609fd1',1,'opt.h']]],
+  ['arp_5fqueueing_129',['ARP_QUEUEING',['../group__lwip__opts__arp.html#ga75837814536af29b6102508588d0ab58',1,'opt.h']]],
+  ['arp_5ftable_5fsize_130',['ARP_TABLE_SIZE',['../group__lwip__opts__arp.html#ga924936a814564dbdb0bc950d255a83b9',1,'opt.h']]],
+  ['arp_5ftmr_5finterval_131',['ARP_TMR_INTERVAL',['../lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37',1,'etharp.h']]],
+  ['asn1_5ftype_132',['asn1_type',['../structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9',1,'snmp_node_instance']]],
+  ['assertion_20handling_133',['Assertion handling',['../group__lwip__assertions.html',1,'']]],
+  ['assigned_20numbers_134',['assigned numbers',['../group__iana.html',1,'IANA assigned numbers'],['../group__ieee.html',1,'IEEE assigned numbers']]],
+  ['auth_5fplain_135',['auth_plain',['../structsmtp__session.html#a561389328fb1fefcb4d4d17fd0d43301',1,'smtp_session']]],
+  ['auth_5fplain_5flen_136',['auth_plain_len',['../structsmtp__session.html#a003dfd03ac58252b575a7c965e532461',1,'smtp_session']]],
+  ['authoritative_137',['authoritative',['../structmdns__packet.html#a01f2cd644ceda020d639290fe1c3ea1c',1,'mdns_packet::authoritative'],['../structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035',1,'mdns_outpacket::authoritative']]],
+  ['authoritative_5fleft_138',['authoritative_left',['../structmdns__packet.html#ade926269f6b1de2e51ee92a703068445',1,'mdns_packet']]],
+  ['autoip_139',['AUTOIP',['../group__autoip.html',1,'AUTOIP'],['../group__netifapi__autoip.html',1,'AUTOIP'],['../group__lwip__opts__autoip.html',1,'AUTOIP']]],
+  ['autoip_140',['autoip',['../structautoip.html',1,'']]],
+  ['autoip_2ec_141',['autoip.c',['../autoip_8c.html',1,'']]],
+  ['autoip_2eh_142',['autoip.h',['../autoip_8h.html',1,'(Global Namespace)'],['../prot_2autoip_8h.html',1,'(Global Namespace)']]],
+  ['autoip_5fdebug_143',['AUTOIP_DEBUG',['../group__lwip__opts__debugmsg.html#gafaee522e7f32d81022215e1805e303a5',1,'opt.h']]],
+  ['autoip_5fnetwork_5fchanged_5flink_5fdown_144',['autoip_network_changed_link_down',['../autoip_8c.html#af93544c49f2c24b95a3981351d023056',1,'autoip_network_changed_link_down(struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#af93544c49f2c24b95a3981351d023056',1,'autoip_network_changed_link_down(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fnetwork_5fchanged_5flink_5fup_145',['autoip_network_changed_link_up',['../autoip_8c.html#af2a36aee96cbdf8f4a8f1e69c91ff425',1,'autoip_network_changed_link_up(struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#af2a36aee96cbdf8f4a8f1e69c91ff425',1,'autoip_network_changed_link_up(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fremove_5fstruct_146',['autoip_remove_struct',['../group__autoip.html#gac0c98035795500ede464aa4af2515f30',1,'autoip_remove_struct(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#gac0c98035795500ede464aa4af2515f30',1,'autoip_remove_struct(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fset_5fstruct_147',['autoip_set_struct',['../group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90',1,'autoip_set_struct(struct netif *netif, struct autoip *autoip):&#160;autoip.c'],['../group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90',1,'autoip_set_struct(struct netif *netif, struct autoip *autoip):&#160;autoip.c']]],
+  ['autoip_5fstart_148',['autoip_start',['../group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8',1,'autoip_start(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8',1,'autoip_start(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fstop_149',['autoip_stop',['../group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4',1,'autoip_stop(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4',1,'autoip_stop(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fsupplied_5faddress_150',['autoip_supplied_address',['../autoip_8c.html#a6de97b7dcd98f9039d5c1ad11c257d62',1,'autoip_supplied_address(struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#a6de97b7dcd98f9039d5c1ad11c257d62',1,'autoip_supplied_address(struct netif *netif):&#160;autoip.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_5.js b/doc/doxygen/output/html/search/all_5.js
index c2e47ad..4259b6d 100644
--- a/doc/doxygen/output/html/search/all_5.js
+++ b/doc/doxygen/output/html/search/all_5.js
@@ -2,9 +2,9 @@
 [
   ['b_0',['b',['../structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05',1,'api_msg']]],
   ['base_1',['base',['../structmemp__desc.html#a9aec58adcbcd88167247296ca4346558',1,'memp_desc']]],
-  ['bc_2',['bc',['../structapi__msg.html#a87ce87e5931c8f748293946d3b250791',1,'api_msg']]],
+  ['bc_2',['bc',['../structapi__msg.html#a8e600d95eb044f8f7dc9ff921aaa05b1',1,'api_msg']]],
   ['ble_20rfc7668_3',['6LoWPAN over BLE (RFC7668)',['../group__rfc7668if.html',1,'']]],
-  ['ble_5faddr_5fto_5feui64_4',['ble_addr_to_eui64',['../group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c',1,'ble_addr_to_eui64(uint8_t *dst, const uint8_t *src, int public_addr):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c',1,'ble_addr_to_eui64(uint8_t *dst, const uint8_t *src, int public_addr):&#160;lowpan6_ble.c']]],
+  ['ble_5faddr_5fto_5feui64_4',['ble_addr_to_eui64',['../group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f',1,'ble_addr_to_eui64(u8_t *dst, const u8_t *src, int public_addr):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f',1,'ble_addr_to_eui64(u8_t *dst, const u8_t *src, int public_addr):&#160;lowpan6_ble.c']]],
   ['body_5',['body',['../structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49',1,'smtp_session']]],
   ['body_5flen_6',['body_len',['../structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d',1,'smtp_session']]],
   ['body_5fsent_7',['body_sent',['../structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b',1,'smtp_session']]],
@@ -32,5 +32,6 @@
   ['buffers_29',['Network buffers',['../group__netbuf.html',1,'']]],
   ['buffers_20pbuf_30',['Packet buffers (PBUF)',['../group__pbuf.html',1,'']]],
   ['bugs_31',['Reporting bugs',['../bugs.html',1,'']]],
-  ['byte_5forder_32',['BYTE_ORDER',['../group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3',1,'arch.h']]]
+  ['build_20system_32',['CMake build system',['../cmake.html',1,'']]],
+  ['byte_5forder_33',['BYTE_ORDER',['../group__compiler__abstraction.html#ga1771b7fb65ee640524d0052f229768c3',1,'arch.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_6.js b/doc/doxygen/output/html/search/all_6.js
index 4fb718e..e2955f0 100644
--- a/doc/doxygen/output/html/search/all_6.js
+++ b/doc/doxygen/output/html/search/all_6.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['cache_5fflush_0',['cache_flush',['../structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195',1,'mdns_outpacket']]],
+  ['cache_5fflush_0',['cache_flush',['../structmdns__outmsg.html#ab46f1589681a1abe826e8f6c58d10f1a',1,'mdns_outmsg']]],
   ['callback_1',['callback',['../structnetconn.html#abe796060bb06e585333ca9a87862b624',1,'netconn']]],
   ['callback_20style_20apis_2',['Callback-style APIs',['../group__lwip__opts__callback.html',1,'']]],
   ['callback_5farg_3',['callback_arg',['../structsmtp__session.html#af0544df7a935a092d825d8f2380f970f',1,'smtp_session']]],
@@ -22,31 +22,34 @@
   ['chksum_5flen_5frx_19',['chksum_len_rx',['../structudp__pcb.html#a5e2833df51760c83c6032608eb5d0d4d',1,'udp_pcb']]],
   ['client_20',['client',['../group__httpc.html',1,'HTTP client'],['../group__mqtt.html',1,'MQTT client'],['../group__smtp.html',1,'SMTP client']]],
   ['client_20data_20handling_21',['Client data handling',['../group__netif__cd.html',1,'']]],
-  ['client_5fid_22',['client_id',['../structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a',1,'mqtt_connect_client_info_t']]],
-  ['client_5fpass_23',['client_pass',['../structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b',1,'mqtt_connect_client_info_t']]],
-  ['client_5fuser_24',['client_user',['../structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5',1,'mqtt_connect_client_info_t']]],
-  ['close_25',['close',['../structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65',1,'tftp_context']]],
-  ['code_26',['FDB example code',['../group__bridgeif__fdb.html',1,'']]],
-  ['codes_27',['Error codes',['../group__infrastructure__errors.html',1,'']]],
-  ['common_20functions_28',['Common functions',['../group__netconn__common.html',1,'']]],
-  ['common_20pitfalls_29',['Common pitfalls',['../pitfalls.html',1,'']]],
-  ['compiler_20platform_20abstraction_30',['Compiler/platform abstraction',['../group__compiler__abstraction.html',1,'']]],
-  ['conn_31',['conn',['../structapi__msg.html#abec5e33802d69f1b601543d60699f028',1,'api_msg::conn'],['../structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4',1,'lwip_sock::conn']]],
-  ['conn_5fstate_32',['conn_state',['../structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6',1,'mqtt_client_s']]],
-  ['connect_5farg_33',['connect_arg',['../structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a',1,'mqtt_client_s']]],
-  ['contribute_20to_20lwip_34',['How to contribute to lwIP',['../contrib.html',1,'']]],
-  ['copy_20rx_35',['Zero-copy RX',['../zerocopyrx.html',1,'']]],
-  ['core_36',['Core',['../group__snmp__core.html',1,'']]],
-  ['core_20locking_20and_20mpu_37',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
-  ['critical_20sections_38',['Critical sections',['../group__sys__prot.html',1,'']]],
-  ['current_5finput_5fnetif_39',['current_input_netif',['../structip__globals.html#a7da899c663b1d560b61d92ba6d544701',1,'ip_globals']]],
-  ['current_5fip4_5fheader_40',['current_ip4_header',['../structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4',1,'ip_globals']]],
-  ['current_5fip6_5fheader_41',['current_ip6_header',['../structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41',1,'ip_globals']]],
-  ['current_5fip_5fheader_5ftot_5flen_42',['current_ip_header_tot_len',['../structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a',1,'ip_globals']]],
-  ['current_5fiphdr_5fdest_43',['current_iphdr_dest',['../structip__globals.html#a0b4e54250c692c638408de54593d2aa1',1,'ip_globals']]],
-  ['current_5fiphdr_5fsrc_44',['current_iphdr_src',['../structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0',1,'ip_globals']]],
-  ['current_5fmsg_45',['current_msg',['../structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9',1,'netconn']]],
-  ['current_5fnetif_46',['current_netif',['../structip__globals.html#a7803dc5950d143e4433a0df689989bab',1,'ip_globals']]],
-  ['custom_5ffree_5ffunction_47',['custom_free_function',['../structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9',1,'pbuf_custom']]],
-  ['cyclic_5ftick_48',['cyclic_tick',['../structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef',1,'mqtt_client_s']]]
+  ['client_20server_22',['TFTP client/server',['../group__tftp.html',1,'']]],
+  ['client_5fid_23',['client_id',['../structmqtt__connect__client__info__t.html#ad35f7850df21f001d5c5ffaa1a18c05a',1,'mqtt_connect_client_info_t']]],
+  ['client_5fpass_24',['client_pass',['../structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b',1,'mqtt_connect_client_info_t']]],
+  ['client_5fuser_25',['client_user',['../structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5',1,'mqtt_connect_client_info_t']]],
+  ['close_26',['close',['../structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65',1,'tftp_context']]],
+  ['cmake_20build_20system_27',['CMake build system',['../cmake.html',1,'']]],
+  ['code_28',['FDB example code',['../group__bridgeif__fdb.html',1,'']]],
+  ['codes_29',['Error codes',['../group__infrastructure__errors.html',1,'']]],
+  ['common_20functions_30',['Common functions',['../group__netconn__common.html',1,'']]],
+  ['common_20pitfalls_31',['Common pitfalls',['../pitfalls.html',1,'']]],
+  ['compiler_20platform_20abstraction_32',['Compiler/platform abstraction',['../group__compiler__abstraction.html',1,'']]],
+  ['conflict_5ftime_33',['conflict_time',['../structmdns__host.html#ab1ca90b282a4a6511fa87408b946f49a',1,'mdns_host']]],
+  ['conn_34',['conn',['../structapi__msg.html#abec5e33802d69f1b601543d60699f028',1,'api_msg::conn'],['../structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4',1,'lwip_sock::conn']]],
+  ['conn_5fstate_35',['conn_state',['../structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6',1,'mqtt_client_s']]],
+  ['connect_5farg_36',['connect_arg',['../structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a',1,'mqtt_client_s']]],
+  ['contribute_20to_20lwip_37',['How to contribute to lwIP',['../contrib.html',1,'']]],
+  ['copy_20rx_38',['Zero-copy RX',['../zerocopyrx.html',1,'']]],
+  ['core_39',['Core',['../group__snmp__core.html',1,'']]],
+  ['core_20locking_20and_20mpu_40',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
+  ['critical_20sections_41',['Critical sections',['../group__sys__prot.html',1,'']]],
+  ['current_5finput_5fnetif_42',['current_input_netif',['../structip__globals.html#a7da899c663b1d560b61d92ba6d544701',1,'ip_globals']]],
+  ['current_5fip4_5fheader_43',['current_ip4_header',['../structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4',1,'ip_globals']]],
+  ['current_5fip6_5fheader_44',['current_ip6_header',['../structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41',1,'ip_globals']]],
+  ['current_5fip_5fheader_5ftot_5flen_45',['current_ip_header_tot_len',['../structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a',1,'ip_globals']]],
+  ['current_5fiphdr_5fdest_46',['current_iphdr_dest',['../structip__globals.html#a0b4e54250c692c638408de54593d2aa1',1,'ip_globals']]],
+  ['current_5fiphdr_5fsrc_47',['current_iphdr_src',['../structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0',1,'ip_globals']]],
+  ['current_5fmsg_48',['current_msg',['../structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9',1,'netconn']]],
+  ['current_5fnetif_49',['current_netif',['../structip__globals.html#a7803dc5950d143e4433a0df689989bab',1,'ip_globals']]],
+  ['custom_5ffree_5ffunction_50',['custom_free_function',['../structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9',1,'pbuf_custom']]],
+  ['cyclic_5ftick_51',['cyclic_tick',['../structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef',1,'mqtt_client_s']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_7.js b/doc/doxygen/output/html/search/all_7.js
index 61069c7..3ed18dd 100644
--- a/doc/doxygen/output/html/search/all_7.js
+++ b/doc/doxygen/output/html/search/all_7.js
@@ -15,58 +15,58 @@
   ['default_5fthread_5fprio_12',['DEFAULT_THREAD_PRIO',['../group__lwip__opts__thread.html#ga3d8715b1fdd0449d6c214e4a40108456',1,'opt.h']]],
   ['default_5fthread_5fstacksize_13',['DEFAULT_THREAD_STACKSIZE',['../group__lwip__opts__thread.html#ga7f93dfeaed4021061959f822def602cb',1,'opt.h']]],
   ['default_5fudp_5frecvmbox_5fsize_14',['DEFAULT_UDP_RECVMBOX_SIZE',['../group__lwip__opts__thread.html#ga09fe785559b3f0cf108da4440489e335',1,'opt.h']]],
-  ['deprecated_20list_15',['Deprecated List',['../deprecated.html',1,'']]],
-  ['dest_5faddr_16',['dest_addr',['../structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4',1,'mdns_outpacket']]],
-  ['destination_5faddress_17',['destination_address',['../structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33',1,'ieee_802154_hdr']]],
-  ['destination_5fpan_5fid_18',['destination_pan_id',['../structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd',1,'ieee_802154_hdr']]],
-  ['destroy_19',['destroy',['../structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b',1,'tcp_ext_arg_callbacks']]],
-  ['dhcp_20',['DHCP',['../group__lwip__opts__dhcp.html',1,'']]],
-  ['dhcp_2ec_21',['dhcp.c',['../dhcp_8c.html',1,'']]],
-  ['dhcp_2eh_22',['dhcp.h',['../dhcp_8h.html',1,'(Global Namespace)'],['../prot_2dhcp_8h.html',1,'(Global Namespace)']]],
-  ['dhcp6_2ec_23',['dhcp6.c',['../dhcp6_8c.html',1,'']]],
-  ['dhcp6_2eh_24',['dhcp6.h',['../dhcp6_8h.html',1,'(Global Namespace)'],['../prot_2dhcp6_8h.html',1,'(Global Namespace)']]],
-  ['dhcp6_5fcleanup_25',['dhcp6_cleanup',['../group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde',1,'dhcp6_cleanup(struct netif *netif):&#160;dhcp6.c'],['../group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde',1,'dhcp6_cleanup(struct netif *netif):&#160;dhcp6.c']]],
-  ['dhcp6_5fdebug_26',['DHCP6_DEBUG',['../group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1',1,'opt.h']]],
-  ['dhcp6_5fdisable_27',['dhcp6_disable',['../group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2',1,'dhcp6_disable(struct netif *netif):&#160;dhcp6.c'],['../group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2',1,'dhcp6_disable(struct netif *netif):&#160;dhcp6.c']]],
-  ['dhcp6_5fduid_5fllt_28',['DHCP6_DUID_LLT',['../prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36',1,'dhcp6.h']]],
-  ['dhcp6_5fenable_5fstateful_29',['dhcp6_enable_stateful',['../group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619',1,'dhcp6_enable_stateful(struct netif *netif):&#160;dhcp6.c'],['../group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619',1,'dhcp6_enable_stateful(struct netif *netif):&#160;dhcp6.c']]],
-  ['dhcp6_5fenable_5fstateless_30',['dhcp6_enable_stateless',['../group__dhcp6.html#gaf3349463541e673fec33843eb019b18c',1,'dhcp6_enable_stateless(struct netif *netif):&#160;dhcp6.c'],['../group__dhcp6.html#gaf3349463541e673fec33843eb019b18c',1,'dhcp6_enable_stateless(struct netif *netif):&#160;dhcp6.c']]],
-  ['dhcp6_5fmsg_31',['dhcp6_msg',['../structdhcp6__msg.html',1,'']]],
-  ['dhcp6_5fnd6_5fra_5ftrigger_32',['dhcp6_nd6_ra_trigger',['../dhcp6_8c.html#af0f47aac3c04c84a7143fa6925e9fdba',1,'dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config):&#160;dhcp6.c'],['../dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba',1,'dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config):&#160;dhcp6.c']]],
-  ['dhcp6_5foption_5fidx_33',['dhcp6_option_idx',['../dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a',1,'dhcp6.c']]],
-  ['dhcp6_5fremove_5fstruct_34',['dhcp6_remove_struct',['../dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3',1,'dhcp6.h']]],
-  ['dhcp6_5frx_5foptions_35',['dhcp6_rx_options',['../dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0',1,'dhcp6.c']]],
-  ['dhcp6_5fset_5fstruct_36',['dhcp6_set_struct',['../group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453',1,'dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6):&#160;dhcp6.c'],['../group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453',1,'dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6):&#160;dhcp6.c']]],
-  ['dhcp6_5fstatus_5fsuccess_37',['DHCP6_STATUS_SUCCESS',['../prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175',1,'dhcp6.h']]],
-  ['dhcp6_5ftimer_5fmsecs_38',['DHCP6_TIMER_MSECS',['../dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f',1,'dhcp6.h']]],
-  ['dhcp6_5ftmr_39',['dhcp6_tmr',['../dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d',1,'dhcp6_tmr(void):&#160;dhcp6.c'],['../dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d',1,'dhcp6_tmr(void):&#160;dhcp6.c']]],
-  ['dhcp_5farp_5freply_40',['dhcp_arp_reply',['../dhcp_8c.html#a1fc0a94e0b94f13c5d302018f7ecb535',1,'dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr):&#160;dhcp.c'],['../dhcp_8h.html#a1fc0a94e0b94f13c5d302018f7ecb535',1,'dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr):&#160;dhcp.c']]],
-  ['dhcp_5fcleanup_41',['dhcp_cleanup',['../group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64',1,'dhcp_cleanup(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64',1,'dhcp_cleanup(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fcoarse_5ftimer_5fmsecs_42',['DHCP_COARSE_TIMER_MSECS',['../dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6',1,'dhcp.h']]],
-  ['dhcp_5fcoarse_5ftimer_5fsecs_43',['DHCP_COARSE_TIMER_SECS',['../dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e',1,'dhcp.h']]],
-  ['dhcp_5fcoarse_5ftmr_44',['dhcp_coarse_tmr',['../dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb',1,'dhcp_coarse_tmr(void):&#160;dhcp.c'],['../dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb',1,'dhcp_coarse_tmr(void):&#160;dhcp.c']]],
-  ['dhcp_5fcreate_5frand_5fxid_45',['DHCP_CREATE_RAND_XID',['../dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835',1,'dhcp.c']]],
-  ['dhcp_5fdebug_46',['DHCP_DEBUG',['../group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee',1,'opt.h']]],
-  ['dhcp_5fdoes_5farp_5fcheck_47',['DHCP_DOES_ARP_CHECK',['../group__lwip__opts__dhcp.html#gab2d91de7b2fce879b0a213682e1b0b69',1,'opt.h']]],
-  ['dhcp_5ffine_5ftimer_5fmsecs_48',['DHCP_FINE_TIMER_MSECS',['../dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f',1,'dhcp.h']]],
-  ['dhcp_5ffine_5ftmr_49',['dhcp_fine_tmr',['../dhcp_8c.html#a601d97faa24fa7289244bb452f052045',1,'dhcp_fine_tmr(void):&#160;dhcp.c'],['../dhcp_8h.html#a601d97faa24fa7289244bb452f052045',1,'dhcp_fine_tmr(void):&#160;dhcp.c']]],
-  ['dhcp_5finform_50',['dhcp_inform',['../group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad',1,'dhcp_inform(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad',1,'dhcp_inform(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fmax_5fmsg_5flen_51',['DHCP_MAX_MSG_LEN',['../dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b',1,'dhcp.c']]],
-  ['dhcp_5fmin_5freply_5flen_52',['DHCP_MIN_REPLY_LEN',['../dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab',1,'dhcp.c']]],
-  ['dhcp_5fmsg_53',['dhcp_msg',['../structdhcp__msg.html',1,'']]],
-  ['dhcp_5fnetwork_5fchanged_54',['dhcp_network_changed',['../dhcp_8c.html#a04f3824720223c439165243527906002',1,'dhcp_network_changed(struct netif *netif):&#160;dhcp.c'],['../dhcp_8h.html#a04f3824720223c439165243527906002',1,'dhcp_network_changed(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5foption_5fidx_55',['dhcp_option_idx',['../dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0',1,'dhcp.c']]],
-  ['dhcp_5foptions_5flen_56',['DHCP_OPTIONS_LEN',['../prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06',1,'dhcp.h']]],
-  ['dhcp_5frelease_57',['dhcp_release',['../group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4',1,'dhcp_release(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4',1,'dhcp_release(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5frelease_5fand_5fstop_58',['dhcp_release_and_stop',['../group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece',1,'dhcp_release_and_stop(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece',1,'dhcp_release_and_stop(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fremove_5fstruct_59',['dhcp_remove_struct',['../dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc',1,'dhcp.h']]],
-  ['dhcp_5frenew_60',['dhcp_renew',['../group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947',1,'dhcp_renew(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947',1,'dhcp_renew(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5frx_5foptions_5fgiven_61',['dhcp_rx_options_given',['../dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc',1,'dhcp.c']]],
-  ['dhcp_5frx_5foptions_5fval_62',['dhcp_rx_options_val',['../dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f',1,'dhcp.c']]],
-  ['dhcp_5fset_5fstruct_63',['dhcp_set_struct',['../group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8',1,'dhcp_set_struct(struct netif *netif, struct dhcp *dhcp):&#160;dhcp.c'],['../group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8',1,'dhcp_set_struct(struct netif *netif, struct dhcp *dhcp):&#160;dhcp.c']]],
-  ['dhcp_5fstart_64',['dhcp_start',['../group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f',1,'dhcp_start(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f',1,'dhcp_start(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fstop_65',['dhcp_stop',['../group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312',1,'dhcp_stop(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312',1,'dhcp_stop(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fsupplied_5faddress_66',['dhcp_supplied_address',['../dhcp_8c.html#ae24a2529372218327ab9cb6592041c85',1,'dhcp_supplied_address(const struct netif *netif):&#160;dhcp.c'],['../dhcp_8h.html#ae24a2529372218327ab9cb6592041c85',1,'dhcp_supplied_address(const struct netif *netif):&#160;dhcp.c']]],
+  ['delayed_5fmsg_5fmulticast_15',['delayed_msg_multicast',['../structmdns__delayed__msg.html#a6f2ed8a51e6e249c3c72c3e31f23d20b',1,'mdns_delayed_msg']]],
+  ['delayed_5fmsg_5funicast_16',['delayed_msg_unicast',['../structmdns__delayed__msg.html#acaa15e086356be60b2a1bdd8fcc17edd',1,'mdns_delayed_msg']]],
+  ['deprecated_20list_17',['Deprecated List',['../deprecated.html',1,'']]],
+  ['dest_5faddr_18',['dest_addr',['../structmdns__outmsg.html#a187774c17294968998b6f12bb5834cd0',1,'mdns_outmsg']]],
+  ['destination_5faddress_19',['destination_address',['../structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33',1,'ieee_802154_hdr']]],
+  ['destination_5fpan_5fid_20',['destination_pan_id',['../structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd',1,'ieee_802154_hdr']]],
+  ['destroy_21',['destroy',['../structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b',1,'tcp_ext_arg_callbacks']]],
+  ['dhcp_22',['DHCP',['../group__lwip__opts__dhcp.html',1,'']]],
+  ['dhcp_2ec_23',['dhcp.c',['../dhcp_8c.html',1,'']]],
+  ['dhcp_2eh_24',['dhcp.h',['../dhcp_8h.html',1,'(Global Namespace)'],['../prot_2dhcp_8h.html',1,'(Global Namespace)']]],
+  ['dhcp6_2ec_25',['dhcp6.c',['../dhcp6_8c.html',1,'']]],
+  ['dhcp6_2eh_26',['dhcp6.h',['../dhcp6_8h.html',1,'(Global Namespace)'],['../prot_2dhcp6_8h.html',1,'(Global Namespace)']]],
+  ['dhcp6_5fcleanup_27',['dhcp6_cleanup',['../group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde',1,'dhcp6_cleanup(struct netif *netif):&#160;dhcp6.c'],['../group__dhcp6.html#gacb7042000509fb21e8d2758e235d6dde',1,'dhcp6_cleanup(struct netif *netif):&#160;dhcp6.c']]],
+  ['dhcp6_5fdebug_28',['DHCP6_DEBUG',['../group__lwip__opts__debugmsg.html#gacfc11be8b3bf6bb55e3e5c39ea8802d1',1,'opt.h']]],
+  ['dhcp6_5fdisable_29',['dhcp6_disable',['../group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2',1,'dhcp6_disable(struct netif *netif):&#160;dhcp6.c'],['../group__dhcp6.html#gadd0c783a85a410f75b37a3d922ad60d2',1,'dhcp6_disable(struct netif *netif):&#160;dhcp6.c']]],
+  ['dhcp6_5fduid_5fllt_30',['DHCP6_DUID_LLT',['../prot_2dhcp6_8h.html#afe33f98cb94e0f18892a41502cf54e36',1,'dhcp6.h']]],
+  ['dhcp6_5fenable_5fstateful_31',['dhcp6_enable_stateful',['../group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619',1,'dhcp6_enable_stateful(struct netif *netif):&#160;dhcp6.c'],['../group__dhcp6.html#gaa9e972fcd1d648ca5f02334b1591b619',1,'dhcp6_enable_stateful(struct netif *netif):&#160;dhcp6.c']]],
+  ['dhcp6_5fenable_5fstateless_32',['dhcp6_enable_stateless',['../group__dhcp6.html#gaf3349463541e673fec33843eb019b18c',1,'dhcp6_enable_stateless(struct netif *netif):&#160;dhcp6.c'],['../group__dhcp6.html#gaf3349463541e673fec33843eb019b18c',1,'dhcp6_enable_stateless(struct netif *netif):&#160;dhcp6.c']]],
+  ['dhcp6_5fmsg_33',['dhcp6_msg',['../structdhcp6__msg.html',1,'']]],
+  ['dhcp6_5fnd6_5fra_5ftrigger_34',['dhcp6_nd6_ra_trigger',['../dhcp6_8c.html#af0f47aac3c04c84a7143fa6925e9fdba',1,'dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config):&#160;dhcp6.c'],['../dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba',1,'dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config):&#160;dhcp6.c']]],
+  ['dhcp6_5foption_5fidx_35',['dhcp6_option_idx',['../dhcp6_8c.html#ac4c519a2e10067f277d6b09e60919e9a',1,'dhcp6.c']]],
+  ['dhcp6_5fremove_5fstruct_36',['dhcp6_remove_struct',['../dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3',1,'dhcp6.h']]],
+  ['dhcp6_5frx_5foptions_37',['dhcp6_rx_options',['../dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0',1,'dhcp6.c']]],
+  ['dhcp6_5fset_5fstruct_38',['dhcp6_set_struct',['../group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453',1,'dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6):&#160;dhcp6.c'],['../group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453',1,'dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6):&#160;dhcp6.c']]],
+  ['dhcp6_5fstatus_5fsuccess_39',['DHCP6_STATUS_SUCCESS',['../prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175',1,'dhcp6.h']]],
+  ['dhcp6_5ftimer_5fmsecs_40',['DHCP6_TIMER_MSECS',['../dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f',1,'dhcp6.h']]],
+  ['dhcp6_5ftmr_41',['dhcp6_tmr',['../dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d',1,'dhcp6_tmr(void):&#160;dhcp6.c'],['../dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d',1,'dhcp6_tmr(void):&#160;dhcp6.c']]],
+  ['dhcp_5fadd_5fextra_5frequest_5foptions_42',['DHCP_ADD_EXTRA_REQUEST_OPTIONS',['../dhcp_8c.html#aa29d020558b37b29d5d5ae50dfeb0c88',1,'dhcp.c']]],
+  ['dhcp_5fcleanup_43',['dhcp_cleanup',['../group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64',1,'dhcp_cleanup(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64',1,'dhcp_cleanup(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fcoarse_5ftimer_5fmsecs_44',['DHCP_COARSE_TIMER_MSECS',['../dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6',1,'dhcp.h']]],
+  ['dhcp_5fcoarse_5ftimer_5fsecs_45',['DHCP_COARSE_TIMER_SECS',['../dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e',1,'dhcp.h']]],
+  ['dhcp_5fcoarse_5ftmr_46',['dhcp_coarse_tmr',['../dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb',1,'dhcp_coarse_tmr(void):&#160;dhcp.c'],['../dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb',1,'dhcp_coarse_tmr(void):&#160;dhcp.c']]],
+  ['dhcp_5fcreate_5frand_5fxid_47',['DHCP_CREATE_RAND_XID',['../dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835',1,'dhcp.c']]],
+  ['dhcp_5fdebug_48',['DHCP_DEBUG',['../group__lwip__opts__debugmsg.html#ga97927ceecabcdb5f41735bf372a05cee',1,'opt.h']]],
+  ['dhcp_5ffine_5ftimer_5fmsecs_49',['DHCP_FINE_TIMER_MSECS',['../dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f',1,'dhcp.h']]],
+  ['dhcp_5ffine_5ftmr_50',['dhcp_fine_tmr',['../dhcp_8c.html#a601d97faa24fa7289244bb452f052045',1,'dhcp_fine_tmr(void):&#160;dhcp.c'],['../dhcp_8h.html#a601d97faa24fa7289244bb452f052045',1,'dhcp_fine_tmr(void):&#160;dhcp.c']]],
+  ['dhcp_5finform_51',['dhcp_inform',['../group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad',1,'dhcp_inform(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad',1,'dhcp_inform(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fmax_5fmsg_5flen_52',['DHCP_MAX_MSG_LEN',['../dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b',1,'dhcp.c']]],
+  ['dhcp_5fmin_5freply_5flen_53',['DHCP_MIN_REPLY_LEN',['../dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab',1,'dhcp.c']]],
+  ['dhcp_5fmsg_54',['dhcp_msg',['../structdhcp__msg.html',1,'']]],
+  ['dhcp_5fnetwork_5fchanged_5flink_5fup_55',['dhcp_network_changed_link_up',['../dhcp_8c.html#a2fd33722859054ea932ff05ff62dedaa',1,'dhcp_network_changed_link_up(struct netif *netif):&#160;dhcp.c'],['../dhcp_8h.html#a2fd33722859054ea932ff05ff62dedaa',1,'dhcp_network_changed_link_up(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5foption_5fidx_56',['dhcp_option_idx',['../dhcp_8c.html#a8c3b584d223b995b48613ad96cb776a0',1,'dhcp.c']]],
+  ['dhcp_5foptions_5flen_57',['DHCP_OPTIONS_LEN',['../prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06',1,'dhcp.h']]],
+  ['dhcp_5frelease_58',['dhcp_release',['../group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4',1,'dhcp_release(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4',1,'dhcp_release(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5frelease_5fand_5fstop_59',['dhcp_release_and_stop',['../group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece',1,'dhcp_release_and_stop(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece',1,'dhcp_release_and_stop(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fremove_5fstruct_60',['dhcp_remove_struct',['../dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc',1,'dhcp.h']]],
+  ['dhcp_5frenew_61',['dhcp_renew',['../group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947',1,'dhcp_renew(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947',1,'dhcp_renew(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fset_5fstruct_62',['dhcp_set_struct',['../group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8',1,'dhcp_set_struct(struct netif *netif, struct dhcp *dhcp):&#160;dhcp.c'],['../group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8',1,'dhcp_set_struct(struct netif *netif, struct dhcp *dhcp):&#160;dhcp.c']]],
+  ['dhcp_5fstart_63',['dhcp_start',['../group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f',1,'dhcp_start(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f',1,'dhcp_start(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fstop_64',['dhcp_stop',['../group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312',1,'dhcp_stop(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312',1,'dhcp_stop(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fsupplied_5faddress_65',['dhcp_supplied_address',['../dhcp_8c.html#ae24a2529372218327ab9cb6592041c85',1,'dhcp_supplied_address(const struct netif *netif):&#160;dhcp.c'],['../dhcp_8h.html#ae24a2529372218327ab9cb6592041c85',1,'dhcp_supplied_address(const struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5ftimeout_5ft_66',['dhcp_timeout_t',['../dhcp_8h.html#aa85d661c7e160921c0497e7baa892b67',1,'dhcp.h']]],
   ['dhcpv4_67',['DHCPv4',['../group__dhcp4.html',1,'DHCPv4'],['../group__netifapi__dhcp4.html',1,'DHCPv4']]],
   ['dhcpv6_68',['DHCPv6',['../group__dhcp6.html',1,'DHCPv6'],['../group__lwip__opts__dhcpv6.html',1,'DHCPv6']]],
   ['discovery_69',['discovery',['../group__lwip__opts__mld6.html',1,'Multicast listener discovery'],['../group__lwip__opts__nd6.html',1,'Neighbor discovery']]],
@@ -101,6 +101,5 @@
   ['dns_5ftable_5fsize_98',['DNS_TABLE_SIZE',['../group__lwip__opts__dns.html#ga2384e76c1acdf969d883f3de08d340f7',1,'opt.h']]],
   ['dns_5ftmr_99',['dns_tmr',['../dns_8c.html#a9389f374ec66488aa4f42a652583f533',1,'dns_tmr(void):&#160;dns.c'],['../dns_8h.html#a9389f374ec66488aa4f42a652583f533',1,'dns_tmr(void):&#160;dns.c']]],
   ['dns_5ftmr_5finterval_100',['DNS_TMR_INTERVAL',['../dns_8h.html#a464a7435c4c00735af59033d2acd83bb',1,'dns.h']]],
-  ['dns_5fttl_101',['dns_ttl',['../structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14',1,'mdns_service::dns_ttl'],['../structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b',1,'mdns_host::dns_ttl']]],
-  ['domain_5foffsets_102',['domain_offsets',['../structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f',1,'mdns_outpacket']]]
+  ['domain_5foffsets_101',['domain_offsets',['../structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f',1,'mdns_outpacket']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_8.js b/doc/doxygen/output/html/search/all_8.js
index 855895a..995615d 100644
--- a/doc/doxygen/output/html/search/all_8.js
+++ b/doc/doxygen/output/html/search/all_8.js
@@ -27,60 +27,63 @@
   ['err_5fwouldblock_24',['ERR_WOULDBLOCK',['../group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcab9dcf89d46668b072192278fb907b7ad',1,'err.h']]],
   ['errevent_25',['errevent',['../structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e',1,'lwip_sock']]],
   ['errno_2eh_26',['errno.h',['../compat_2stdc_2errno_8h.html',1,'(Global Namespace)'],['../lwip_2errno_8h.html',1,'(Global Namespace)']]],
-  ['error_20codes_27',['Error codes',['../group__infrastructure__errors.html',1,'']]],
-  ['eth_5faddr_28',['ETH_ADDR',['../lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee',1,'ethernet.h']]],
-  ['eth_5faddr_29',['eth_addr',['../structeth__addr.html',1,'']]],
-  ['eth_5fhdr_30',['eth_hdr',['../structeth__hdr.html',1,'']]],
-  ['eth_5fpad_5fsize_31',['ETH_PAD_SIZE',['../group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276',1,'opt.h']]],
-  ['eth_5fvlan_5fhdr_32',['eth_vlan_hdr',['../structeth__vlan__hdr.html',1,'']]],
-  ['ethaddr_33',['ethaddr',['../structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc',1,'bridgeif_initdata_s']]],
-  ['etharp_34',['etharp',['../structstats__.html#aa52547cb08dc828927494dc485bb69f3',1,'stats_']]],
-  ['etharp_2ec_35',['etharp.c',['../etharp_8c.html',1,'']]],
-  ['etharp_2eh_36',['etharp.h',['../lwip_2etharp_8h.html',1,'(Global Namespace)'],['../lwip_2prot_2etharp_8h.html',1,'(Global Namespace)']]],
-  ['etharp_5fcleanup_5fnetif_37',['etharp_cleanup_netif',['../etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05',1,'etharp_cleanup_netif(struct netif *netif):&#160;etharp.c'],['../lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05',1,'etharp_cleanup_netif(struct netif *netif):&#160;etharp.c']]],
-  ['etharp_5fdebug_38',['ETHARP_DEBUG',['../group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e',1,'opt.h']]],
-  ['etharp_5ffind_5faddr_39',['etharp_find_addr',['../etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c',1,'etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr **eth_ret, const ip4_addr_t **ip_ret):&#160;etharp.c'],['../lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c',1,'etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr **eth_ret, const ip4_addr_t **ip_ret):&#160;etharp.c']]],
-  ['etharp_5fflag_5ftry_5fhard_40',['ETHARP_FLAG_TRY_HARD',['../etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9',1,'etharp.c']]],
-  ['etharp_5fget_5fentry_41',['etharp_get_entry',['../etharp_8c.html#ab93df7ccb26496100d45137541e863c8',1,'etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret):&#160;etharp.c'],['../lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8',1,'etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret):&#160;etharp.c']]],
-  ['etharp_5fgratuitous_42',['etharp_gratuitous',['../lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e',1,'etharp.h']]],
-  ['etharp_5fhdr_43',['etharp_hdr',['../structetharp__hdr.html',1,'']]],
-  ['etharp_5finput_44',['etharp_input',['../etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6',1,'etharp_input(struct pbuf *p, struct netif *netif):&#160;etharp.c'],['../lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6',1,'etharp_input(struct pbuf *p, struct netif *netif):&#160;etharp.c']]],
-  ['etharp_5foutput_45',['etharp_output',['../etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d',1,'etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d',1,'etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
-  ['etharp_5fq_5fentry_46',['etharp_q_entry',['../structetharp__q__entry.html',1,'']]],
-  ['etharp_5fquery_47',['etharp_query',['../etharp_8c.html#ae180772e31346a0afeb707ad172dd19c',1,'etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q):&#160;etharp.c'],['../lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c',1,'etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q):&#160;etharp.c']]],
-  ['etharp_5frequest_48',['etharp_request',['../etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15',1,'etharp_request(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15',1,'etharp_request(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
-  ['etharp_5fstate_49',['etharp_state',['../etharp_8c.html#ae95dee9363e6d3417298e07380b2d383',1,'etharp.c']]],
-  ['etharp_5fstats_50',['ETHARP_STATS',['../group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275',1,'opt.h']]],
-  ['etharp_5fsupport_5fstatic_5fentries_51',['ETHARP_SUPPORT_STATIC_ENTRIES',['../group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7',1,'opt.h']]],
-  ['etharp_5fsupport_5fvlan_52',['ETHARP_SUPPORT_VLAN',['../group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90',1,'opt.h']]],
-  ['etharp_5ftable_5fmatch_5fnetif_53',['ETHARP_TABLE_MATCH_NETIF',['../group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084',1,'opt.h']]],
-  ['etharp_5ftmr_54',['etharp_tmr',['../etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26',1,'etharp_tmr(void):&#160;etharp.c'],['../lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26',1,'etharp_tmr(void):&#160;etharp.c']]],
-  ['ethernet_55',['Ethernet',['../group__ethernet.html',1,'']]],
-  ['ethernet_2ec_56',['ethernet.c',['../ethernet_8c.html',1,'']]],
-  ['ethernet_2eh_57',['ethernet.h',['../lwip_2prot_2ethernet_8h.html',1,'(Global Namespace)'],['../netif_2ethernet_8h.html',1,'(Global Namespace)']]],
-  ['ethernet_5finput_58',['ethernet_input',['../group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff',1,'ethernet_input(struct pbuf *p, struct netif *netif):&#160;ethernet.c'],['../group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff',1,'ethernet_input(struct pbuf *p, struct netif *netif):&#160;ethernet.c']]],
-  ['ethernet_5foutput_59',['ethernet_output',['../group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778',1,'ethernet_output(struct netif *netif, struct pbuf *p, const struct eth_addr *src, const struct eth_addr *dst, u16_t eth_type):&#160;ethernet.c'],['../group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778',1,'ethernet_output(struct netif *netif, struct pbuf *p, const struct eth_addr *src, const struct eth_addr *dst, u16_t eth_type):&#160;ethernet.c']]],
-  ['ethip6_2ec_60',['ethip6.c',['../ethip6_8c.html',1,'']]],
-  ['ethip6_2eh_61',['ethip6.h',['../ethip6_8h.html',1,'']]],
-  ['ethip6_5foutput_62',['ethip6_output',['../ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd',1,'ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;ethip6.c'],['../ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd',1,'ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;ethip6.c']]],
-  ['ethtype_5farp_63',['ETHTYPE_ARP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5',1,'ieee.h']]],
-  ['ethtype_5fethercat_64',['ETHTYPE_ETHERCAT',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c',1,'ieee.h']]],
-  ['ethtype_5fip_65',['ETHTYPE_IP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79',1,'ieee.h']]],
-  ['ethtype_5fipv6_66',['ETHTYPE_IPV6',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383',1,'ieee.h']]],
-  ['ethtype_5fjumbo_67',['ETHTYPE_JUMBO',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1',1,'ieee.h']]],
-  ['ethtype_5flldp_68',['ETHTYPE_LLDP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc',1,'ieee.h']]],
-  ['ethtype_5fmrp_69',['ETHTYPE_MRP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e',1,'ieee.h']]],
-  ['ethtype_5fpppoe_70',['ETHTYPE_PPPOE',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c',1,'ieee.h']]],
-  ['ethtype_5fpppoedisc_71',['ETHTYPE_PPPOEDISC',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569',1,'ieee.h']]],
-  ['ethtype_5fprofinet_72',['ETHTYPE_PROFINET',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d',1,'ieee.h']]],
-  ['ethtype_5fptp_73',['ETHTYPE_PTP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc',1,'ieee.h']]],
-  ['ethtype_5fqinq_74',['ETHTYPE_QINQ',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394',1,'ieee.h']]],
-  ['ethtype_5frarp_75',['ETHTYPE_RARP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f',1,'ieee.h']]],
-  ['ethtype_5fsercos_76',['ETHTYPE_SERCOS',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14',1,'ieee.h']]],
-  ['ethtype_5fvlan_77',['ETHTYPE_VLAN',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903',1,'ieee.h']]],
-  ['ethtype_5fwol_78',['ETHTYPE_WOL',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b',1,'ieee.h']]],
-  ['eui64_5fto_5fble_5faddr_79',['eui64_to_ble_addr',['../group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d',1,'eui64_to_ble_addr(uint8_t *dst, const uint8_t *src):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d',1,'eui64_to_ble_addr(uint8_t *dst, const uint8_t *src):&#160;lowpan6_ble.c']]],
-  ['example_20code_80',['FDB example code',['../group__bridgeif__fdb.html',1,'']]],
-  ['exceptset_81',['exceptset',['../structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed',1,'lwip_select_cb']]],
-  ['ext_20arguments_82',['ext arguments',['../group__tcp__raw__extargs.html',1,'']]]
+  ['error_27',['error',['../structtftp__context.html#a39cbb84a9c0eaa8ea62d183ba8214519',1,'tftp_context']]],
+  ['error_20codes_28',['Error codes',['../group__infrastructure__errors.html',1,'']]],
+  ['eth_5faddr_29',['ETH_ADDR',['../lwip_2prot_2ethernet_8h.html#a19c72ce98569e0fb55948a7587d704ee',1,'ethernet.h']]],
+  ['eth_5faddr_30',['eth_addr',['../structeth__addr.html',1,'']]],
+  ['eth_5fhdr_31',['eth_hdr',['../structeth__hdr.html',1,'']]],
+  ['eth_5fpad_5fsize_32',['ETH_PAD_SIZE',['../group__lwip__opts__arp.html#gad7fa3b356ca7e603e848b069c4cc6276',1,'opt.h']]],
+  ['eth_5fvlan_5fhdr_33',['eth_vlan_hdr',['../structeth__vlan__hdr.html',1,'']]],
+  ['ethaddr_34',['ethaddr',['../structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc',1,'bridgeif_initdata_s']]],
+  ['etharp_35',['etharp',['../structstats__.html#aa52547cb08dc828927494dc485bb69f3',1,'stats_']]],
+  ['etharp_2ec_36',['etharp.c',['../etharp_8c.html',1,'']]],
+  ['etharp_2eh_37',['etharp.h',['../lwip_2etharp_8h.html',1,'(Global Namespace)'],['../lwip_2prot_2etharp_8h.html',1,'(Global Namespace)']]],
+  ['etharp_5facd_5fannounce_38',['etharp_acd_announce',['../etharp_8c.html#a7c41ba8b145fa4d06f8d6af3df44c4ff',1,'etharp_acd_announce(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a7c41ba8b145fa4d06f8d6af3df44c4ff',1,'etharp_acd_announce(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
+  ['etharp_5facd_5fprobe_39',['etharp_acd_probe',['../etharp_8c.html#aac7d5048a81ef1c63b18d769700f4899',1,'etharp_acd_probe(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#aac7d5048a81ef1c63b18d769700f4899',1,'etharp_acd_probe(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
+  ['etharp_5fcleanup_5fnetif_40',['etharp_cleanup_netif',['../etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05',1,'etharp_cleanup_netif(struct netif *netif):&#160;etharp.c'],['../lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05',1,'etharp_cleanup_netif(struct netif *netif):&#160;etharp.c']]],
+  ['etharp_5fdebug_41',['ETHARP_DEBUG',['../group__lwip__opts__debugmsg.html#gabff5d1e0b334f5b45bd2b8bbb675411e',1,'opt.h']]],
+  ['etharp_5ffind_5faddr_42',['etharp_find_addr',['../etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c',1,'etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr **eth_ret, const ip4_addr_t **ip_ret):&#160;etharp.c'],['../lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c',1,'etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr **eth_ret, const ip4_addr_t **ip_ret):&#160;etharp.c']]],
+  ['etharp_5fflag_5ftry_5fhard_43',['ETHARP_FLAG_TRY_HARD',['../etharp_8c.html#a96f8787ca623e704da1d32ca7dd6d6d9',1,'etharp.c']]],
+  ['etharp_5fget_5fentry_44',['etharp_get_entry',['../etharp_8c.html#ab93df7ccb26496100d45137541e863c8',1,'etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret):&#160;etharp.c'],['../lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8',1,'etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret):&#160;etharp.c']]],
+  ['etharp_5fgratuitous_45',['etharp_gratuitous',['../lwip_2etharp_8h.html#a83947dea159baf3420922084072e631e',1,'etharp.h']]],
+  ['etharp_5fhdr_46',['etharp_hdr',['../structetharp__hdr.html',1,'']]],
+  ['etharp_5finput_47',['etharp_input',['../etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6',1,'etharp_input(struct pbuf *p, struct netif *netif):&#160;etharp.c'],['../lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6',1,'etharp_input(struct pbuf *p, struct netif *netif):&#160;etharp.c']]],
+  ['etharp_5foutput_48',['etharp_output',['../etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d',1,'etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d',1,'etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
+  ['etharp_5fq_5fentry_49',['etharp_q_entry',['../structetharp__q__entry.html',1,'']]],
+  ['etharp_5fquery_50',['etharp_query',['../etharp_8c.html#ae180772e31346a0afeb707ad172dd19c',1,'etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q):&#160;etharp.c'],['../lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c',1,'etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q):&#160;etharp.c']]],
+  ['etharp_5frequest_51',['etharp_request',['../etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15',1,'etharp_request(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15',1,'etharp_request(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
+  ['etharp_5fstate_52',['etharp_state',['../etharp_8c.html#ae95dee9363e6d3417298e07380b2d383',1,'etharp.c']]],
+  ['etharp_5fstats_53',['ETHARP_STATS',['../group__lwip__opts__stats.html#ga3a8359abf4fff8ffdc449e5007f93275',1,'opt.h']]],
+  ['etharp_5fsupport_5fstatic_5fentries_54',['ETHARP_SUPPORT_STATIC_ENTRIES',['../group__lwip__opts__arp.html#ga4675829464156f3d665f4de171c212d7',1,'opt.h']]],
+  ['etharp_5fsupport_5fvlan_55',['ETHARP_SUPPORT_VLAN',['../group__lwip__opts__arp.html#ga70ce0ecf56cf5fab000134e66d863f90',1,'opt.h']]],
+  ['etharp_5ftable_5fmatch_5fnetif_56',['ETHARP_TABLE_MATCH_NETIF',['../group__lwip__opts__arp.html#ga2f762eee309a545650f80fc8dcc19084',1,'opt.h']]],
+  ['etharp_5ftmr_57',['etharp_tmr',['../etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26',1,'etharp_tmr(void):&#160;etharp.c'],['../lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26',1,'etharp_tmr(void):&#160;etharp.c']]],
+  ['ethernet_58',['Ethernet',['../group__ethernet.html',1,'']]],
+  ['ethernet_2ec_59',['ethernet.c',['../ethernet_8c.html',1,'']]],
+  ['ethernet_2eh_60',['ethernet.h',['../lwip_2prot_2ethernet_8h.html',1,'(Global Namespace)'],['../netif_2ethernet_8h.html',1,'(Global Namespace)']]],
+  ['ethernet_5finput_61',['ethernet_input',['../group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff',1,'ethernet_input(struct pbuf *p, struct netif *netif):&#160;ethernet.c'],['../group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff',1,'ethernet_input(struct pbuf *p, struct netif *netif):&#160;ethernet.c']]],
+  ['ethernet_5foutput_62',['ethernet_output',['../group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778',1,'ethernet_output(struct netif *netif, struct pbuf *p, const struct eth_addr *src, const struct eth_addr *dst, u16_t eth_type):&#160;ethernet.c'],['../group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778',1,'ethernet_output(struct netif *netif, struct pbuf *p, const struct eth_addr *src, const struct eth_addr *dst, u16_t eth_type):&#160;ethernet.c']]],
+  ['ethip6_2ec_63',['ethip6.c',['../ethip6_8c.html',1,'']]],
+  ['ethip6_2eh_64',['ethip6.h',['../ethip6_8h.html',1,'']]],
+  ['ethip6_5foutput_65',['ethip6_output',['../ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd',1,'ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;ethip6.c'],['../ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd',1,'ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;ethip6.c']]],
+  ['ethtype_5farp_66',['ETHTYPE_ARP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a41217db03576ea59c44b28b248c39be5',1,'ieee.h']]],
+  ['ethtype_5fethercat_67',['ETHTYPE_ETHERCAT',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a5085a5fd5f9c9506124e93ea43ad2d7c',1,'ieee.h']]],
+  ['ethtype_5fip_68',['ETHTYPE_IP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ac95756b20fde70b868ef4185dd221c79',1,'ieee.h']]],
+  ['ethtype_5fipv6_69',['ETHTYPE_IPV6',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aab26004eed559217be5dd466a79b1383',1,'ieee.h']]],
+  ['ethtype_5fjumbo_70',['ETHTYPE_JUMBO',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a2511e8a31961bd742363b11b274b9dd1',1,'ieee.h']]],
+  ['ethtype_5flldp_71',['ETHTYPE_LLDP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a02eab0dd87f222a2d555ca38b1b8afcc',1,'ieee.h']]],
+  ['ethtype_5fmrp_72',['ETHTYPE_MRP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad36caec44d8db59ff433a8bd3e92ad3e',1,'ieee.h']]],
+  ['ethtype_5fpppoe_73',['ETHTYPE_PPPOE',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a8c0e8f68b90134eb4f1f17d3d2eb6f8c',1,'ieee.h']]],
+  ['ethtype_5fpppoedisc_74',['ETHTYPE_PPPOEDISC',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a58c6f40d7cc3edb9455762938f3f6569',1,'ieee.h']]],
+  ['ethtype_5fprofinet_75',['ETHTYPE_PROFINET',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a889eb8f716238d16ee3408f16a5cf19d',1,'ieee.h']]],
+  ['ethtype_5fptp_76',['ETHTYPE_PTP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4aa3e9e834eef932d073028e28eb8793dc',1,'ieee.h']]],
+  ['ethtype_5fqinq_77',['ETHTYPE_QINQ',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a39a18006412cbb57536535bd9d378394',1,'ieee.h']]],
+  ['ethtype_5frarp_78',['ETHTYPE_RARP',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a14292184cb41b279249319896d0e2b1f',1,'ieee.h']]],
+  ['ethtype_5fsercos_79',['ETHTYPE_SERCOS',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ab93419f8edf5692e91629ab92fce8a14',1,'ieee.h']]],
+  ['ethtype_5fvlan_80',['ETHTYPE_VLAN',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4ad8f84826d52d92ac24a477d1f03e7903',1,'ieee.h']]],
+  ['ethtype_5fwol_81',['ETHTYPE_WOL',['../group__ieee.html#ggab3a7b97666b100584972d158acbbd1f4a530a30feb9b87fd993da2bf83776cf9b',1,'ieee.h']]],
+  ['eui64_5fto_5fble_5faddr_82',['eui64_to_ble_addr',['../group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4',1,'eui64_to_ble_addr(u8_t *dst, const u8_t *src):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4',1,'eui64_to_ble_addr(u8_t *dst, const u8_t *src):&#160;lowpan6_ble.c']]],
+  ['example_20code_83',['FDB example code',['../group__bridgeif__fdb.html',1,'']]],
+  ['exceptset_84',['exceptset',['../structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed',1,'lwip_select_cb']]],
+  ['ext_20arguments_85',['ext arguments',['../group__tcp__raw__extargs.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_9.js b/doc/doxygen/output/html/search/all_9.js
index 9fd40b0..22c7fca 100644
--- a/doc/doxygen/output/html/search/all_9.js
+++ b/doc/doxygen/output/html/search/all_9.js
@@ -2,7 +2,7 @@
 [
   ['fdb_20example_20code_0',['FDB example code',['../group__bridgeif__fdb.html',1,'']]],
   ['flags_1',['Flags',['../group__netif__flags.html',1,'']]],
-  ['flags_2',['flags',['../structnetconn.html#a96cb9a3830248699bd07a1a447e5630c',1,'netconn::flags'],['../structnetif.html#a1c171db6097bbb6f09f63549a66e00ea',1,'netif::flags'],['../structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a',1,'pbuf::flags']]],
+  ['flags_2',['flags',['../structnetconn.html#a96cb9a3830248699bd07a1a447e5630c',1,'netconn::flags'],['../structmdns__outmsg.html#a8118f6c263f6f8727552620deac2b7c2',1,'mdns_outmsg::flags'],['../structnetif.html#a1c171db6097bbb6f09f63549a66e00ea',1,'netif::flags'],['../structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a',1,'pbuf::flags']]],
   ['fold_5fu32t_3',['FOLD_U32T',['../inet__chksum_8h.html#a6ffe83b4bdd1784a0671ee4778966a01',1,'inet_chksum.h']]],
   ['frame_5fcontrol_4',['frame_control',['../structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10',1,'ieee_802154_hdr']]],
   ['from_5',['from',['../structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee',1,'smtp_session']]],
diff --git a/doc/doxygen/output/html/search/all_a.js b/doc/doxygen/output/html/search/all_a.js
index 09c5503..f3011e6 100644
--- a/doc/doxygen/output/html/search/all_a.js
+++ b/doc/doxygen/output/html/search/all_a.js
@@ -1,7 +1,8 @@
 var searchData=
 [
-  ['get_5fvalue_0',['get_value',['../structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649',1,'snmp_node_instance::get_value'],['../structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272',1,'snmp_table_node::get_value']]],
-  ['gethostbyname_5fr_5fhelper_1',['gethostbyname_r_helper',['../structgethostbyname__r__helper.html',1,'']]],
-  ['group_5faddress_2',['group_address',['../structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854',1,'igmp_group::group_address'],['../structmld__group.html#a781abf78d835627ded1202166b44b88e',1,'mld_group::group_address']]],
-  ['group_5fstate_3',['group_state',['../structigmp__group.html#add0d24f719ad4b598abad254689ad911',1,'igmp_group::group_state'],['../structmld__group.html#ae9cfd3f126257aa3aff4a24e05c04059',1,'mld_group::group_state']]]
+  ['get_5fmdns_5fpcb_0',['get_mdns_pcb',['../mdns_8c.html#aa31b798a5fb96b6ef0dde5d4f32371af',1,'get_mdns_pcb(void):&#160;mdns.c'],['../mdns__priv_8h.html#aa31b798a5fb96b6ef0dde5d4f32371af',1,'get_mdns_pcb(void):&#160;mdns.c']]],
+  ['get_5fvalue_1',['get_value',['../structsnmp__node__instance.html#a17aa954aa34672f4a399bf0d91c0a649',1,'snmp_node_instance::get_value'],['../structsnmp__table__node.html#ac65c57e29faa456a9a710185109fe272',1,'snmp_table_node::get_value']]],
+  ['gethostbyname_5fr_5fhelper_2',['gethostbyname_r_helper',['../structgethostbyname__r__helper.html',1,'']]],
+  ['group_5faddress_3',['group_address',['../structigmp__group.html#ae26e6041f865880bf46cd21b6f9af854',1,'igmp_group::group_address'],['../structmld__group.html#a781abf78d835627ded1202166b44b88e',1,'mld_group::group_address']]],
+  ['group_5fstate_4',['group_state',['../structigmp__group.html#add0d24f719ad4b598abad254689ad911',1,'igmp_group::group_state'],['../structmld__group.html#ae9cfd3f126257aa3aff4a24e05c04059',1,'mld_group::group_state']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_b.js b/doc/doxygen/output/html/search/all_b.js
index 9d6a32a..c91511b 100644
--- a/doc/doxygen/output/html/search/all_b.js
+++ b/doc/doxygen/output/html/search/all_b.js
@@ -6,57 +6,56 @@
   ['heap_20and_20memory_20pools_3',['Heap and memory pools',['../group__lwip__opts__mem.html',1,'']]],
   ['hints_4',['Optimization hints',['../optimization.html',1,'']]],
   ['hooks_5',['Hooks',['../group__lwip__opts__hooks.html',1,'']]],
-  ['hostent_5fstorage_6',['HOSTENT_STORAGE',['../netdb_8c.html#acfc1e988534c0e497599b904739f92fe',1,'netdb.c']]],
-  ['how_20to_20contribute_20to_20lwip_7',['How to contribute to lwIP',['../contrib.html',1,'']]],
-  ['http_20client_8',['HTTP client',['../group__httpc.html',1,'']]],
-  ['http_20server_9',['HTTP server',['../group__httpd.html',1,'']]],
-  ['http_5fclient_2ec_10',['http_client.c',['../http__client_8c.html',1,'']]],
-  ['http_5fclient_2eh_11',['http_client.h',['../http__client_8h.html',1,'']]],
-  ['http_5fdefault_5fport_12',['HTTP_DEFAULT_PORT',['../group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2',1,'http_client.h']]],
-  ['http_5fis_5fdata_5fvolatile_13',['HTTP_IS_DATA_VOLATILE',['../httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300',1,'httpd.c']]],
-  ['http_5fis_5fhdr_5fvolatile_14',['HTTP_IS_HDR_VOLATILE',['../httpd_8c.html#af281bc4a762d56243e0b85dd4197174a',1,'httpd.c']]],
-  ['http_5fis_5ftag_5fvolatile_15',['HTTP_IS_TAG_VOLATILE',['../group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048',1,'httpd_opts.h']]],
-  ['http_5fset_5fcgi_5fhandlers_16',['http_set_cgi_handlers',['../group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897',1,'http_set_cgi_handlers(const tCGI *cgis, int num_handlers):&#160;httpd.c'],['../group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897',1,'http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers):&#160;httpd.c']]],
-  ['http_5fset_5fssi_5fhandler_17',['http_set_ssi_handler',['../group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c',1,'http_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags):&#160;httpd.c'],['../group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c',1,'http_set_ssi_handler(tSSIHandler pfnSSIHandler, const char **ppcTags, int iNumTags):&#160;httpd.c']]],
-  ['httpc_5fclient_5fagent_18',['HTTPC_CLIENT_AGENT',['../http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a',1,'http_client.c']]],
-  ['httpc_5fdebug_19',['HTTPC_DEBUG',['../http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1',1,'http_client.c']]],
-  ['httpc_5fdebug_5frequest_20',['HTTPC_DEBUG_REQUEST',['../http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a',1,'http_client.c']]],
-  ['httpc_5fget_5ffile_21',['httpc_get_file',['../group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b',1,'httpc_get_file(const ip_addr_t *server_addr, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c'],['../group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b',1,'httpc_get_file(const ip_addr_t *server_addr, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c']]],
-  ['httpc_5fget_5ffile_5fdns_22',['httpc_get_file_dns',['../group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6',1,'httpc_get_file_dns(const char *server_name, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c'],['../group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6',1,'httpc_get_file_dns(const char *server_name, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c']]],
-  ['httpc_5fheaders_5fdone_5ffn_23',['httpc_headers_done_fn',['../group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472',1,'http_client.h']]],
-  ['httpc_5fresult_5ferr_5fclosed_24',['HTTPC_RESULT_ERR_CLOSED',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6',1,'http_client.h']]],
-  ['httpc_5fresult_5ferr_5fconnect_25',['HTTPC_RESULT_ERR_CONNECT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09',1,'http_client.h']]],
-  ['httpc_5fresult_5ferr_5fcontent_5flen_26',['HTTPC_RESULT_ERR_CONTENT_LEN',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096',1,'http_client.h']]],
-  ['httpc_5fresult_5ferr_5fhostname_27',['HTTPC_RESULT_ERR_HOSTNAME',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d',1,'http_client.h']]],
-  ['httpc_5fresult_5ferr_5fmem_28',['HTTPC_RESULT_ERR_MEM',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62',1,'http_client.h']]],
-  ['httpc_5fresult_5ferr_5fsvr_5fresp_29',['HTTPC_RESULT_ERR_SVR_RESP',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8',1,'http_client.h']]],
-  ['httpc_5fresult_5ferr_5ftimeout_30',['HTTPC_RESULT_ERR_TIMEOUT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33',1,'http_client.h']]],
-  ['httpc_5fresult_5ferr_5funknown_31',['HTTPC_RESULT_ERR_UNKNOWN',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd',1,'http_client.h']]],
-  ['httpc_5fresult_5ffn_32',['httpc_result_fn',['../group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd',1,'http_client.h']]],
-  ['httpc_5fresult_5flocal_5fabort_33',['HTTPC_RESULT_LOCAL_ABORT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867',1,'http_client.h']]],
-  ['httpc_5fresult_5fok_34',['HTTPC_RESULT_OK',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659',1,'http_client.h']]],
-  ['httpc_5fresult_5ft_35',['httpc_result_t',['../group__httpc.html#gaeef5c7398d07b644c0d5593f3b7d1392',1,'http_client.h']]],
-  ['httpd_2ec_36',['httpd.c',['../httpd_8c.html',1,'']]],
-  ['httpd_2eh_37',['httpd.h',['../httpd_8h.html',1,'']]],
-  ['httpd_5fdebug_5ftiming_38',['HTTPD_DEBUG_TIMING',['../group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da',1,'httpd_opts.h']]],
-  ['httpd_5fenable_5fhttps_39',['HTTPD_ENABLE_HTTPS',['../group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2',1,'httpd_opts.h']]],
-  ['httpd_5ffsdata_5ffile_40',['HTTPD_FSDATA_FILE',['../group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc',1,'httpd_opts.h']]],
-  ['httpd_5finit_41',['httpd_init',['../group__httpd.html#gac364305cee969a0be43c071722b136e6',1,'httpd_init(void):&#160;httpd.c'],['../group__httpd.html#gac364305cee969a0be43c071722b136e6',1,'httpd_init(void):&#160;httpd.c']]],
-  ['httpd_5finits_42',['httpd_inits',['../group__httpd.html#gafaedb1911a83854b1e9835132db64409',1,'httpd_inits(struct altcp_tls_config *conf):&#160;httpd.c'],['../group__httpd.html#gafaedb1911a83854b1e9835132db64409',1,'httpd_inits(struct altcp_tls_config *conf):&#160;httpd.c']]],
-  ['httpd_5fmax_5fretries_43',['HTTPD_MAX_RETRIES',['../group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5',1,'httpd_opts.h']]],
-  ['httpd_5fopts_2eh_44',['httpd_opts.h',['../httpd__opts_8h.html',1,'']]],
-  ['httpd_5fpoll_5finterval_45',['HTTPD_POLL_INTERVAL',['../group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63',1,'httpd_opts.h']]],
-  ['httpd_5fpost_5fbegin_46',['httpd_post_begin',['../group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582',1,'httpd.h']]],
-  ['httpd_5fpost_5fdata_5frecved_47',['httpd_post_data_recved',['../group__httpd.html#gaca4357acf5c988b28123bc6f23540380',1,'httpd_post_data_recved(void *connection, u16_t recved_len):&#160;httpd.c'],['../group__httpd.html#gaca4357acf5c988b28123bc6f23540380',1,'httpd_post_data_recved(void *connection, u16_t recved_len):&#160;httpd.c']]],
-  ['httpd_5fpost_5ffinished_48',['httpd_post_finished',['../group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5',1,'httpd.h']]],
-  ['httpd_5fpost_5freceive_5fdata_49',['httpd_post_receive_data',['../group__httpd.html#ga461409c8813c2a82ba63fde987c0e537',1,'httpd.h']]],
-  ['httpd_5fprecalculated_5fchecksum_50',['HTTPD_PRECALCULATED_CHECKSUM',['../group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103',1,'httpd_opts.h']]],
-  ['httpd_5fserver_5fagent_51',['HTTPD_SERVER_AGENT',['../group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9',1,'httpd_opts.h']]],
-  ['httpd_5fserver_5fport_52',['HTTPD_SERVER_PORT',['../group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50',1,'httpd_opts.h']]],
-  ['httpd_5fserver_5fport_5fhttps_53',['HTTPD_SERVER_PORT_HTTPS',['../group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441',1,'httpd_opts.h']]],
-  ['httpd_5fssi_5ftag_5funknown_54',['HTTPD_SSI_TAG_UNKNOWN',['../httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca',1,'httpd.h']]],
-  ['httpd_5ftcp_5fprio_55',['HTTPD_TCP_PRIO',['../group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182',1,'httpd_opts.h']]],
-  ['httpd_5fuse_5fmem_5fpool_56',['HTTPD_USE_MEM_POOL',['../group__httpd__opts.html#gabb13219495a813fceaafa954a238a924',1,'httpd_opts.h']]],
-  ['hwaddr_57',['hwaddr',['../structnetif.html#aee967965d999fc1a4c40a66709304e69',1,'netif']]],
-  ['hwaddr_5flen_58',['hwaddr_len',['../structnetif.html#afe1181561cb16241f3cb5ed01e567d42',1,'netif']]]
+  ['how_20to_20contribute_20to_20lwip_6',['How to contribute to lwIP',['../contrib.html',1,'']]],
+  ['http_20client_7',['HTTP client',['../group__httpc.html',1,'']]],
+  ['http_20server_8',['HTTP server',['../group__httpd.html',1,'']]],
+  ['http_5fclient_2ec_9',['http_client.c',['../http__client_8c.html',1,'']]],
+  ['http_5fclient_2eh_10',['http_client.h',['../http__client_8h.html',1,'']]],
+  ['http_5fdefault_5fport_11',['HTTP_DEFAULT_PORT',['../group__httpc.html#ga1f192f3009865e9f9a3cd83609c866c2',1,'http_client.h']]],
+  ['http_5fis_5fdata_5fvolatile_12',['HTTP_IS_DATA_VOLATILE',['../httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300',1,'httpd.c']]],
+  ['http_5fis_5fhdr_5fvolatile_13',['HTTP_IS_HDR_VOLATILE',['../httpd_8c.html#af281bc4a762d56243e0b85dd4197174a',1,'httpd.c']]],
+  ['http_5fis_5ftag_5fvolatile_14',['HTTP_IS_TAG_VOLATILE',['../group__httpd__opts.html#ga662e88120b507426374dd8ebbd54a048',1,'httpd_opts.h']]],
+  ['http_5fset_5fcgi_5fhandlers_15',['http_set_cgi_handlers',['../group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897',1,'http_set_cgi_handlers(const tCGI *cgis, int num_handlers):&#160;httpd.c'],['../group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897',1,'http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers):&#160;httpd.c']]],
+  ['http_5fset_5fssi_5fhandler_16',['http_set_ssi_handler',['../group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c',1,'http_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags):&#160;httpd.c'],['../group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c',1,'http_set_ssi_handler(tSSIHandler pfnSSIHandler, const char **ppcTags, int iNumTags):&#160;httpd.c']]],
+  ['httpc_5fclient_5fagent_17',['HTTPC_CLIENT_AGENT',['../http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a',1,'http_client.c']]],
+  ['httpc_5fdebug_18',['HTTPC_DEBUG',['../http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1',1,'http_client.c']]],
+  ['httpc_5fdebug_5frequest_19',['HTTPC_DEBUG_REQUEST',['../http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a',1,'http_client.c']]],
+  ['httpc_5fget_5ffile_20',['httpc_get_file',['../group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b',1,'httpc_get_file(const ip_addr_t *server_addr, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c'],['../group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b',1,'httpc_get_file(const ip_addr_t *server_addr, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c']]],
+  ['httpc_5fget_5ffile_5fdns_21',['httpc_get_file_dns',['../group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6',1,'httpc_get_file_dns(const char *server_name, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c'],['../group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6',1,'httpc_get_file_dns(const char *server_name, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c']]],
+  ['httpc_5fheaders_5fdone_5ffn_22',['httpc_headers_done_fn',['../group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fclosed_23',['HTTPC_RESULT_ERR_CLOSED',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a89a6700abb14dd7cab9b4e0fd66e5fd6',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fconnect_24',['HTTPC_RESULT_ERR_CONNECT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ab866d5433b4c4593c80b756d434e1d09',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fcontent_5flen_25',['HTTPC_RESULT_ERR_CONTENT_LEN',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a6c8a4195834e1997a498a03bb47bb096',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fhostname_26',['HTTPC_RESULT_ERR_HOSTNAME',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3ae04714f90692c122e6c85e06083dbc6d',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fmem_27',['HTTPC_RESULT_ERR_MEM',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a49972833ec01c7a10dee734c7c69ed62',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5fsvr_5fresp_28',['HTTPC_RESULT_ERR_SVR_RESP',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3aaa023a6f8069c02c87a826ba323c54b8',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5ftimeout_29',['HTTPC_RESULT_ERR_TIMEOUT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a8e6c597f88335b31e6a8b078a32fde33',1,'http_client.h']]],
+  ['httpc_5fresult_5ferr_5funknown_30',['HTTPC_RESULT_ERR_UNKNOWN',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3a5026187026abd1d242333ba6ff69ddbd',1,'http_client.h']]],
+  ['httpc_5fresult_5ffn_31',['httpc_result_fn',['../group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd',1,'http_client.h']]],
+  ['httpc_5fresult_5flocal_5fabort_32',['HTTPC_RESULT_LOCAL_ABORT',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3adf4e45365923c16b6a6879bde5f60867',1,'http_client.h']]],
+  ['httpc_5fresult_5fok_33',['HTTPC_RESULT_OK',['../group__httpc.html#gga49e34884b272b1e0ddae8da46c31d9a3af3173d4d272c9c0b5a5c9b5b027e3659',1,'http_client.h']]],
+  ['httpc_5fresult_5ft_34',['httpc_result_t',['../group__httpc.html#gaeef5c7398d07b644c0d5593f3b7d1392',1,'http_client.h']]],
+  ['httpd_2ec_35',['httpd.c',['../httpd_8c.html',1,'']]],
+  ['httpd_2eh_36',['httpd.h',['../httpd_8h.html',1,'']]],
+  ['httpd_5fdebug_5ftiming_37',['HTTPD_DEBUG_TIMING',['../group__httpd__opts.html#ga5f2642874f930798d975b1f7a6d2e1da',1,'httpd_opts.h']]],
+  ['httpd_5fenable_5fhttps_38',['HTTPD_ENABLE_HTTPS',['../group__httpd__opts.html#ga64dc2a10b1c2ec886e698fe9008e51e2',1,'httpd_opts.h']]],
+  ['httpd_5ffsdata_5ffile_39',['HTTPD_FSDATA_FILE',['../group__httpd__opts.html#gad68e8e06ea4c2be1b3508e813a49f7cc',1,'httpd_opts.h']]],
+  ['httpd_5finit_40',['httpd_init',['../group__httpd.html#gac364305cee969a0be43c071722b136e6',1,'httpd_init(void):&#160;httpd.c'],['../group__httpd.html#gac364305cee969a0be43c071722b136e6',1,'httpd_init(void):&#160;httpd.c']]],
+  ['httpd_5finits_41',['httpd_inits',['../group__httpd.html#gafaedb1911a83854b1e9835132db64409',1,'httpd_inits(struct altcp_tls_config *conf):&#160;httpd.c'],['../group__httpd.html#gafaedb1911a83854b1e9835132db64409',1,'httpd_inits(struct altcp_tls_config *conf):&#160;httpd.c']]],
+  ['httpd_5fmax_5fretries_42',['HTTPD_MAX_RETRIES',['../group__httpd__opts.html#gad92e78e19fd3ab2af42750e83ed73fd5',1,'httpd_opts.h']]],
+  ['httpd_5fopts_2eh_43',['httpd_opts.h',['../httpd__opts_8h.html',1,'']]],
+  ['httpd_5fpoll_5finterval_44',['HTTPD_POLL_INTERVAL',['../group__httpd__opts.html#gacc3e7667baa2cfafd23de2b152df7a63',1,'httpd_opts.h']]],
+  ['httpd_5fpost_5fbegin_45',['httpd_post_begin',['../group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582',1,'httpd.h']]],
+  ['httpd_5fpost_5fdata_5frecved_46',['httpd_post_data_recved',['../group__httpd.html#gaca4357acf5c988b28123bc6f23540380',1,'httpd_post_data_recved(void *connection, u16_t recved_len):&#160;httpd.c'],['../group__httpd.html#gaca4357acf5c988b28123bc6f23540380',1,'httpd_post_data_recved(void *connection, u16_t recved_len):&#160;httpd.c']]],
+  ['httpd_5fpost_5ffinished_47',['httpd_post_finished',['../group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5',1,'httpd.h']]],
+  ['httpd_5fpost_5freceive_5fdata_48',['httpd_post_receive_data',['../group__httpd.html#ga461409c8813c2a82ba63fde987c0e537',1,'httpd.h']]],
+  ['httpd_5fprecalculated_5fchecksum_49',['HTTPD_PRECALCULATED_CHECKSUM',['../group__httpd__opts.html#ga6e5de8515c89af12277e4cb011165103',1,'httpd_opts.h']]],
+  ['httpd_5fserver_5fagent_50',['HTTPD_SERVER_AGENT',['../group__httpd__opts.html#gafb2115e763ed3163a3e204a0ba53edb9',1,'httpd_opts.h']]],
+  ['httpd_5fserver_5fport_51',['HTTPD_SERVER_PORT',['../group__httpd__opts.html#ga2b058c5d1bd67e5d7cb260166e3ace50',1,'httpd_opts.h']]],
+  ['httpd_5fserver_5fport_5fhttps_52',['HTTPD_SERVER_PORT_HTTPS',['../group__httpd__opts.html#gaffe653b08bf5ba25b276c655f6813441',1,'httpd_opts.h']]],
+  ['httpd_5fssi_5ftag_5funknown_53',['HTTPD_SSI_TAG_UNKNOWN',['../httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca',1,'httpd.h']]],
+  ['httpd_5ftcp_5fprio_54',['HTTPD_TCP_PRIO',['../group__httpd__opts.html#gaabd1f6319d04b8d5f2c93270794d5182',1,'httpd_opts.h']]],
+  ['httpd_5fuse_5fmem_5fpool_55',['HTTPD_USE_MEM_POOL',['../group__httpd__opts.html#gabb13219495a813fceaafa954a238a924',1,'httpd_opts.h']]],
+  ['hwaddr_56',['hwaddr',['../structnetif.html#aee967965d999fc1a4c40a66709304e69',1,'netif']]],
+  ['hwaddr_5flen_57',['hwaddr_len',['../structnetif.html#afe1181561cb16241f3cb5ed01e567d42',1,'netif']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_c.js b/doc/doxygen/output/html/search/all_c.js
index 7e31885..da02ab1 100644
--- a/doc/doxygen/output/html/search/all_c.js
+++ b/doc/doxygen/output/html/search/all_c.js
@@ -68,285 +68,311 @@
   ['icmp_5fdur_5fsr_65',['ICMP_DUR_SR',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5af63296fc25f79e56946a56a8da132c13',1,'icmp.h']]],
   ['icmp_5fdur_5ftype_66',['icmp_dur_type',['../icmp_8h.html#a17637465f209385e5d19ef47fd9266a5',1,'icmp.h']]],
   ['icmp_5fecho_5fhdr_67',['icmp_echo_hdr',['../structicmp__echo__hdr.html',1,'']]],
-  ['icmp_5finput_68',['icmp_input',['../icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1',1,'icmp_input(struct pbuf *p, struct netif *inp):&#160;icmp.c'],['../icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1',1,'icmp_input(struct pbuf *p, struct netif *inp):&#160;icmp.c']]],
-  ['icmp_5fstats_69',['ICMP_STATS',['../group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b',1,'opt.h']]],
-  ['icmp_5fte_5ffrag_70',['ICMP_TE_FRAG',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796',1,'icmp.h']]],
-  ['icmp_5fte_5fttl_71',['ICMP_TE_TTL',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c',1,'icmp.h']]],
-  ['icmp_5fte_5ftype_72',['icmp_te_type',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a',1,'icmp.h']]],
-  ['icmp_5ftime_5fexceeded_73',['icmp_time_exceeded',['../icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119',1,'icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t):&#160;icmp.c'],['../icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119',1,'icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t):&#160;icmp.c']]],
-  ['icmp_5fttl_74',['ICMP_TTL',['../group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf',1,'opt.h']]],
-  ['identification_20api_75',['Interface Identification API',['../group__if__api.html',1,'']]],
-  ['ieee_20802_201d_20bridge_76',['IEEE 802.1D bridge',['../group__bridgeif.html',1,'']]],
-  ['ieee_20assigned_20numbers_77',['IEEE assigned numbers',['../group__ieee.html',1,'']]],
-  ['ieee_2eh_78',['ieee.h',['../ieee_8h.html',1,'']]],
-  ['ieee802154_2eh_79',['ieee802154.h',['../ieee802154_8h.html',1,'']]],
-  ['ieee_5f802154_5fhdr_80',['ieee_802154_hdr',['../structieee__802154__hdr.html',1,'']]],
-  ['ieee_5f802154_5fpan_5fid_81',['ieee_802154_pan_id',['../structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f',1,'lowpan6_ieee802154_data']]],
-  ['if_2eh_82',['if.h',['../if_8h.html',1,'']]],
-  ['if_5fapi_2ec_83',['if_api.c',['../if__api_8c.html',1,'']]],
-  ['if_5fapi_2eh_84',['if_api.h',['../if__api_8h.html',1,'']]],
-  ['if_5fidx_85',['if_idx',['../structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697',1,'pbuf']]],
-  ['ifindiscards_86',['ifindiscards',['../structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947',1,'stats_mib2_netif_ctrs']]],
-  ['ifinerrors_87',['ifinerrors',['../structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d',1,'stats_mib2_netif_ctrs']]],
-  ['ifinnucastpkts_88',['ifinnucastpkts',['../structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd',1,'stats_mib2_netif_ctrs']]],
-  ['ifinoctets_89',['ifinoctets',['../structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e',1,'stats_mib2_netif_ctrs']]],
-  ['ifinucastpkts_90',['ifinucastpkts',['../structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8',1,'stats_mib2_netif_ctrs']]],
-  ['ifinunknownprotos_91',['ifinunknownprotos',['../structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa',1,'stats_mib2_netif_ctrs']]],
-  ['ifoutdiscards_92',['ifoutdiscards',['../structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842',1,'stats_mib2_netif_ctrs']]],
-  ['ifouterrors_93',['ifouterrors',['../structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e',1,'stats_mib2_netif_ctrs']]],
-  ['ifoutnucastpkts_94',['ifoutnucastpkts',['../structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7',1,'stats_mib2_netif_ctrs']]],
-  ['ifoutoctets_95',['ifoutoctets',['../structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7',1,'stats_mib2_netif_ctrs']]],
-  ['ifoutucastpkts_96',['ifoutucastpkts',['../structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471',1,'stats_mib2_netif_ctrs']]],
-  ['igmp_97',['IGMP',['../group__igmp.html',1,'IGMP'],['../group__lwip__opts__igmp.html',1,'IGMP']]],
-  ['igmp_98',['igmp',['../structstats__.html#a877e369c2abef97f13492faa838e2271',1,'stats_']]],
-  ['igmp_2ec_99',['igmp.c',['../igmp_8c.html',1,'']]],
-  ['igmp_2eh_100',['igmp.h',['../igmp_8h.html',1,'(Global Namespace)'],['../prot_2igmp_8h.html',1,'(Global Namespace)']]],
-  ['igmp_5fdebug_101',['IGMP_DEBUG',['../group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa',1,'opt.h']]],
-  ['igmp_5fgroup_102',['igmp_group',['../structigmp__group.html',1,'']]],
-  ['igmp_5finit_103',['igmp_init',['../igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8',1,'igmp_init(void):&#160;igmp.c'],['../igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8',1,'igmp_init(void):&#160;igmp.c']]],
-  ['igmp_5finput_104',['igmp_input',['../igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a',1,'igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest):&#160;igmp.c'],['../igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a',1,'igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest):&#160;igmp.c']]],
-  ['igmp_5fjoingroup_105',['igmp_joingroup',['../group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6',1,'igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6',1,'igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
-  ['igmp_5fjoingroup_5fnetif_106',['igmp_joingroup_netif',['../group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6',1,'igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6',1,'igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
-  ['igmp_5fleavegroup_107',['igmp_leavegroup',['../group__igmp.html#ga21c572ba7481ca41eb873923a5346544',1,'igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga21c572ba7481ca41eb873923a5346544',1,'igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
-  ['igmp_5fleavegroup_5fnetif_108',['igmp_leavegroup_netif',['../group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201',1,'igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201',1,'igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
-  ['igmp_5flookfor_5fgroup_109',['igmp_lookfor_group',['../igmp_8c.html#a695bd07cc4997aedb871b83456e18890',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c'],['../igmp_8h.html#a695bd07cc4997aedb871b83456e18890',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c']]],
-  ['igmp_5fmac_5ffilter_110',['igmp_mac_filter',['../structnetif.html#ae64e56581bf0f136601f24c5395c19f0',1,'netif']]],
-  ['igmp_5fmsg_111',['igmp_msg',['../structigmp__msg.html',1,'']]],
-  ['igmp_5freport_5fgroups_112',['igmp_report_groups',['../igmp_8c.html#af06eeba0e984aab4a67a836eab577726',1,'igmp_report_groups(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#af06eeba0e984aab4a67a836eab577726',1,'igmp_report_groups(struct netif *netif):&#160;igmp.c']]],
-  ['igmp_5fstart_113',['igmp_start',['../igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6',1,'igmp_start(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6',1,'igmp_start(struct netif *netif):&#160;igmp.c']]],
-  ['igmp_5fstats_114',['IGMP_STATS',['../group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740',1,'opt.h']]],
-  ['igmp_5fstop_115',['igmp_stop',['../igmp_8c.html#afc19bd532855a64c021be08172065f84',1,'igmp_stop(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#afc19bd532855a64c021be08172065f84',1,'igmp_stop(struct netif *netif):&#160;igmp.c']]],
-  ['igmp_5ftmr_116',['igmp_tmr',['../igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1',1,'igmp_tmr(void):&#160;igmp.c'],['../igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1',1,'igmp_tmr(void):&#160;igmp.c']]],
-  ['in6addr_5fany_117',['in6addr_any',['../inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3',1,'in6addr_any:&#160;inet6.c'],['../lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3',1,'in6addr_any:&#160;inet6.c']]],
-  ['in6addr_5fany_5finit_118',['IN6ADDR_ANY_INIT',['../lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c',1,'inet.h']]],
-  ['in6addr_5floopback_5finit_119',['IN6ADDR_LOOPBACK_INIT',['../lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37',1,'inet.h']]],
-  ['inaddr_5fany_120',['INADDR_ANY',['../lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab',1,'inet.h']]],
-  ['inaddr_5fbroadcast_121',['INADDR_BROADCAST',['../lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986',1,'inet.h']]],
-  ['inaddr_5floopback_122',['INADDR_LOOPBACK',['../lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378',1,'inet.h']]],
-  ['inaddr_5fnone_123',['INADDR_NONE',['../lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea',1,'inet.h']]],
-  ['inet_2eh_124',['inet.h',['../compat_2posix_2arpa_2inet_8h.html',1,'(Global Namespace)'],['../lwip_2inet_8h.html',1,'(Global Namespace)']]],
-  ['inet6_2ec_125',['inet6.c',['../inet6_8c.html',1,'']]],
-  ['inet_5fchksum_2ec_126',['inet_chksum.c',['../inet__chksum_8c.html',1,'']]],
-  ['inet_5fchksum_2eh_127',['inet_chksum.h',['../inet__chksum_8h.html',1,'']]],
-  ['inet_5fchksum_5fpbuf_128',['inet_chksum_pbuf',['../inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865',1,'inet_chksum_pbuf(struct pbuf *p):&#160;inet_chksum.c'],['../inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865',1,'inet_chksum_pbuf(struct pbuf *p):&#160;inet_chksum.c']]],
-  ['inet_5fdebug_129',['INET_DEBUG',['../group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3',1,'opt.h']]],
-  ['infrastructure_130',['Infrastructure',['../group__infrastructure.html',1,'Infrastructure'],['../group__lwip__opts__infrastructure.html',1,'Infrastructure']]],
-  ['init_2ec_131',['init.c',['../init_8c.html',1,'']]],
-  ['init_2eh_132',['init.h',['../init_8h.html',1,'']]],
-  ['initalization_133',['System initalization',['../sys_init.html',1,'']]],
-  ['inpub_5fpkt_5fid_134',['inpub_pkt_id',['../structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824',1,'mqtt_client_s']]],
-  ['input_135',['input',['../structnetif.html#a8fe4f1b7b0d710216287da9615164a5c',1,'netif']]],
-  ['instance_5foid_136',['instance_oid',['../structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23',1,'snmp_node_instance']]],
-  ['interface_137',['Loopback interface',['../group__lwip__opts__loop.html',1,'']]],
-  ['interface_20identification_20api_138',['Interface Identification API',['../group__if__api.html',1,'']]],
-  ['interface_20netif_139',['Network interface (NETIF)',['../group__netif.html',1,'']]],
-  ['internal_20memory_20pools_140',['Internal memory pools',['../group__lwip__opts__memp.html',1,'']]],
-  ['introduction_141',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
-  ['ip_142',['IP',['../group__ip.html',1,'']]],
-  ['ip_143',['ip',['../structstats__.html#a40f5b637d083896a07a3482ede23b7ed',1,'stats_']]],
-  ['ip_20address_20handling_144',['IP address handling',['../group__ipaddr.html',1,'']]],
-  ['ip_2ec_145',['ip.c',['../ip_8c.html',1,'']]],
-  ['ip_2eh_146',['ip.h',['../ip_8h.html',1,'(Global Namespace)'],['../prot_2ip_8h.html',1,'(Global Namespace)']]],
-  ['ip4_2ec_147',['ip4.c',['../ip4_8c.html',1,'']]],
-  ['ip4_2eh_148',['ip4.h',['../ip4_8h.html',1,'(Global Namespace)'],['../prot_2ip4_8h.html',1,'(Global Namespace)']]],
-  ['ip4_5faddr_149',['IP4_ADDR',['../ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974',1,'ip4_addr.h']]],
-  ['ip4_5faddr_150',['ip4_addr',['../structip4__addr.html',1,'']]],
-  ['ip4_5faddr_2ec_151',['ip4_addr.c',['../ip4__addr_8c.html',1,'']]],
-  ['ip4_5faddr_2eh_152',['ip4_addr.h',['../ip4__addr_8h.html',1,'']]],
-  ['ip4_5faddr_5fany_153',['IP4_ADDR_ANY',['../group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff',1,'ip_addr.h']]],
-  ['ip4_5faddr_5fany4_154',['IP4_ADDR_ANY4',['../group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42',1,'ip_addr.h']]],
-  ['ip4_5faddr_5fcopy_155',['ip4_addr_copy',['../ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fget_5fnetwork_156',['ip4_addr_get_network',['../ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fget_5fu32_157',['ip4_addr_get_u32',['../ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fisbroadcast_5fu32_158',['ip4_addr_isbroadcast_u32',['../ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421',1,'ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif):&#160;ip4_addr.c'],['../ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421',1,'ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif):&#160;ip4_addr.c']]],
-  ['ip4_5faddr_5fisloopback_159',['ip4_addr_isloopback',['../ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fnetcmp_160',['ip4_addr_netcmp',['../ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fnetmask_5fvalid_161',['ip4_addr_netmask_valid',['../ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071',1,'ip4_addr_netmask_valid(u32_t netmask):&#160;ip4_addr.c'],['../ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071',1,'ip4_addr_netmask_valid(u32_t netmask):&#160;ip4_addr.c']]],
-  ['ip4_5faddr_5fpacked_162',['ip4_addr_packed',['../structip4__addr__packed.html',1,'']]],
-  ['ip4_5faddr_5fset_163',['ip4_addr_set',['../ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5fany_164',['ip4_addr_set_any',['../ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5fhton_165',['ip4_addr_set_hton',['../ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5floopback_166',['ip4_addr_set_loopback',['../ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5fu32_167',['ip4_addr_set_u32',['../ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5fzero_168',['ip4_addr_set_zero',['../ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5ft_169',['ip4_addr_t',['../ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fwordaligned_170',['ip4_addr_wordaligned',['../structip4__addr__wordaligned.html',1,'']]],
-  ['ip4_5fcurrent_5fdest_5faddr_171',['ip4_current_dest_addr',['../ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720',1,'ip.h']]],
-  ['ip4_5fcurrent_5fheader_172',['ip4_current_header',['../ip_8h.html#a3ce482b7e08282effd670001198ecd87',1,'ip.h']]],
-  ['ip4_5fcurrent_5fsrc_5faddr_173',['ip4_current_src_addr',['../ip_8h.html#ad2a62f96b9431a79f0258dc13058b160',1,'ip.h']]],
-  ['ip4_5ffrag_174',['ip4_frag',['../ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c',1,'ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest):&#160;ip4_frag.c'],['../ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c',1,'ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest):&#160;ip4_frag.c']]],
-  ['ip4_5ffrag_2ec_175',['ip4_frag.c',['../ip4__frag_8c.html',1,'']]],
-  ['ip4_5ffrag_2eh_176',['ip4_frag.h',['../ip4__frag_8h.html',1,'']]],
-  ['ip4_5finput_177',['ip4_input',['../ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b',1,'ip4_input(struct pbuf *p, struct netif *inp):&#160;ip4.c'],['../ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b',1,'ip4_input(struct pbuf *p, struct netif *inp):&#160;ip4.c']]],
-  ['ip4_5foutput_178',['ip4_output',['../ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8',1,'ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto):&#160;ip4.c'],['../ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8',1,'ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto):&#160;ip4.c']]],
-  ['ip4_5foutput_5fif_179',['ip4_output_if',['../ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917',1,'ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c'],['../ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917',1,'ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c']]],
-  ['ip4_5foutput_5fif_5fopt_180',['ip4_output_if_opt',['../ip4_8c.html#a0d912e400875396792a12ea443ecc1cf',1,'ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c'],['../ip4_8h.html#a0d912e400875396792a12ea443ecc1cf',1,'ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c']]],
-  ['ip4_5foutput_5fif_5fopt_5fsrc_181',['ip4_output_if_opt_src',['../ip4_8c.html#accd56b095730de4ad56728bfcb349940',1,'ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c'],['../ip4_8h.html#accd56b095730de4ad56728bfcb349940',1,'ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c']]],
-  ['ip4_5foutput_5fif_5fsrc_182',['ip4_output_if_src',['../ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7',1,'ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c'],['../ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7',1,'ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c']]],
-  ['ip4_5freass_183',['ip4_reass',['../ip4__frag_8c.html#aa73b0bc1e6e38c47548319af47f51052',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c'],['../ip4__frag_8h.html#aa73b0bc1e6e38c47548319af47f51052',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c']]],
-  ['ip4_5froute_184',['ip4_route',['../ip4_8c.html#a5bbbec93cef9133ed07d8c2cd9bc80f3',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#a5bbbec93cef9133ed07d8c2cd9bc80f3',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c']]],
-  ['ip4_5froute_5fsrc_185',['ip4_route_src',['../ip4_8c.html#ac04e6e67e8f0aff18dd4cf8a2439f56e',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#ac04e6e67e8f0aff18dd4cf8a2439f56e',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c']]],
-  ['ip4_5fset_5fdefault_5fmulticast_5fnetif_186',['ip4_set_default_multicast_netif',['../group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420',1,'ip4_set_default_multicast_netif(struct netif *default_multicast_netif):&#160;ip4.c'],['../group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420',1,'ip4_set_default_multicast_netif(struct netif *default_multicast_netif):&#160;ip4.c']]],
-  ['ip4addr_5faton_187',['ip4addr_aton',['../ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a',1,'ip4addr_aton(const char *cp, ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a',1,'ip4addr_aton(const char *cp, ip4_addr_t *addr):&#160;ip4_addr.c']]],
-  ['ip4addr_5fntoa_188',['ip4addr_ntoa',['../ip4__addr_8c.html#af01e406c5f44a325d779c4b4282a1744',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#af01e406c5f44a325d779c4b4282a1744',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c']]],
-  ['ip4addr_5fntoa_5fr_189',['ip4addr_ntoa_r',['../ip4__addr_8c.html#a3abcfd31a756ccc91ceef5e59216f2d4',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a3abcfd31a756ccc91ceef5e59216f2d4',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c']]],
-  ['ip6_190',['ip6',['../structstats__.html#afc0942a5bc26735cf059099636b85336',1,'stats_']]],
-  ['ip6_2ec_191',['ip6.c',['../ip6_8c.html',1,'']]],
-  ['ip6_2eh_192',['ip6.h',['../ip6_8h.html',1,'(Global Namespace)'],['../prot_2ip6_8h.html',1,'(Global Namespace)']]],
-  ['ip6_5faddr_193',['IP6_ADDR',['../ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3',1,'ip6_addr.h']]],
-  ['ip6_5faddr_194',['ip6_addr',['../structip6__addr.html',1,'ip6_addr'],['../structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4',1,'netif::ip6_addr']]],
-  ['ip6_5faddr_2ec_195',['ip6_addr.c',['../ip6__addr_8c.html',1,'']]],
-  ['ip6_5faddr_2eh_196',['ip6_addr.h',['../ip6__addr_8h.html',1,'']]],
-  ['ip6_5faddr_5fany_197',['IP6_ADDR_ANY',['../group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0',1,'ip_addr.h']]],
-  ['ip6_5faddr_5fany6_198',['IP6_ADDR_ANY6',['../group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43',1,'ip_addr.h']]],
-  ['ip6_5faddr_5fassign_5fzone_199',['ip6_addr_assign_zone',['../group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fblock1_200',['IP6_ADDR_BLOCK1',['../ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock2_201',['IP6_ADDR_BLOCK2',['../ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock3_202',['IP6_ADDR_BLOCK3',['../ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock4_203',['IP6_ADDR_BLOCK4',['../ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock5_204',['IP6_ADDR_BLOCK5',['../ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock6_205',['IP6_ADDR_BLOCK6',['../ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock7_206',['IP6_ADDR_BLOCK7',['../ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock8_207',['IP6_ADDR_BLOCK8',['../ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fclear_5fzone_208',['ip6_addr_clear_zone',['../group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fcmp_209',['ip6_addr_cmp',['../ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcmp_5fpacked_210',['ip6_addr_cmp_packed',['../ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcmp_5fzone_211',['ip6_addr_cmp_zone',['../group__ip6__zones.html#gacbb8e1a7505d9772181defa0e75b8da9',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fcmp_5fzoneless_212',['ip6_addr_cmp_zoneless',['../ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcopy_213',['ip6_addr_copy',['../ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcopy_5ffrom_5fpacked_214',['ip6_addr_copy_from_packed',['../ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcopy_5fto_5fpacked_215',['ip6_addr_copy_to_packed',['../ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcopy_5fzone_216',['ip6_addr_copy_zone',['../group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fequals_5fzone_217',['ip6_addr_equals_zone',['../group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fhas_5fscope_218',['ip6_addr_has_scope',['../group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fhas_5fzone_219',['ip6_addr_has_zone',['../group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5flacks_5fzone_220',['ip6_addr_lacks_zone',['../group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fnetcmp_221',['ip6_addr_netcmp',['../ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fnetcmp_5fzoneless_222',['ip6_addr_netcmp_zoneless',['../ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fpacked_223',['ip6_addr_packed',['../structip6__addr__packed.html',1,'']]],
-  ['ip6_5faddr_5fpart_224',['IP6_ADDR_PART',['../ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fselect_5fzone_225',['ip6_addr_select_zone',['../group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fset_226',['ip6_addr_set',['../ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_5fany_227',['ip6_addr_set_any',['../ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_5fhton_228',['ip6_addr_set_hton',['../ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_5floopback_229',['ip6_addr_set_loopback',['../ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_5fzero_230',['ip6_addr_set_zero',['../ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_5fzone_231',['ip6_addr_set_zone',['../group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fstate_232',['ip6_addr_state',['../structnetif.html#a54e81344084e9840a51cc4abab3b059b',1,'netif']]],
-  ['ip6_5faddr_5ft_233',['ip6_addr_t',['../ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5ftest_5fzone_234',['ip6_addr_test_zone',['../group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e',1,'ip6_zone.h']]],
-  ['ip6_5faddr_5fvalid_5flife_235',['ip6_addr_valid_life',['../structnetif.html#a26f6e26d4a54c998716c10b7b85c8230',1,'netif']]],
-  ['ip6_5faddr_5fzone_236',['ip6_addr_zone',['../group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634',1,'ip6_zone.h']]],
-  ['ip6_5fautoconfig_5fenabled_237',['ip6_autoconfig_enabled',['../structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f',1,'netif']]],
-  ['ip6_5fchksum_5fpseudo_238',['ip6_chksum_pseudo',['../inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88',1,'ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c'],['../inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88',1,'ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c']]],
-  ['ip6_5fchksum_5fpseudo_5fpartial_239',['ip6_chksum_pseudo_partial',['../inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b',1,'ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c'],['../inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b',1,'ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c']]],
-  ['ip6_5fcurrent_5fdest_5faddr_240',['ip6_current_dest_addr',['../ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0',1,'ip.h']]],
-  ['ip6_5fcurrent_5fheader_241',['ip6_current_header',['../ip_8h.html#af9bf74750c9d7a219ee88d240300fe69',1,'ip.h']]],
-  ['ip6_5fcurrent_5fsrc_5faddr_242',['ip6_current_src_addr',['../ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245',1,'ip.h']]],
-  ['ip6_5fdebug_243',['IP6_DEBUG',['../group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce',1,'opt.h']]],
-  ['ip6_5ffrag_244',['ip6_frag',['../structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf',1,'stats_::ip6_frag'],['../ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37',1,'ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest):&#160;ip6_frag.c'],['../ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37',1,'ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest):&#160;ip6_frag.c']]],
-  ['ip6_5ffrag_2ec_245',['ip6_frag.c',['../ip6__frag_8c.html',1,'']]],
-  ['ip6_5ffrag_2eh_246',['ip6_frag.h',['../ip6__frag_8h.html',1,'']]],
-  ['ip6_5ffrag_5fstats_247',['IP6_FRAG_STATS',['../group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b',1,'opt.h']]],
-  ['ip6_5fhdr_248',['ip6_hdr',['../structip6__hdr.html',1,'']]],
-  ['ip6_5finput_249',['ip6_input',['../ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094',1,'ip6_input(struct pbuf *p, struct netif *inp):&#160;ip6.c'],['../ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094',1,'ip6_input(struct pbuf *p, struct netif *inp):&#160;ip6.c']]],
-  ['ip6_5fmulticast_250',['IP6_MULTICAST',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809',1,'ip6_zone.h']]],
-  ['ip6_5fno_5fzone_251',['IP6_NO_ZONE',['../group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb',1,'ip6_zone.h']]],
-  ['ip6_5foptions_5fadd_5fhbh_5fra_252',['ip6_options_add_hbh_ra',['../ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e',1,'ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value):&#160;ip6.c'],['../ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e',1,'ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value):&#160;ip6.c']]],
-  ['ip6_5foutput_253',['ip6_output',['../ip6_8c.html#aec695e64536ac744e616c997deb84cda',1,'ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth):&#160;ip6.c'],['../ip6_8h.html#aec695e64536ac744e616c997deb84cda',1,'ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth):&#160;ip6.c']]],
-  ['ip6_5foutput_5fif_254',['ip6_output_if',['../ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4',1,'ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c'],['../ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4',1,'ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c']]],
-  ['ip6_5foutput_5fif_5fsrc_255',['ip6_output_if_src',['../ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56',1,'ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c'],['../ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56',1,'ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c']]],
-  ['ip6_5freass_256',['ip6_reass',['../ip6__frag_8c.html#aa29dd0a8b5622216643581f243cd423a',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c'],['../ip6__frag_8h.html#aa29dd0a8b5622216643581f243cd423a',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c']]],
-  ['ip6_5freass_5fhelper_257',['ip6_reass_helper',['../structip6__reass__helper.html',1,'']]],
-  ['ip6_5freass_5ftmr_5finterval_258',['IP6_REASS_TMR_INTERVAL',['../ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2',1,'ip6_frag.h']]],
-  ['ip6_5freassdata_259',['ip6_reassdata',['../structip6__reassdata.html',1,'']]],
-  ['ip6_5froute_260',['ip6_route',['../ip6_8c.html#a519686a2c3beb689bf1d3380c4e5efb1',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c'],['../ip6_8h.html#a519686a2c3beb689bf1d3380c4e5efb1',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c']]],
-  ['ip6_5fselect_5fsource_5faddress_261',['ip6_select_source_address',['../group__ip6.html#ga1224b474149331702ae5aec24dd14caa',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c'],['../group__ip6.html#ga1224b474149331702ae5aec24dd14caa',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c']]],
-  ['ip6_5fstats_262',['IP6_STATS',['../group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2',1,'opt.h']]],
-  ['ip6_5funicast_263',['IP6_UNICAST',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0',1,'ip6_zone.h']]],
-  ['ip6_5funknown_264',['IP6_UNKNOWN',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8',1,'ip6_zone.h']]],
-  ['ip6_5fzone_2eh_265',['ip6_zone.h',['../ip6__zone_8h.html',1,'']]],
-  ['ip6addr_5faton_266',['ip6addr_aton',['../ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e',1,'ip6addr_aton(const char *cp, ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e',1,'ip6addr_aton(const char *cp, ip6_addr_t *addr):&#160;ip6_addr.c']]],
-  ['ip6addr_5fntoa_267',['ip6addr_ntoa',['../ip6__addr_8c.html#ab153e5b58a5674e5e1bacdbbc0934c44',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#ab153e5b58a5674e5e1bacdbbc0934c44',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c']]],
-  ['ip6addr_5fntoa_5fr_268',['ip6addr_ntoa_r',['../ip6__addr_8c.html#ac0470fb6b6fdbf986a20e523870e6f2e',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c'],['../ip6__addr_8h.html#ac0470fb6b6fdbf986a20e523870e6f2e',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c']]],
-  ['ip_5f2_5fip4_269',['ip_2_ip4',['../group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03',1,'ip_addr.h']]],
-  ['ip_5f2_5fip6_270',['ip_2_ip6',['../group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd',1,'ip_addr.h']]],
-  ['ip_5faccept_5flink_5flayer_5faddressed_5fport_271',['IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT',['../ip4_8c.html#a185c7d6380711847105430931692b267',1,'ip4.c']]],
-  ['ip_5faddr_272',['ip_addr',['../structip__addr.html',1,'ip_addr'],['../structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866',1,'netif::ip_addr']]],
-  ['ip_5faddr_2eh_273',['ip_addr.h',['../ip__addr_8h.html',1,'']]],
-  ['ip_5faddr_5fany_274',['IP_ADDR_ANY',['../group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c',1,'ip_addr.h']]],
-  ['ip_5faddr_5ft_275',['ip_addr_t',['../group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e',1,'ip_addr.h']]],
-  ['ip_5fcurrent_5fdest_5faddr_276',['ip_current_dest_addr',['../ip_8h.html#a9135977868017c3deeec86b525e13997',1,'ip_current_dest_addr:&#160;ip.h'],['../ip_8h.html#a9135977868017c3deeec86b525e13997',1,'ip_current_dest_addr:&#160;ip.h']]],
-  ['ip_5fcurrent_5fheader_5fproto_277',['ip_current_header_proto',['../ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f',1,'ip.h']]],
-  ['ip_5fcurrent_5fheader_5ftot_5flen_278',['ip_current_header_tot_len',['../ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2',1,'ip.h']]],
-  ['ip_5fcurrent_5finput_5fnetif_279',['ip_current_input_netif',['../ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4',1,'ip.h']]],
-  ['ip_5fcurrent_5fis_5fv6_280',['ip_current_is_v6',['../ip_8h.html#abc56623d434a204298a4e98352af1c9d',1,'ip.h']]],
-  ['ip_5fcurrent_5fnetif_281',['ip_current_netif',['../ip_8h.html#aabecef3c7653a9767c79245c44fcab9f',1,'ip.h']]],
-  ['ip_5fcurrent_5fsrc_5faddr_282',['ip_current_src_addr',['../ip_8h.html#a4e35b7692c228c98e738892f0a215647',1,'ip_current_src_addr:&#160;ip.h'],['../ip_8h.html#a4e35b7692c228c98e738892f0a215647',1,'ip_current_src_addr:&#160;ip.h']]],
-  ['ip_5fdata_283',['ip_data',['../ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data:&#160;ip.c'],['../ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data:&#160;ip.c']]],
-  ['ip_5fdebug_284',['IP_DEBUG',['../group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a',1,'opt.h']]],
-  ['ip_5fdefault_5fttl_285',['IP_DEFAULT_TTL',['../group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411',1,'opt.h']]],
-  ['ip_5fforward_286',['IP_FORWARD',['../group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59',1,'opt.h']]],
-  ['ip_5fforward_5fallow_5ftx_5fon_5frx_5fnetif_287',['IP_FORWARD_ALLOW_TX_ON_RX_NETIF',['../group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7',1,'opt.h']]],
-  ['ip_5ffrag_288',['IP_FRAG',['../group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4',1,'opt.h']]],
-  ['ip_5ffrag_289',['ip_frag',['../structstats__.html#a81fcccf03ab0d4e31423f39d0c880302',1,'stats_']]],
-  ['ip_5fget_5foption_290',['ip_get_option',['../ip_8h.html#a26e077f52de4a97ff89c02415c084518',1,'ip.h']]],
-  ['ip_5fglobals_291',['ip_globals',['../structip__globals.html',1,'']]],
-  ['ip_5fhdr_5fget_5fversion_292',['IP_HDR_GET_VERSION',['../prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374',1,'ip.h']]],
-  ['ip_5finput_293',['ip_input',['../group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26',1,'ip_input(struct pbuf *p, struct netif *inp):&#160;ip.c'],['../group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26',1,'ip_input(struct pbuf *p, struct netif *inp):&#160;ip.c']]],
-  ['ip_5fnetif_5fget_5flocal_5fip_294',['ip_netif_get_local_ip',['../group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0',1,'ip.h']]],
-  ['ip_5fnext_5fheader_5fptr_295',['ip_next_header_ptr',['../ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26',1,'ip.h']]],
-  ['ip_5fntoa_296',['ip_ntoa',['../ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1',1,'ip4_addr.h']]],
-  ['ip_5foptions_5fallowed_297',['IP_OPTIONS_ALLOWED',['../group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933',1,'opt.h']]],
-  ['ip_5foptions_5fsend_298',['IP_OPTIONS_SEND',['../ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824',1,'ip4.h']]],
-  ['ip_5foutput_299',['ip_output',['../group__ip.html#gaf056aa43789c2964f091f8349bb83730',1,'ip.h']]],
-  ['ip_5foutput_5fhinted_300',['ip_output_hinted',['../ip_8h.html#accbc01f37dd426a66de41693a5450207',1,'ip.h']]],
-  ['ip_5foutput_5fif_301',['ip_output_if',['../group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250',1,'ip.h']]],
-  ['ip_5foutput_5fif_5fhdrincl_302',['ip_output_if_hdrincl',['../ip_8h.html#aac608b92f8f226c3574d6bb855f12496',1,'ip.h']]],
-  ['ip_5foutput_5fif_5fsrc_303',['ip_output_if_src',['../group__ip.html#gab9d45f846f796bd6ce1e0c780c392765',1,'ip.h']]],
-  ['ip_5fpcb_304',['IP_PCB',['../ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53',1,'ip.h']]],
-  ['ip_5freass_5fcheck_5foverlap_305',['IP_REASS_CHECK_OVERLAP',['../ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe',1,'IP_REASS_CHECK_OVERLAP:&#160;ip4_frag.c'],['../ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe',1,'IP_REASS_CHECK_OVERLAP:&#160;ip6_frag.c']]],
-  ['ip_5freass_5fdebug_306',['IP_REASS_DEBUG',['../group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33',1,'opt.h']]],
-  ['ip_5freass_5ffree_5foldest_307',['IP_REASS_FREE_OLDEST',['../ip4__frag_8c.html#a510934accf149433bdcf683993e79080',1,'IP_REASS_FREE_OLDEST:&#160;ip4_frag.c'],['../ip6__frag_8c.html#a510934accf149433bdcf683993e79080',1,'IP_REASS_FREE_OLDEST:&#160;ip6_frag.c']]],
-  ['ip_5freass_5fhelper_308',['ip_reass_helper',['../structip__reass__helper.html',1,'']]],
-  ['ip_5freass_5fmax_5fpbufs_309',['IP_REASS_MAX_PBUFS',['../group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394',1,'opt.h']]],
-  ['ip_5freass_5fmaxage_310',['IP_REASS_MAXAGE',['../group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b',1,'opt.h']]],
-  ['ip_5freass_5ftmr_311',['ip_reass_tmr',['../ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88',1,'ip_reass_tmr(void):&#160;ip4_frag.c'],['../ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88',1,'ip_reass_tmr(void):&#160;ip4_frag.c']]],
-  ['ip_5freassdata_312',['ip_reassdata',['../structip__reassdata.html',1,'']]],
-  ['ip_5freassembly_313',['IP_REASSEMBLY',['../group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69',1,'opt.h']]],
-  ['ip_5freset_5foption_314',['ip_reset_option',['../ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc',1,'ip.h']]],
-  ['ip_5froute_315',['ip_route',['../group__ip.html#ga0fa3afc2c00aea346889b476650adee3',1,'ip.h']]],
-  ['ip_5fset_5foption_316',['ip_set_option',['../ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93',1,'ip.h']]],
-  ['ip_5fsof_5fbroadcast_317',['IP_SOF_BROADCAST',['../group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384',1,'opt.h']]],
-  ['ip_5fsof_5fbroadcast_5frecv_318',['IP_SOF_BROADCAST_RECV',['../group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db',1,'opt.h']]],
-  ['ip_5fstats_319',['IP_STATS',['../group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be',1,'opt.h']]],
-  ['ipaddr6_5fzone_5finit_320',['IPADDR6_ZONE_INIT',['../group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9',1,'ip6_zone.h']]],
-  ['ipaddr_5faddr_321',['ipaddr_addr',['../ip4__addr_8c.html#a2c05f9138da41115978409e547df9670',1,'ipaddr_addr(const char *cp):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a2c05f9138da41115978409e547df9670',1,'ipaddr_addr(const char *cp):&#160;ip4_addr.c']]],
-  ['ipaddr_5fany_322',['IPADDR_ANY',['../ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2',1,'ip4_addr.h']]],
-  ['ipaddr_5faton_323',['ipaddr_aton',['../group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151',1,'ipaddr_aton(const char *cp, ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151',1,'ipaddr_aton(const char *cp, ip_addr_t *addr):&#160;ip.c']]],
-  ['ipaddr_5fbroadcast_324',['IPADDR_BROADCAST',['../ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a',1,'ip4_addr.h']]],
-  ['ipaddr_5floopback_325',['IPADDR_LOOPBACK',['../ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e',1,'ip4_addr.h']]],
-  ['ipaddr_5fnone_326',['IPADDR_NONE',['../ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544',1,'ip4_addr.h']]],
-  ['ipaddr_5fntoa_327',['ipaddr_ntoa',['../group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c']]],
-  ['ipaddr_5fntoa_5fr_328',['ipaddr_ntoa_r',['../group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c'],['../group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c']]],
-  ['ipaddr_5ftype_5fany_329',['IPADDR_TYPE_ANY',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e',1,'ip_addr.h']]],
-  ['ipaddr_5ftype_5fv4_330',['IPADDR_TYPE_V4',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049',1,'ip_addr.h']]],
-  ['ipaddr_5ftype_5fv6_331',['IPADDR_TYPE_V6',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02',1,'ip_addr.h']]],
-  ['ipaddr_5fwordaligned_5fcopy_5ffrom_5fip4_5faddr_5ft_332',['IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419',1,'etharp.h']]],
-  ['ipaddr_5fwordaligned_5fcopy_5fto_5fip4_5faddr_5ft_333',['IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030',1,'etharp.h']]],
-  ['iperf_20server_334',['Iperf server',['../group__iperf.html',1,'']]],
-  ['ipfrag_5fstats_335',['IPFRAG_STATS',['../group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f',1,'opt.h']]],
-  ['ipv4_336',['IPv4',['../group__ip4.html',1,'IPv4'],['../group__lwip__opts__ipv4.html',1,'IPv4']]],
-  ['ipv4_20address_20handling_337',['IPv4 address handling',['../group__netif__ip4.html',1,'']]],
-  ['ipv4_20only_338',['IPv4 only',['../group__ip4addr.html',1,'']]],
-  ['ipv4_5fchanged_5fs_339',['ipv4_changed_s',['../structnetif__ext__callback__args__t_1_1ipv4__changed__s.html',1,'netif_ext_callback_args_t']]],
-  ['ipv6_340',['IPv6',['../group__ip6.html',1,'IPv6'],['../group__lwip__opts__ipv6.html',1,'IPv6']]],
-  ['ipv6_20address_20handling_341',['IPv6 address handling',['../group__netif__ip6.html',1,'']]],
-  ['ipv6_20only_342',['IPv6 only',['../group__ip6addr.html',1,'']]],
-  ['ipv6_20zones_343',['IPv6 Zones',['../group__ip6__zones.html',1,'']]],
-  ['ipv6_5faddr_5fstate_5fchanged_5fs_344',['ipv6_addr_state_changed_s',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html',1,'netif_ext_callback_args_t']]],
-  ['ipv6_5fcustom_5fscopes_345',['IPV6_CUSTOM_SCOPES',['../group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b',1,'ip6_zone.h']]],
-  ['ipv6_5ffrag_5fcopyheader_346',['IPV6_FRAG_COPYHEADER',['../ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7',1,'ip6_frag.h']]],
-  ['ipv6_5freass_5fmaxage_347',['IPV6_REASS_MAXAGE',['../group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969',1,'opt.h']]],
-  ['ipv6_5fset_5fs_348',['ipv6_set_s',['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html',1,'netif_ext_callback_args_t']]]
+  ['icmp_5fhdr_68',['icmp_hdr',['../structicmp__hdr.html',1,'']]],
+  ['icmp_5finput_69',['icmp_input',['../icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1',1,'icmp_input(struct pbuf *p, struct netif *inp):&#160;icmp.c'],['../icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1',1,'icmp_input(struct pbuf *p, struct netif *inp):&#160;icmp.c']]],
+  ['icmp_5fstats_70',['ICMP_STATS',['../group__lwip__opts__stats.html#ga472ad3f6da741f5b287d66ad3051242b',1,'opt.h']]],
+  ['icmp_5fte_5ffrag_71',['ICMP_TE_FRAG',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa4d351874c3e2d4a4cf46569df28cd796',1,'icmp.h']]],
+  ['icmp_5fte_5fttl_72',['ICMP_TE_TTL',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324aa827a1f8705826a6cc3c22e2571acf02c',1,'icmp.h']]],
+  ['icmp_5fte_5ftype_73',['icmp_te_type',['../icmp_8h.html#a058d0a0769bd38db99fc6fd1dad1324a',1,'icmp.h']]],
+  ['icmp_5ftime_5fexceeded_74',['icmp_time_exceeded',['../icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119',1,'icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t):&#160;icmp.c'],['../icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119',1,'icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t):&#160;icmp.c']]],
+  ['icmp_5fttl_75',['ICMP_TTL',['../group__lwip__opts__icmp.html#gae1533f2bc39a5843989909555f6ce0cf',1,'opt.h']]],
+  ['identification_20api_76',['Interface Identification API',['../group__if__api.html',1,'']]],
+  ['ieee_20802_201d_20bridge_77',['IEEE 802.1D bridge',['../group__bridgeif.html',1,'']]],
+  ['ieee_20assigned_20numbers_78',['IEEE assigned numbers',['../group__ieee.html',1,'']]],
+  ['ieee_2eh_79',['ieee.h',['../ieee_8h.html',1,'']]],
+  ['ieee802154_2eh_80',['ieee802154.h',['../ieee802154_8h.html',1,'']]],
+  ['ieee_5f802154_5fhdr_81',['ieee_802154_hdr',['../structieee__802154__hdr.html',1,'']]],
+  ['ieee_5f802154_5fpan_5fid_82',['ieee_802154_pan_id',['../structlowpan6__ieee802154__data.html#a017fc6f447215e4b65955ee7b1ed798f',1,'lowpan6_ieee802154_data']]],
+  ['if_2eh_83',['if.h',['../if_8h.html',1,'']]],
+  ['if_5fapi_2ec_84',['if_api.c',['../if__api_8c.html',1,'']]],
+  ['if_5fapi_2eh_85',['if_api.h',['../if__api_8h.html',1,'']]],
+  ['if_5fidx_86',['if_idx',['../structpbuf.html#a6a58e90efbb4751608e9a1fdbd91e697',1,'pbuf']]],
+  ['ifindiscards_87',['ifindiscards',['../structstats__mib2__netif__ctrs.html#a4a767e6b835d5ad2f9b73751de2b0947',1,'stats_mib2_netif_ctrs']]],
+  ['ifinerrors_88',['ifinerrors',['../structstats__mib2__netif__ctrs.html#afda1a14dc79bb65a33f97f9fb467ec1d',1,'stats_mib2_netif_ctrs']]],
+  ['ifinnucastpkts_89',['ifinnucastpkts',['../structstats__mib2__netif__ctrs.html#a111f08290b3c6944108237cefba066dd',1,'stats_mib2_netif_ctrs']]],
+  ['ifinoctets_90',['ifinoctets',['../structstats__mib2__netif__ctrs.html#a7e9ddf9b4a17748a9d3f041c1d24ba8e',1,'stats_mib2_netif_ctrs']]],
+  ['ifinucastpkts_91',['ifinucastpkts',['../structstats__mib2__netif__ctrs.html#a9ed42d6329a9616669ba21789fa001d8',1,'stats_mib2_netif_ctrs']]],
+  ['ifinunknownprotos_92',['ifinunknownprotos',['../structstats__mib2__netif__ctrs.html#ac34eb01b42f22b1e49ca7c9734e737aa',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutdiscards_93',['ifoutdiscards',['../structstats__mib2__netif__ctrs.html#a3a2aec508fd4466ca8bab10d8dc2c842',1,'stats_mib2_netif_ctrs']]],
+  ['ifouterrors_94',['ifouterrors',['../structstats__mib2__netif__ctrs.html#a91b60bb78759c9b655a74bb4fae3346e',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutnucastpkts_95',['ifoutnucastpkts',['../structstats__mib2__netif__ctrs.html#afd3264670c39cc0d721a35cb6650f8d7',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutoctets_96',['ifoutoctets',['../structstats__mib2__netif__ctrs.html#a24151d13a55452518e5f7832f48bd5a7',1,'stats_mib2_netif_ctrs']]],
+  ['ifoutucastpkts_97',['ifoutucastpkts',['../structstats__mib2__netif__ctrs.html#a24aba9660a2951027b23d4118b57c471',1,'stats_mib2_netif_ctrs']]],
+  ['igmp_98',['IGMP',['../group__igmp.html',1,'IGMP'],['../group__lwip__opts__igmp.html',1,'IGMP']]],
+  ['igmp_99',['igmp',['../structstats__.html#a877e369c2abef97f13492faa838e2271',1,'stats_']]],
+  ['igmp_2ec_100',['igmp.c',['../igmp_8c.html',1,'']]],
+  ['igmp_2eh_101',['igmp.h',['../igmp_8h.html',1,'(Global Namespace)'],['../prot_2igmp_8h.html',1,'(Global Namespace)']]],
+  ['igmp_5fdebug_102',['IGMP_DEBUG',['../group__lwip__opts__debugmsg.html#ga8da07508ee75704362d45eee3eb857fa',1,'opt.h']]],
+  ['igmp_5fgroup_103',['igmp_group',['../structigmp__group.html',1,'']]],
+  ['igmp_5finit_104',['igmp_init',['../igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8',1,'igmp_init(void):&#160;igmp.c'],['../igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8',1,'igmp_init(void):&#160;igmp.c']]],
+  ['igmp_5finput_105',['igmp_input',['../igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a',1,'igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest):&#160;igmp.c'],['../igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a',1,'igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest):&#160;igmp.c']]],
+  ['igmp_5fjoingroup_106',['igmp_joingroup',['../group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6',1,'igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6',1,'igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
+  ['igmp_5fjoingroup_5fnetif_107',['igmp_joingroup_netif',['../group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6',1,'igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6',1,'igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
+  ['igmp_5fleavegroup_108',['igmp_leavegroup',['../group__igmp.html#ga21c572ba7481ca41eb873923a5346544',1,'igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga21c572ba7481ca41eb873923a5346544',1,'igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
+  ['igmp_5fleavegroup_5fnetif_109',['igmp_leavegroup_netif',['../group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201',1,'igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201',1,'igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
+  ['igmp_5flookfor_5fgroup_110',['igmp_lookfor_group',['../igmp_8c.html#a695bd07cc4997aedb871b83456e18890',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c'],['../igmp_8h.html#a695bd07cc4997aedb871b83456e18890',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c']]],
+  ['igmp_5fmac_5ffilter_111',['igmp_mac_filter',['../structnetif.html#ae64e56581bf0f136601f24c5395c19f0',1,'netif']]],
+  ['igmp_5fmsg_112',['igmp_msg',['../structigmp__msg.html',1,'']]],
+  ['igmp_5freport_5fgroups_113',['igmp_report_groups',['../igmp_8c.html#af06eeba0e984aab4a67a836eab577726',1,'igmp_report_groups(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#af06eeba0e984aab4a67a836eab577726',1,'igmp_report_groups(struct netif *netif):&#160;igmp.c']]],
+  ['igmp_5fstart_114',['igmp_start',['../igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6',1,'igmp_start(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6',1,'igmp_start(struct netif *netif):&#160;igmp.c']]],
+  ['igmp_5fstats_115',['IGMP_STATS',['../group__lwip__opts__stats.html#ga4d12af1356b9fd60717984be51e27740',1,'opt.h']]],
+  ['igmp_5fstop_116',['igmp_stop',['../igmp_8c.html#afc19bd532855a64c021be08172065f84',1,'igmp_stop(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#afc19bd532855a64c021be08172065f84',1,'igmp_stop(struct netif *netif):&#160;igmp.c']]],
+  ['igmp_5ftmr_117',['igmp_tmr',['../igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1',1,'igmp_tmr(void):&#160;igmp.c'],['../igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1',1,'igmp_tmr(void):&#160;igmp.c']]],
+  ['in6addr_5fany_118',['in6addr_any',['../inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3',1,'in6addr_any:&#160;inet6.c'],['../lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3',1,'in6addr_any:&#160;inet6.c']]],
+  ['in6addr_5fany_5finit_119',['IN6ADDR_ANY_INIT',['../lwip_2inet_8h.html#a1de876a356ee05a2e9427b741f99f49c',1,'inet.h']]],
+  ['in6addr_5floopback_5finit_120',['IN6ADDR_LOOPBACK_INIT',['../lwip_2inet_8h.html#a5562c81af19ee5988ddc5a5c6153cf37',1,'inet.h']]],
+  ['inaddr_5fany_121',['INADDR_ANY',['../lwip_2inet_8h.html#a5d1940045dc2e7de552f3d4ff13a74ab',1,'inet.h']]],
+  ['inaddr_5fbroadcast_122',['INADDR_BROADCAST',['../lwip_2inet_8h.html#a4a725f61ded23ce8a7dff8e82ed51986',1,'inet.h']]],
+  ['inaddr_5floopback_123',['INADDR_LOOPBACK',['../lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378',1,'inet.h']]],
+  ['inaddr_5fnone_124',['INADDR_NONE',['../lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea',1,'inet.h']]],
+  ['index_125',['index',['../structmdns__host.html#ab5099b1bfe27698f6cc7ac36a80111a0',1,'mdns_host']]],
+  ['inet_2eh_126',['inet.h',['../compat_2posix_2arpa_2inet_8h.html',1,'(Global Namespace)'],['../lwip_2inet_8h.html',1,'(Global Namespace)']]],
+  ['inet6_2ec_127',['inet6.c',['../inet6_8c.html',1,'']]],
+  ['inet_5fchksum_2ec_128',['inet_chksum.c',['../inet__chksum_8c.html',1,'']]],
+  ['inet_5fchksum_2eh_129',['inet_chksum.h',['../inet__chksum_8h.html',1,'']]],
+  ['inet_5fchksum_5fpbuf_130',['inet_chksum_pbuf',['../inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865',1,'inet_chksum_pbuf(struct pbuf *p):&#160;inet_chksum.c'],['../inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865',1,'inet_chksum_pbuf(struct pbuf *p):&#160;inet_chksum.c']]],
+  ['inet_5fdebug_131',['INET_DEBUG',['../group__lwip__opts__debugmsg.html#ga78140cbe70258a65cb5c9e381843e4f3',1,'opt.h']]],
+  ['infrastructure_132',['Infrastructure',['../group__infrastructure.html',1,'Infrastructure'],['../group__lwip__opts__infrastructure.html',1,'Infrastructure']]],
+  ['init_2ec_133',['init.c',['../init_8c.html',1,'']]],
+  ['init_2eh_134',['init.h',['../init_8h.html',1,'']]],
+  ['initialization_135',['System initialization',['../sys_init.html',1,'']]],
+  ['inpub_5fpkt_5fid_136',['inpub_pkt_id',['../structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824',1,'mqtt_client_s']]],
+  ['input_137',['input',['../structnetif.html#a8fe4f1b7b0d710216287da9615164a5c',1,'netif']]],
+  ['instance_5foid_138',['instance_oid',['../structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23',1,'snmp_node_instance']]],
+  ['interface_139',['Loopback interface',['../group__lwip__opts__loop.html',1,'']]],
+  ['interface_20identification_20api_140',['Interface Identification API',['../group__if__api.html',1,'']]],
+  ['interface_20netif_141',['Network interface (NETIF)',['../group__netif.html',1,'']]],
+  ['internal_20memory_20pools_142',['Internal memory pools',['../group__lwip__opts__memp.html',1,'']]],
+  ['introduction_143',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
+  ['ip_144',['IP',['../group__ip.html',1,'']]],
+  ['ip_145',['ip',['../structstats__.html#a40f5b637d083896a07a3482ede23b7ed',1,'stats_']]],
+  ['ip_20address_20handling_146',['IP address handling',['../group__ipaddr.html',1,'']]],
+  ['ip_2ec_147',['ip.c',['../ip_8c.html',1,'']]],
+  ['ip_2eh_148',['ip.h',['../ip_8h.html',1,'(Global Namespace)'],['../prot_2ip_8h.html',1,'(Global Namespace)']]],
+  ['ip4_2ec_149',['ip4.c',['../ip4_8c.html',1,'']]],
+  ['ip4_2eh_150',['ip4.h',['../ip4_8h.html',1,'(Global Namespace)'],['../prot_2ip4_8h.html',1,'(Global Namespace)']]],
+  ['ip4_5faddr_151',['IP4_ADDR',['../ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974',1,'ip4_addr.h']]],
+  ['ip4_5faddr_152',['ip4_addr',['../structip4__addr.html',1,'']]],
+  ['ip4_5faddr_2ec_153',['ip4_addr.c',['../ip4__addr_8c.html',1,'']]],
+  ['ip4_5faddr_2eh_154',['ip4_addr.h',['../ip4__addr_8h.html',1,'']]],
+  ['ip4_5faddr_5fany_155',['IP4_ADDR_ANY',['../group__ip4addr.html#gae920b6e81610a38cf9ada52118807eff',1,'ip_addr.h']]],
+  ['ip4_5faddr_5fany4_156',['IP4_ADDR_ANY4',['../group__ip4addr.html#gaa3f65a42b68149e96e618600b2ca2e42',1,'ip_addr.h']]],
+  ['ip4_5faddr_5fcmp_157',['ip4_addr_cmp',['../ip4__addr_8h.html#a59494c562c62fdf62a6c9c6a66a50fb3',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fcopy_158',['ip4_addr_copy',['../ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fget_5fnetwork_159',['ip4_addr_get_network',['../ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fget_5fu32_160',['ip4_addr_get_u32',['../ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fisbroadcast_5fu32_161',['ip4_addr_isbroadcast_u32',['../ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421',1,'ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif):&#160;ip4_addr.c'],['../ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421',1,'ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif):&#160;ip4_addr.c']]],
+  ['ip4_5faddr_5fisloopback_162',['ip4_addr_isloopback',['../ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fnet_5feq_163',['ip4_addr_net_eq',['../ip4__addr_8h.html#a95d05df9201602fc873a97fb61fd1134',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fnetcmp_164',['ip4_addr_netcmp',['../ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fnetmask_5fvalid_165',['ip4_addr_netmask_valid',['../ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071',1,'ip4_addr_netmask_valid(u32_t netmask):&#160;ip4_addr.c'],['../ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071',1,'ip4_addr_netmask_valid(u32_t netmask):&#160;ip4_addr.c']]],
+  ['ip4_5faddr_5fpacked_166',['ip4_addr_packed',['../structip4__addr__packed.html',1,'']]],
+  ['ip4_5faddr_5fset_167',['ip4_addr_set',['../ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fany_168',['ip4_addr_set_any',['../ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fhton_169',['ip4_addr_set_hton',['../ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5floopback_170',['ip4_addr_set_loopback',['../ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fu32_171',['ip4_addr_set_u32',['../ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fzero_172',['ip4_addr_set_zero',['../ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5ft_173',['ip4_addr_t',['../ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fwordaligned_174',['ip4_addr_wordaligned',['../structip4__addr__wordaligned.html',1,'']]],
+  ['ip4_5fcurrent_5fdest_5faddr_175',['ip4_current_dest_addr',['../ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720',1,'ip.h']]],
+  ['ip4_5fcurrent_5fheader_176',['ip4_current_header',['../ip_8h.html#a3ce482b7e08282effd670001198ecd87',1,'ip.h']]],
+  ['ip4_5fcurrent_5fsrc_5faddr_177',['ip4_current_src_addr',['../ip_8h.html#ad2a62f96b9431a79f0258dc13058b160',1,'ip.h']]],
+  ['ip4_5ffrag_178',['ip4_frag',['../ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c',1,'ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest):&#160;ip4_frag.c'],['../ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c',1,'ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest):&#160;ip4_frag.c']]],
+  ['ip4_5ffrag_2ec_179',['ip4_frag.c',['../ip4__frag_8c.html',1,'']]],
+  ['ip4_5ffrag_2eh_180',['ip4_frag.h',['../ip4__frag_8h.html',1,'']]],
+  ['ip4_5finput_181',['ip4_input',['../ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b',1,'ip4_input(struct pbuf *p, struct netif *inp):&#160;ip4.c'],['../ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b',1,'ip4_input(struct pbuf *p, struct netif *inp):&#160;ip4.c']]],
+  ['ip4_5foutput_182',['ip4_output',['../ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8',1,'ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto):&#160;ip4.c'],['../ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8',1,'ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto):&#160;ip4.c']]],
+  ['ip4_5foutput_5fif_183',['ip4_output_if',['../ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917',1,'ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c'],['../ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917',1,'ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c']]],
+  ['ip4_5foutput_5fif_5fopt_184',['ip4_output_if_opt',['../ip4_8c.html#a0d912e400875396792a12ea443ecc1cf',1,'ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c'],['../ip4_8h.html#a0d912e400875396792a12ea443ecc1cf',1,'ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c']]],
+  ['ip4_5foutput_5fif_5fopt_5fsrc_185',['ip4_output_if_opt_src',['../ip4_8c.html#accd56b095730de4ad56728bfcb349940',1,'ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c'],['../ip4_8h.html#accd56b095730de4ad56728bfcb349940',1,'ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c']]],
+  ['ip4_5foutput_5fif_5fsrc_186',['ip4_output_if_src',['../ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7',1,'ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c'],['../ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7',1,'ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c']]],
+  ['ip4_5freass_187',['ip4_reass',['../ip4__frag_8c.html#aa73b0bc1e6e38c47548319af47f51052',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c'],['../ip4__frag_8h.html#aa73b0bc1e6e38c47548319af47f51052',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c']]],
+  ['ip4_5froute_188',['ip4_route',['../ip4_8c.html#a5bbbec93cef9133ed07d8c2cd9bc80f3',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#a5bbbec93cef9133ed07d8c2cd9bc80f3',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c']]],
+  ['ip4_5froute_5fsrc_189',['ip4_route_src',['../ip4_8c.html#ac04e6e67e8f0aff18dd4cf8a2439f56e',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#ac04e6e67e8f0aff18dd4cf8a2439f56e',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c']]],
+  ['ip4_5fset_5fdefault_5fmulticast_5fnetif_190',['ip4_set_default_multicast_netif',['../group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420',1,'ip4_set_default_multicast_netif(struct netif *default_multicast_netif):&#160;ip4.c'],['../group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420',1,'ip4_set_default_multicast_netif(struct netif *default_multicast_netif):&#160;ip4.c']]],
+  ['ip4addr_5faton_191',['ip4addr_aton',['../ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a',1,'ip4addr_aton(const char *cp, ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a',1,'ip4addr_aton(const char *cp, ip4_addr_t *addr):&#160;ip4_addr.c']]],
+  ['ip4addr_5fntoa_192',['ip4addr_ntoa',['../ip4__addr_8c.html#af01e406c5f44a325d779c4b4282a1744',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#af01e406c5f44a325d779c4b4282a1744',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c']]],
+  ['ip4addr_5fntoa_5fr_193',['ip4addr_ntoa_r',['../ip4__addr_8c.html#a3abcfd31a756ccc91ceef5e59216f2d4',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a3abcfd31a756ccc91ceef5e59216f2d4',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c']]],
+  ['ip6_194',['ip6',['../structstats__.html#afc0942a5bc26735cf059099636b85336',1,'stats_']]],
+  ['ip6_2ec_195',['ip6.c',['../ip6_8c.html',1,'']]],
+  ['ip6_2eh_196',['ip6.h',['../ip6_8h.html',1,'(Global Namespace)'],['../prot_2ip6_8h.html',1,'(Global Namespace)']]],
+  ['ip6_5faddr_197',['IP6_ADDR',['../ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_198',['ip6_addr',['../structip6__addr.html',1,'ip6_addr'],['../structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4',1,'netif::ip6_addr']]],
+  ['ip6_5faddr_2ec_199',['ip6_addr.c',['../ip6__addr_8c.html',1,'']]],
+  ['ip6_5faddr_2eh_200',['ip6_addr.h',['../ip6__addr_8h.html',1,'']]],
+  ['ip6_5faddr_5fany_201',['IP6_ADDR_ANY',['../group__ip6addr.html#ga5181d2cb6b9254eb5ad4137f7b3635a0',1,'ip_addr.h']]],
+  ['ip6_5faddr_5fany6_202',['IP6_ADDR_ANY6',['../group__ip6addr.html#ga953cdd2592764ba2e6e021aea350ad43',1,'ip_addr.h']]],
+  ['ip6_5faddr_5fassign_5fzone_203',['ip6_addr_assign_zone',['../group__ip6__zones.html#ga1040a3d67498a1ef617bda8d9e0ba3a5',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fblock1_204',['IP6_ADDR_BLOCK1',['../ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock2_205',['IP6_ADDR_BLOCK2',['../ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock3_206',['IP6_ADDR_BLOCK3',['../ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock4_207',['IP6_ADDR_BLOCK4',['../ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock5_208',['IP6_ADDR_BLOCK5',['../ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock6_209',['IP6_ADDR_BLOCK6',['../ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock7_210',['IP6_ADDR_BLOCK7',['../ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock8_211',['IP6_ADDR_BLOCK8',['../ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fclear_5fzone_212',['ip6_addr_clear_zone',['../group__ip6__zones.html#gae0249db6cd2687f2dbc445e7778d37ad',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fcmp_213',['ip6_addr_cmp',['../ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp_5fpacked_214',['ip6_addr_cmp_packed',['../ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp_5fzone_215',['ip6_addr_cmp_zone',['../group__ip6__zones.html#gac01d0bad0a682dcc239ba3d5695e0648',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fcmp_5fzoneless_216',['ip6_addr_cmp_zoneless',['../ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_217',['ip6_addr_copy',['../ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5ffrom_5fpacked_218',['ip6_addr_copy_from_packed',['../ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5fto_5fpacked_219',['ip6_addr_copy_to_packed',['../ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5fzone_220',['ip6_addr_copy_zone',['../group__ip6__zones.html#ga7347729485d837bcff85ae4731bbf5c4',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5feq_221',['ip6_addr_eq',['../ip6__addr_8h.html#a9ea0b6b837baff1e1e62cccd4f17d50e',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fequals_5fzone_222',['ip6_addr_equals_zone',['../group__ip6__zones.html#gaeead8379cc3fd4c257be0bb654994a8f',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fhas_5fscope_223',['ip6_addr_has_scope',['../group__ip6__zones.html#gaa5332bb3b70c1a9acba1bea3ea0ecb90',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fhas_5fzone_224',['ip6_addr_has_zone',['../group__ip6__zones.html#ga8727c081b6a80992881d481d0680db78',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5flacks_5fzone_225',['ip6_addr_lacks_zone',['../group__ip6__zones.html#gad963bf3e9695ba898271e314975f5c97',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fnet_5feq_226',['ip6_addr_net_eq',['../ip6__addr_8h.html#a9a983c7d613ab45e37aaf66c067a0c7a',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnet_5fzoneless_5feq_227',['ip6_addr_net_zoneless_eq',['../ip6__addr_8h.html#afc9d2b8d0a05f2ff23ab3b7fd3bf8229',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnetcmp_228',['ip6_addr_netcmp',['../ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnetcmp_5fzoneless_229',['ip6_addr_netcmp_zoneless',['../ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fpacked_230',['ip6_addr_packed',['../structip6__addr__packed.html',1,'']]],
+  ['ip6_5faddr_5fpacked_5feq_231',['ip6_addr_packed_eq',['../ip6__addr_8h.html#aa324ac65d537997ebaaed78bd40f6da9',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fpart_232',['IP6_ADDR_PART',['../ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fselect_5fzone_233',['ip6_addr_select_zone',['../group__ip6__zones.html#gac83f3e7c8d65d3c784bffc9dec29b70c',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fset_234',['ip6_addr_set',['../ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fany_235',['ip6_addr_set_any',['../ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fhton_236',['ip6_addr_set_hton',['../ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5floopback_237',['ip6_addr_set_loopback',['../ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fzero_238',['ip6_addr_set_zero',['../ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fzone_239',['ip6_addr_set_zone',['../group__ip6__zones.html#ga213310b303dd050da7856d67da72abd6',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fstate_240',['ip6_addr_state',['../structnetif.html#a54e81344084e9840a51cc4abab3b059b',1,'netif']]],
+  ['ip6_5faddr_5ft_241',['ip6_addr_t',['../ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5ftest_5fzone_242',['ip6_addr_test_zone',['../group__ip6__zones.html#gac3ec5f94e1cd62b1237efca3723dc06e',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fvalid_5flife_243',['ip6_addr_valid_life',['../structnetif.html#a26f6e26d4a54c998716c10b7b85c8230',1,'netif']]],
+  ['ip6_5faddr_5fzone_244',['ip6_addr_zone',['../group__ip6__zones.html#gaee83e12649fa9706857c9ad8f9ef8634',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fzone_5feq_245',['ip6_addr_zone_eq',['../group__ip6__zones.html#gabc6d5f833b2abef31aa602dc11ace0a9',1,'ip6_zone.h']]],
+  ['ip6_5faddr_5fzoneless_5feq_246',['ip6_addr_zoneless_eq',['../ip6__addr_8h.html#a811d8a2aa6417ae22a7a46b27d9ead26',1,'ip6_addr.h']]],
+  ['ip6_5fautoconfig_5fenabled_247',['ip6_autoconfig_enabled',['../structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f',1,'netif']]],
+  ['ip6_5fchksum_5fpseudo_248',['ip6_chksum_pseudo',['../inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88',1,'ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c'],['../inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88',1,'ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c']]],
+  ['ip6_5fchksum_5fpseudo_5fpartial_249',['ip6_chksum_pseudo_partial',['../inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b',1,'ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c'],['../inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b',1,'ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c']]],
+  ['ip6_5fcurrent_5fdest_5faddr_250',['ip6_current_dest_addr',['../ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0',1,'ip.h']]],
+  ['ip6_5fcurrent_5fheader_251',['ip6_current_header',['../ip_8h.html#af9bf74750c9d7a219ee88d240300fe69',1,'ip.h']]],
+  ['ip6_5fcurrent_5fsrc_5faddr_252',['ip6_current_src_addr',['../ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245',1,'ip.h']]],
+  ['ip6_5fdebug_253',['IP6_DEBUG',['../group__lwip__opts__debugmsg.html#gac2f9726756b78d4d7c425b0422a776ce',1,'opt.h']]],
+  ['ip6_5ffrag_254',['ip6_frag',['../structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf',1,'stats_::ip6_frag'],['../ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37',1,'ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest):&#160;ip6_frag.c'],['../ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37',1,'ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest):&#160;ip6_frag.c']]],
+  ['ip6_5ffrag_2ec_255',['ip6_frag.c',['../ip6__frag_8c.html',1,'']]],
+  ['ip6_5ffrag_2eh_256',['ip6_frag.h',['../ip6__frag_8h.html',1,'']]],
+  ['ip6_5ffrag_5fstats_257',['IP6_FRAG_STATS',['../group__lwip__opts__stats.html#gaaa08a181c11ff8b471549e8f52c9939b',1,'opt.h']]],
+  ['ip6_5fhdr_258',['ip6_hdr',['../structip6__hdr.html',1,'']]],
+  ['ip6_5finput_259',['ip6_input',['../ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094',1,'ip6_input(struct pbuf *p, struct netif *inp):&#160;ip6.c'],['../ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094',1,'ip6_input(struct pbuf *p, struct netif *inp):&#160;ip6.c']]],
+  ['ip6_5fmulticast_260',['IP6_MULTICAST',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfea70cda997b66f3e120e925c5a41904809',1,'ip6_zone.h']]],
+  ['ip6_5fno_5fzone_261',['IP6_NO_ZONE',['../group__ip6__zones.html#ga2049167d1715b9a9cf2730e122c0d4fb',1,'ip6_zone.h']]],
+  ['ip6_5foptions_5fadd_5fhbh_5fra_262',['ip6_options_add_hbh_ra',['../ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e',1,'ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value):&#160;ip6.c'],['../ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e',1,'ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value):&#160;ip6.c']]],
+  ['ip6_5foutput_263',['ip6_output',['../ip6_8c.html#aec695e64536ac744e616c997deb84cda',1,'ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth):&#160;ip6.c'],['../ip6_8h.html#aec695e64536ac744e616c997deb84cda',1,'ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth):&#160;ip6.c']]],
+  ['ip6_5foutput_5fif_264',['ip6_output_if',['../ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4',1,'ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c'],['../ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4',1,'ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c']]],
+  ['ip6_5foutput_5fif_5fsrc_265',['ip6_output_if_src',['../ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56',1,'ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c'],['../ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56',1,'ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c']]],
+  ['ip6_5freass_266',['ip6_reass',['../ip6__frag_8c.html#aa29dd0a8b5622216643581f243cd423a',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c'],['../ip6__frag_8h.html#aa29dd0a8b5622216643581f243cd423a',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c']]],
+  ['ip6_5freass_5fhelper_267',['ip6_reass_helper',['../structip6__reass__helper.html',1,'']]],
+  ['ip6_5freass_5ftmr_5finterval_268',['IP6_REASS_TMR_INTERVAL',['../ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2',1,'ip6_frag.h']]],
+  ['ip6_5freassdata_269',['ip6_reassdata',['../structip6__reassdata.html',1,'']]],
+  ['ip6_5froute_270',['ip6_route',['../ip6_8c.html#a519686a2c3beb689bf1d3380c4e5efb1',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c'],['../ip6_8h.html#a519686a2c3beb689bf1d3380c4e5efb1',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c']]],
+  ['ip6_5fselect_5fsource_5faddress_271',['ip6_select_source_address',['../group__ip6.html#ga1224b474149331702ae5aec24dd14caa',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c'],['../group__ip6.html#ga1224b474149331702ae5aec24dd14caa',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c']]],
+  ['ip6_5fstats_272',['IP6_STATS',['../group__lwip__opts__stats.html#ga6a211b787c97bce3af4273b29c95d9c2',1,'opt.h']]],
+  ['ip6_5funicast_273',['IP6_UNICAST',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaacbcc65569837d437eea53c3bbb017b0',1,'ip6_zone.h']]],
+  ['ip6_5funknown_274',['IP6_UNKNOWN',['../group__ip6__zones.html#gga1993c4b6a297b6e92d80a9ce46ddedfeaddb1d298ce96cea5ccc8e1397443dbb8',1,'ip6_zone.h']]],
+  ['ip6_5fzone_2eh_275',['ip6_zone.h',['../ip6__zone_8h.html',1,'']]],
+  ['ip6addr_5faton_276',['ip6addr_aton',['../ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e',1,'ip6addr_aton(const char *cp, ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e',1,'ip6addr_aton(const char *cp, ip6_addr_t *addr):&#160;ip6_addr.c']]],
+  ['ip6addr_5fntoa_277',['ip6addr_ntoa',['../ip6__addr_8c.html#ab153e5b58a5674e5e1bacdbbc0934c44',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#ab153e5b58a5674e5e1bacdbbc0934c44',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c']]],
+  ['ip6addr_5fntoa_5fr_278',['ip6addr_ntoa_r',['../ip6__addr_8c.html#ac0470fb6b6fdbf986a20e523870e6f2e',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c'],['../ip6__addr_8h.html#ac0470fb6b6fdbf986a20e523870e6f2e',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c']]],
+  ['ip_5f2_5fip4_279',['ip_2_ip4',['../group__ip4addr.html#gad7268a496b7e3f872efecd859eba6f03',1,'ip_addr.h']]],
+  ['ip_5f2_5fip6_280',['ip_2_ip6',['../group__ip6addr.html#ga06e75bcd198012b5ba39480c233608bd',1,'ip_addr.h']]],
+  ['ip_5faccept_5flink_5flayer_5faddressed_5fport_281',['IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT',['../ip4_8c.html#a185c7d6380711847105430931692b267',1,'ip4.c']]],
+  ['ip_5faddr_282',['ip_addr',['../structip__addr.html',1,'ip_addr'],['../structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866',1,'netif::ip_addr']]],
+  ['ip_5faddr_2eh_283',['ip_addr.h',['../ip__addr_8h.html',1,'']]],
+  ['ip_5faddr_5fany_284',['IP_ADDR_ANY',['../group__ip4addr.html#ga3e5e67b7292b156034560fef2202776c',1,'ip_addr.h']]],
+  ['ip_5faddr_5fcmp_285',['ip_addr_cmp',['../group__ipaddr.html#ga008c9c92d770cc030ea054e6b259835a',1,'ip_addr.h']]],
+  ['ip_5faddr_5fcmp_5fzoneless_286',['ip_addr_cmp_zoneless',['../group__ipaddr.html#gadb66f6d5fa926ed4b0e69db58dffcbe4',1,'ip_addr.h']]],
+  ['ip_5faddr_5feq_287',['ip_addr_eq',['../group__ipaddr.html#ga5b40158bdffa4b0c81c4ee77066e6b28',1,'ip_addr.h']]],
+  ['ip_5faddr_5fisany_288',['ip_addr_isany',['../group__ipaddr.html#ga279118890e6a90aa740051fb8b0cc5f4',1,'ip_addr.h']]],
+  ['ip_5faddr_5fisany_5fval_289',['ip_addr_isany_val',['../group__ipaddr.html#gacd8f5aa151cff966fd28368b85f38c05',1,'ip_addr.h']]],
+  ['ip_5faddr_5fisbroadcast_290',['ip_addr_isbroadcast',['../group__ipaddr.html#gaa3345706e3aa8b32dd630c195b053e75',1,'ip_addr.h']]],
+  ['ip_5faddr_5fislinklocal_291',['ip_addr_islinklocal',['../group__ipaddr.html#ga33bc079baaf513a9a7381b9531a1f653',1,'ip_addr.h']]],
+  ['ip_5faddr_5fisloopback_292',['ip_addr_isloopback',['../group__ipaddr.html#ga0fc8bf6662809274750868683b3a422e',1,'ip_addr.h']]],
+  ['ip_5faddr_5fismulticast_293',['ip_addr_ismulticast',['../group__ipaddr.html#ga2170d3ee13dd22722222228e7b1c5752',1,'ip_addr.h']]],
+  ['ip_5faddr_5fnet_5feq_294',['ip_addr_net_eq',['../group__ipaddr.html#gad1bbbe4c93ea2368663e90814953b929',1,'ip_addr.h']]],
+  ['ip_5faddr_5fnetcmp_295',['ip_addr_netcmp',['../group__ipaddr.html#ga3a2123f0bbf6fe843c8542e349c680eb',1,'ip_addr.h']]],
+  ['ip_5faddr_5ft_296',['ip_addr_t',['../group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e',1,'ip_addr.h']]],
+  ['ip_5faddr_5fzoneless_5feq_297',['ip_addr_zoneless_eq',['../group__ipaddr.html#ga8ac2686417ec2974bb0b3fc6ee0ee1a7',1,'ip_addr.h']]],
+  ['ip_5fany_5ftype_298',['IP_ANY_TYPE',['../group__ipaddr.html#gabe43b154533b73585c4e58f568370ede',1,'ip_addr.h']]],
+  ['ip_5fcurrent_5fdest_5faddr_299',['ip_current_dest_addr',['../ip_8h.html#a9135977868017c3deeec86b525e13997',1,'ip_current_dest_addr:&#160;ip.h'],['../ip_8h.html#a9135977868017c3deeec86b525e13997',1,'ip_current_dest_addr:&#160;ip.h']]],
+  ['ip_5fcurrent_5fheader_5fproto_300',['ip_current_header_proto',['../ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f',1,'ip.h']]],
+  ['ip_5fcurrent_5fheader_5ftot_5flen_301',['ip_current_header_tot_len',['../ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2',1,'ip.h']]],
+  ['ip_5fcurrent_5finput_5fnetif_302',['ip_current_input_netif',['../ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4',1,'ip.h']]],
+  ['ip_5fcurrent_5fis_5fv6_303',['ip_current_is_v6',['../ip_8h.html#abc56623d434a204298a4e98352af1c9d',1,'ip.h']]],
+  ['ip_5fcurrent_5fnetif_304',['ip_current_netif',['../ip_8h.html#aabecef3c7653a9767c79245c44fcab9f',1,'ip.h']]],
+  ['ip_5fcurrent_5fsrc_5faddr_305',['ip_current_src_addr',['../ip_8h.html#a4e35b7692c228c98e738892f0a215647',1,'ip_current_src_addr:&#160;ip.h'],['../ip_8h.html#a4e35b7692c228c98e738892f0a215647',1,'ip_current_src_addr:&#160;ip.h']]],
+  ['ip_5fdata_306',['ip_data',['../ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data:&#160;ip.c'],['../ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data:&#160;ip.c']]],
+  ['ip_5fdebug_307',['IP_DEBUG',['../group__lwip__opts__debugmsg.html#ga5d3348778951e7bc5cd397c6575eef3a',1,'opt.h']]],
+  ['ip_5fdefault_5fttl_308',['IP_DEFAULT_TTL',['../group__lwip__opts__ipv4.html#ga556b9b58fd02c0fdd126791baef77411',1,'opt.h']]],
+  ['ip_5fforward_309',['IP_FORWARD',['../group__lwip__opts__ipv4.html#ga881d32ff5ee02af01f758953f1b51d59',1,'opt.h']]],
+  ['ip_5fforward_5fallow_5ftx_5fon_5frx_5fnetif_310',['IP_FORWARD_ALLOW_TX_ON_RX_NETIF',['../group__lwip__opts__ipv4.html#ga9e761df07c4e93901858741d4771dbc7',1,'opt.h']]],
+  ['ip_5ffrag_311',['IP_FRAG',['../group__lwip__opts__ipv4.html#gaf85c8bdd5035b6cada790b4cc2a209a4',1,'opt.h']]],
+  ['ip_5ffrag_312',['ip_frag',['../structstats__.html#a81fcccf03ab0d4e31423f39d0c880302',1,'stats_']]],
+  ['ip_5fget_5foption_313',['ip_get_option',['../ip_8h.html#a26e077f52de4a97ff89c02415c084518',1,'ip.h']]],
+  ['ip_5fglobals_314',['ip_globals',['../structip__globals.html',1,'']]],
+  ['ip_5fhdr_5fget_5fversion_315',['IP_HDR_GET_VERSION',['../prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374',1,'ip.h']]],
+  ['ip_5finput_316',['ip_input',['../group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26',1,'ip_input(struct pbuf *p, struct netif *inp):&#160;ip.c'],['../group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26',1,'ip_input(struct pbuf *p, struct netif *inp):&#160;ip.c']]],
+  ['ip_5fnetif_5fget_5flocal_5fip_317',['ip_netif_get_local_ip',['../group__ip.html#ga4a4b9439c91eeec719692dfe10f14af0',1,'ip.h']]],
+  ['ip_5fnext_5fheader_5fptr_318',['ip_next_header_ptr',['../ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26',1,'ip.h']]],
+  ['ip_5fntoa_319',['ip_ntoa',['../ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1',1,'ip4_addr.h']]],
+  ['ip_5foptions_5fallowed_320',['IP_OPTIONS_ALLOWED',['../group__lwip__opts__ipv4.html#gaa956b0167c37a2265b55e2d0204a3933',1,'opt.h']]],
+  ['ip_5foptions_5fsend_321',['IP_OPTIONS_SEND',['../ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824',1,'ip4.h']]],
+  ['ip_5foutput_322',['ip_output',['../group__ip.html#gaf056aa43789c2964f091f8349bb83730',1,'ip.h']]],
+  ['ip_5foutput_5fhinted_323',['ip_output_hinted',['../ip_8h.html#accbc01f37dd426a66de41693a5450207',1,'ip.h']]],
+  ['ip_5foutput_5fif_324',['ip_output_if',['../group__ip.html#ga51cd772c3f6fca7c0363dca1fce7b250',1,'ip.h']]],
+  ['ip_5foutput_5fif_5fhdrincl_325',['ip_output_if_hdrincl',['../ip_8h.html#aac608b92f8f226c3574d6bb855f12496',1,'ip.h']]],
+  ['ip_5foutput_5fif_5fsrc_326',['ip_output_if_src',['../group__ip.html#gab9d45f846f796bd6ce1e0c780c392765',1,'ip.h']]],
+  ['ip_5fpcb_327',['IP_PCB',['../ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53',1,'ip.h']]],
+  ['ip_5freass_5fcheck_5foverlap_328',['IP_REASS_CHECK_OVERLAP',['../ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe',1,'IP_REASS_CHECK_OVERLAP:&#160;ip4_frag.c'],['../ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe',1,'IP_REASS_CHECK_OVERLAP:&#160;ip6_frag.c']]],
+  ['ip_5freass_5fdebug_329',['IP_REASS_DEBUG',['../group__lwip__opts__debugmsg.html#ga4cdc3e9a4a1c01d1f7f0e723a1b2ec33',1,'opt.h']]],
+  ['ip_5freass_5ffree_5foldest_330',['IP_REASS_FREE_OLDEST',['../ip4__frag_8c.html#a510934accf149433bdcf683993e79080',1,'IP_REASS_FREE_OLDEST:&#160;ip4_frag.c'],['../ip6__frag_8c.html#a510934accf149433bdcf683993e79080',1,'IP_REASS_FREE_OLDEST:&#160;ip6_frag.c']]],
+  ['ip_5freass_5fhelper_331',['ip_reass_helper',['../structip__reass__helper.html',1,'']]],
+  ['ip_5freass_5fmax_5fpbufs_332',['IP_REASS_MAX_PBUFS',['../group__lwip__opts__ipv4.html#ga29084a46d7d4be30e8029d356bca0394',1,'opt.h']]],
+  ['ip_5freass_5fmaxage_333',['IP_REASS_MAXAGE',['../group__lwip__opts__ipv4.html#gad41122bd0b5485a18a4415c8f953727b',1,'opt.h']]],
+  ['ip_5freass_5ftmr_334',['ip_reass_tmr',['../ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88',1,'ip_reass_tmr(void):&#160;ip4_frag.c'],['../ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88',1,'ip_reass_tmr(void):&#160;ip4_frag.c']]],
+  ['ip_5freassdata_335',['ip_reassdata',['../structip__reassdata.html',1,'']]],
+  ['ip_5freassembly_336',['IP_REASSEMBLY',['../group__lwip__opts__ipv4.html#ga1a31ab0e0f37b17d40fa7c35bc2c4f69',1,'opt.h']]],
+  ['ip_5freset_5foption_337',['ip_reset_option',['../ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc',1,'ip.h']]],
+  ['ip_5froute_338',['ip_route',['../group__ip.html#ga0fa3afc2c00aea346889b476650adee3',1,'ip.h']]],
+  ['ip_5fset_5foption_339',['ip_set_option',['../ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93',1,'ip.h']]],
+  ['ip_5fsof_5fbroadcast_340',['IP_SOF_BROADCAST',['../group__lwip__opts__ipv4.html#ga0b2c993fd940f5774108298933310384',1,'opt.h']]],
+  ['ip_5fsof_5fbroadcast_5frecv_341',['IP_SOF_BROADCAST_RECV',['../group__lwip__opts__ipv4.html#ga0f1fbf42d3344bf87cd056d48ddca3db',1,'opt.h']]],
+  ['ip_5fstats_342',['IP_STATS',['../group__lwip__opts__stats.html#gaf50575a4895e26ea2c01d1f2269487be',1,'opt.h']]],
+  ['ipaddr_343',['ipaddr',['../structacd.html#af2c795ee5b09085bca592d830a388448',1,'acd']]],
+  ['ipaddr6_5fzone_5finit_344',['IPADDR6_ZONE_INIT',['../group__ip6__zones.html#gaa090e54f632c8512a7991307e011c1b9',1,'ip6_zone.h']]],
+  ['ipaddr_5faddr_345',['ipaddr_addr',['../ip4__addr_8c.html#a2c05f9138da41115978409e547df9670',1,'ipaddr_addr(const char *cp):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a2c05f9138da41115978409e547df9670',1,'ipaddr_addr(const char *cp):&#160;ip4_addr.c']]],
+  ['ipaddr_5fany_346',['IPADDR_ANY',['../ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2',1,'ip4_addr.h']]],
+  ['ipaddr_5faton_347',['ipaddr_aton',['../group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151',1,'ipaddr_aton(const char *cp, ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151',1,'ipaddr_aton(const char *cp, ip_addr_t *addr):&#160;ip.c']]],
+  ['ipaddr_5fbroadcast_348',['IPADDR_BROADCAST',['../ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a',1,'ip4_addr.h']]],
+  ['ipaddr_5floopback_349',['IPADDR_LOOPBACK',['../ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e',1,'ip4_addr.h']]],
+  ['ipaddr_5fnone_350',['IPADDR_NONE',['../ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544',1,'ip4_addr.h']]],
+  ['ipaddr_5fntoa_351',['ipaddr_ntoa',['../group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c']]],
+  ['ipaddr_5fntoa_5fr_352',['ipaddr_ntoa_r',['../group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c'],['../group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c']]],
+  ['ipaddr_5ftype_5fany_353',['IPADDR_TYPE_ANY',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cac6b2c99cf920e08efcb55dc40e42944e',1,'ip_addr.h']]],
+  ['ipaddr_5ftype_5fv4_354',['IPADDR_TYPE_V4',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585cace47fa82608deeb1c1c7c2c891eb5049',1,'ip_addr.h']]],
+  ['ipaddr_5ftype_5fv6_355',['IPADDR_TYPE_V6',['../group__ipaddr.html#ggaf2142f0dfdcc938e2db16aa745ed585caae510fd8ec7fe405b594b57af61f9a02',1,'ip_addr.h']]],
+  ['ipaddr_5fwordaligned_5fcopy_5ffrom_5fip4_5faddr_5ft_356',['IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419',1,'etharp.h']]],
+  ['ipaddr_5fwordaligned_5fcopy_5fto_5fip4_5faddr_5ft_357',['IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030',1,'etharp.h']]],
+  ['iperf_20server_358',['Iperf server',['../group__iperf.html',1,'']]],
+  ['ipfrag_5fstats_359',['IPFRAG_STATS',['../group__lwip__opts__stats.html#gac9a4fbb46df3c0f479a334d0e34fb74f',1,'opt.h']]],
+  ['ipv4_360',['IPv4',['../group__ip4.html',1,'IPv4'],['../group__lwip__opts__ipv4.html',1,'IPv4']]],
+  ['ipv4_361',['ipv4',['../structmdns__host.html#a9d0df33231cd8b50e25aa1fa4ebdc291',1,'mdns_host']]],
+  ['ipv4_20address_20handling_362',['IPv4 address handling',['../group__netif__ip4.html',1,'']]],
+  ['ipv4_20only_363',['IPv4 only',['../group__ip4addr.html',1,'']]],
+  ['ipv4_5fchanged_5fs_364',['ipv4_changed_s',['../structnetif__ext__callback__args__t_1_1ipv4__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['ipv6_365',['IPv6',['../group__ip6.html',1,'IPv6'],['../group__lwip__opts__ipv6.html',1,'IPv6']]],
+  ['ipv6_366',['ipv6',['../structmdns__host.html#a16016021ddabb1dc182f36c7185bf283',1,'mdns_host']]],
+  ['ipv6_20address_20handling_367',['IPv6 address handling',['../group__netif__ip6.html',1,'']]],
+  ['ipv6_20only_368',['IPv6 only',['../group__ip6addr.html',1,'']]],
+  ['ipv6_20zones_369',['IPv6 Zones',['../group__ip6__zones.html',1,'']]],
+  ['ipv6_5faddr_5fstate_5fchanged_5fs_370',['ipv6_addr_state_changed_s',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['ipv6_5fcustom_5fscopes_371',['IPV6_CUSTOM_SCOPES',['../group__ip6__zones.html#gae677a65970f4b667156b256dd9a4924b',1,'ip6_zone.h']]],
+  ['ipv6_5ffrag_5fcopyheader_372',['IPV6_FRAG_COPYHEADER',['../ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7',1,'ip6_frag.h']]],
+  ['ipv6_5freass_5fmaxage_373',['IPV6_REASS_MAXAGE',['../group__lwip__opts__ipv6.html#ga8adc0b7dbedd279387a21588f0e2c969',1,'opt.h']]],
+  ['ipv6_5fset_5fs_374',['ipv6_set_s',['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html',1,'netif_ext_callback_args_t']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_d.js b/doc/doxygen/output/html/search/all_d.js
index 7b50839..0a36a17 100644
--- a/doc/doxygen/output/html/search/all_d.js
+++ b/doc/doxygen/output/html/search/all_d.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['jl_0',['jl',['../structapi__msg.html#aa3d64205c25e953b168447e6aa21ee9e',1,'api_msg']]],
+  ['jl_0',['jl',['../structapi__msg.html#a718b0166a9956c608188e8f99c663203',1,'api_msg']]],
   ['jumpers_1',['jumpers',['../structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683',1,'netbios_answer']]]
 ];
diff --git a/doc/doxygen/output/html/search/all_f.js b/doc/doxygen/output/html/search/all_f.js
index 517eb34..59f93f8 100644
--- a/doc/doxygen/output/html/search/all_f.js
+++ b/doc/doxygen/output/html/search/all_f.js
@@ -1,12 +1,12 @@
 var searchData=
 [
   ['last_5freporter_5fflag_0',['last_reporter_flag',['../structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874',1,'igmp_group::last_reporter_flag'],['../structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b',1,'mld_group::last_reporter_flag']]],
-  ['lastconflict_1',['lastconflict',['../structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55',1,'autoip']]],
+  ['lastconflict_1',['lastconflict',['../structacd.html#a9dd4e1b82dd3e97717f011dbf862a58e',1,'acd']]],
   ['lastdata_2',['lastdata',['../structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1',1,'lwip_sock']]],
   ['layer_3',['layer',['../group__sys__os.html',1,'OS abstraction layer'],['../group__sys__layer.html',1,'Porting (system abstraction layer)'],['../group__altcp__tls.html',1,'TLS layer']]],
   ['layered_20tcp_20functions_4',['Application layered TCP Functions',['../group__altcp.html',1,'']]],
   ['layered_20tcp_20introduction_5',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
-  ['legacy_5fquery_6',['legacy_query',['../structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65',1,'mdns_outpacket']]],
+  ['legacy_5fquery_6',['legacy_query',['../structmdns__outmsg.html#aab2d5c566dcd83874d9cc77cd5fc7253',1,'mdns_outmsg']]],
   ['len_7',['len',['../structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd',1,'netvector::len'],['../structpbuf.html#a6f82449625e36e294f5d210268c0703f',1,'pbuf::len'],['../structapi__msg.html#a40624c398d1939bfee54bffa708a363e',1,'api_msg::len']]],
   ['linger_8',['linger',['../structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d',1,'netconn']]],
   ['link_9',['link',['../structstats__.html#a67759c9b0059bf569f9f771df23924eb',1,'stats_']]],
@@ -52,17 +52,17 @@
   ['lwip_5f6lowpan_5finfer_5fshort_5faddress_49',['LWIP_6LOWPAN_INFER_SHORT_ADDRESS',['../lowpan6__opts_8h.html#a6a542cd72a6270b7231b8b93f8041207',1,'lowpan6_opts.h']]],
   ['lwip_5f6lowpan_5fiphc_50',['LWIP_6LOWPAN_IPHC',['../lowpan6__opts_8h.html#a0f178a86d02e0ba4168cafe3de5f3afa',1,'lowpan6_opts.h']]],
   ['lwip_5f6lowpan_5fnum_5fcontexts_51',['LWIP_6LOWPAN_NUM_CONTEXTS',['../lowpan6__opts_8h.html#a4ffa89f39abf93cc599f78c5a8bb0a4a',1,'lowpan6_opts.h']]],
-  ['lwip_5falignment_5fcast_52',['LWIP_ALIGNMENT_CAST',['../group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8',1,'arch.h']]],
-  ['lwip_5fallow_5fmem_5ffree_5ffrom_5fother_5fcontext_53',['LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT',['../group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2',1,'opt.h']]],
-  ['lwip_5faltcp_54',['LWIP_ALTCP',['../group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77',1,'opt.h']]],
-  ['lwip_5faltcp_5ftls_55',['LWIP_ALTCP_TLS',['../group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8',1,'opt.h']]],
-  ['lwip_5faltcp_5ftls_5fmbedtls_56',['LWIP_ALTCP_TLS_MBEDTLS',['../altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639',1,'altcp_tls_mbedtls_opts.h']]],
-  ['lwip_5farp_57',['LWIP_ARP',['../group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87',1,'opt.h']]],
-  ['lwip_5farp_5ffilter_5fnetif_58',['LWIP_ARP_FILTER_NETIF',['../netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365',1,'ethernet.h']]],
-  ['lwip_5fassert_5fcore_5flocked_59',['LWIP_ASSERT_CORE_LOCKED',['../group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75',1,'opt.h']]],
-  ['lwip_5fautoip_60',['LWIP_AUTOIP',['../group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069',1,'opt.h']]],
-  ['lwip_5fautoip_5fcreate_5fseed_5faddr_61',['LWIP_AUTOIP_CREATE_SEED_ADDR',['../autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43',1,'autoip.c']]],
-  ['lwip_5fautoip_5frand_62',['LWIP_AUTOIP_RAND',['../autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59',1,'autoip.c']]],
+  ['lwip_5facd_52',['LWIP_ACD',['../group__lwip__opts__acd.html#ga6f1667866335cad3a7b1221bd0b274e7',1,'opt.h']]],
+  ['lwip_5falignment_5fcast_53',['LWIP_ALIGNMENT_CAST',['../group__compiler__abstraction.html#gaade87973d72135b0b3afccfff4f62eb8',1,'arch.h']]],
+  ['lwip_5fallow_5fmem_5ffree_5ffrom_5fother_5fcontext_54',['LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT',['../group__lwip__opts__mem.html#ga0a3ef6098813c103e5aba07da76e15e2',1,'opt.h']]],
+  ['lwip_5faltcp_55',['LWIP_ALTCP',['../group__lwip__opts__tcp.html#ga26dee0e5d9c51b1dda0adad29c770a77',1,'opt.h']]],
+  ['lwip_5faltcp_5ftls_56',['LWIP_ALTCP_TLS',['../group__lwip__opts__tcp.html#gab03ba0306cf0a99ccce3d100142f60c8',1,'opt.h']]],
+  ['lwip_5faltcp_5ftls_5fmbedtls_57',['LWIP_ALTCP_TLS_MBEDTLS',['../altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639',1,'altcp_tls_mbedtls_opts.h']]],
+  ['lwip_5farp_58',['LWIP_ARP',['../group__lwip__opts__arp.html#ga9609a014bba4638cc191d6a8f9556c87',1,'opt.h']]],
+  ['lwip_5farp_5ffilter_5fnetif_59',['LWIP_ARP_FILTER_NETIF',['../netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365',1,'ethernet.h']]],
+  ['lwip_5fassert_5fcore_5flocked_60',['LWIP_ASSERT_CORE_LOCKED',['../group__lwip__opts__lock.html#ga6a30040db307b3459fc11906bd433f75',1,'opt.h']]],
+  ['lwip_5fautoip_61',['LWIP_AUTOIP',['../group__lwip__opts__autoip.html#gaaf1b3a089827223589baf1b7f4f57069',1,'opt.h']]],
+  ['lwip_5fautoip_5fcreate_5fseed_5faddr_62',['LWIP_AUTOIP_CREATE_SEED_ADDR',['../autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43',1,'autoip.c']]],
   ['lwip_5fbroadcast_5fping_63',['LWIP_BROADCAST_PING',['../group__lwip__opts__icmp.html#ga8088cb56d1a84fe554b11bc15d84b2b9',1,'opt.h']]],
   ['lwip_5fchecksum_5fctrl_5fper_5fnetif_64',['LWIP_CHECKSUM_CTRL_PER_NETIF',['../group__lwip__opts__checksum.html#ga3ecc5246a0c6ca5aed56c2d7899c1004',1,'opt.h']]],
   ['lwip_5fchecksum_5fon_5fcopy_65',['LWIP_CHECKSUM_ON_COPY',['../group__lwip__opts__checksum.html#ga9f60183f0442bdbeefd6b395c6647613',1,'opt.h']]],
@@ -95,300 +95,309 @@
   ['lwip_5fdhcp_5fautoip_5fcoop_92',['LWIP_DHCP_AUTOIP_COOP',['../group__lwip__opts__autoip.html#ga1a91e18dbb9777bc6e3963f52cb5f9fe',1,'opt.h']]],
   ['lwip_5fdhcp_5fautoip_5fcoop_5ftries_93',['LWIP_DHCP_AUTOIP_COOP_TRIES',['../group__lwip__opts__autoip.html#ga4ff3f941b4c71a04b0c30fbee5b198c2',1,'opt.h']]],
   ['lwip_5fdhcp_5fbootp_5ffile_94',['LWIP_DHCP_BOOTP_FILE',['../group__lwip__opts__dhcp.html#ga3c2983cbd228011dd3e18cb417e7e423',1,'opt.h']]],
-  ['lwip_5fdhcp_5fget_5fntp_5fsrv_95',['LWIP_DHCP_GET_NTP_SRV',['../group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83',1,'opt.h']]],
-  ['lwip_5fdhcp_5fmax_5fdns_5fservers_96',['LWIP_DHCP_MAX_DNS_SERVERS',['../group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6',1,'opt.h']]],
-  ['lwip_5fdhcp_5fmax_5fntp_5fservers_97',['LWIP_DHCP_MAX_NTP_SERVERS',['../group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2',1,'opt.h']]],
-  ['lwip_5fdns_98',['LWIP_DNS',['../group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646',1,'opt.h']]],
-  ['lwip_5fdns_5fapi_5fhostent_5fstorage_99',['LWIP_DNS_API_HOSTENT_STORAGE',['../netdb_8c.html#a768ab8ead892d6454709680340cd070e',1,'netdb.c']]],
-  ['lwip_5fdns_5fsecure_100',['LWIP_DNS_SECURE',['../group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5',1,'opt.h']]],
-  ['lwip_5fdns_5fsupport_5fmdns_5fqueries_101',['LWIP_DNS_SUPPORT_MDNS_QUERIES',['../group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb',1,'opt.h']]],
-  ['lwip_5fethernet_102',['LWIP_ETHERNET',['../group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f',1,'opt.h']]],
-  ['lwip_5fevent_5fapi_103',['LWIP_EVENT_API',['../group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7',1,'opt.h']]],
-  ['lwip_5ffcntl_104',['lwip_fcntl',['../sockets_8c.html#ae84296093574ec746f8f88321356388f',1,'lwip_fcntl(int s, int cmd, int val):&#160;sockets.c'],['../sockets_8h.html#ae84296093574ec746f8f88321356388f',1,'lwip_fcntl(int s, int cmd, int val):&#160;sockets.c']]],
-  ['lwip_5ffionread_5flinuxmode_105',['LWIP_FIONREAD_LINUXMODE',['../group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762',1,'opt.h']]],
-  ['lwip_5ffreeaddrinfo_106',['lwip_freeaddrinfo',['../netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5',1,'lwip_freeaddrinfo(struct addrinfo *ai):&#160;netdb.c'],['../lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5',1,'lwip_freeaddrinfo(struct addrinfo *ai):&#160;netdb.c']]],
-  ['lwip_5fgetaddrinfo_107',['lwip_getaddrinfo',['../netdb_8c.html#af356989c172a51187e22b557f22d4165',1,'lwip_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res):&#160;netdb.c'],['../lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165',1,'lwip_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res):&#160;netdb.c']]],
-  ['lwip_5fgethostbyname_108',['lwip_gethostbyname',['../netdb_8c.html#abe6a6a103a2f6fa4e13098e455ac7bb3',1,'lwip_gethostbyname(const char *name):&#160;netdb.c'],['../lwip_2netdb_8h.html#abe6a6a103a2f6fa4e13098e455ac7bb3',1,'lwip_gethostbyname(const char *name):&#160;netdb.c']]],
-  ['lwip_5fgethostbyname_5fr_109',['lwip_gethostbyname_r',['../netdb_8c.html#afa229e90916f6c8d6308828f45351d2d',1,'lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop):&#160;netdb.c'],['../lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d',1,'lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop):&#160;netdb.c']]],
-  ['lwip_5fhave_5floopif_110',['LWIP_HAVE_LOOPIF',['../group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf',1,'opt.h']]],
-  ['lwip_5fhook_5fdhcp6_5fappend_5foptions_111',['LWIP_HOOK_DHCP6_APPEND_OPTIONS',['../group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a',1,'opt.h']]],
-  ['lwip_5fhook_5fdhcp_5fappend_5foptions_112',['LWIP_HOOK_DHCP_APPEND_OPTIONS',['../group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4',1,'opt.h']]],
-  ['lwip_5fhook_5fdhcp_5fparse_5foption_113',['LWIP_HOOK_DHCP_PARSE_OPTION',['../group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2',1,'opt.h']]],
-  ['lwip_5fhook_5fetharp_5fget_5fgw_114',['LWIP_HOOK_ETHARP_GET_GW',['../group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1',1,'opt.h']]],
-  ['lwip_5fhook_5ffilename_115',['LWIP_HOOK_FILENAME',['../group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d',1,'opt.h']]],
-  ['lwip_5fhook_5fip4_5fcanforward_116',['LWIP_HOOK_IP4_CANFORWARD',['../group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d',1,'opt.h']]],
-  ['lwip_5fhook_5fip4_5finput_117',['LWIP_HOOK_IP4_INPUT',['../group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6',1,'opt.h']]],
-  ['lwip_5fhook_5fip4_5froute_118',['LWIP_HOOK_IP4_ROUTE',['../group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70',1,'opt.h']]],
-  ['lwip_5fhook_5fip4_5froute_5fsrc_119',['LWIP_HOOK_IP4_ROUTE_SRC',['../group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024',1,'opt.h']]],
-  ['lwip_5fhook_5fip6_5finput_120',['LWIP_HOOK_IP6_INPUT',['../group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20',1,'opt.h']]],
-  ['lwip_5fhook_5fip6_5froute_121',['LWIP_HOOK_IP6_ROUTE',['../group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce',1,'opt.h']]],
-  ['lwip_5fhook_5fmemp_5favailable_122',['LWIP_HOOK_MEMP_AVAILABLE',['../group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f',1,'opt.h']]],
-  ['lwip_5fhook_5fnd6_5fget_5fgw_123',['LWIP_HOOK_ND6_GET_GW',['../group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0',1,'opt.h']]],
-  ['lwip_5fhook_5fnetconn_5fexternal_5fresolve_124',['LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE',['../group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5',1,'opt.h']]],
-  ['lwip_5fhook_5fsockets_5fgetsockopt_125',['LWIP_HOOK_SOCKETS_GETSOCKOPT',['../group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1',1,'opt.h']]],
-  ['lwip_5fhook_5fsockets_5fsetsockopt_126',['LWIP_HOOK_SOCKETS_SETSOCKOPT',['../group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a',1,'opt.h']]],
-  ['lwip_5fhook_5ftcp_5finpacket_5fpcb_127',['LWIP_HOOK_TCP_INPACKET_PCB',['../group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2',1,'opt.h']]],
-  ['lwip_5fhook_5ftcp_5fisn_128',['LWIP_HOOK_TCP_ISN',['../group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4',1,'opt.h']]],
-  ['lwip_5fhook_5ftcp_5fout_5fadd_5ftcpopts_129',['LWIP_HOOK_TCP_OUT_ADD_TCPOPTS',['../group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0',1,'opt.h']]],
-  ['lwip_5fhook_5ftcp_5fout_5ftcpopt_5flength_130',['LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH',['../group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f',1,'opt.h']]],
-  ['lwip_5fhook_5funknown_5feth_5fprotocol_131',['LWIP_HOOK_UNKNOWN_ETH_PROTOCOL',['../group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4',1,'opt.h']]],
-  ['lwip_5fhook_5fvlan_5fcheck_132',['LWIP_HOOK_VLAN_CHECK',['../group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9',1,'opt.h']]],
-  ['lwip_5fhook_5fvlan_5fset_133',['LWIP_HOOK_VLAN_SET',['../group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e',1,'opt.h']]],
-  ['lwip_5fhtonl_134',['lwip_htonl',['../def_8c.html#a14f94347a5b9b9e3602705b75b7ae524',1,'lwip_htonl(u32_t n):&#160;def.c'],['../def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37',1,'lwip_htonl(u32_t x):&#160;def.c']]],
-  ['lwip_5fhtons_135',['lwip_htons',['../def_8c.html#ad637280639de4066392e6b5614fa3e56',1,'lwip_htons(u16_t n):&#160;def.c'],['../def_8h.html#ac49eb25570806fb51c329d4f86302cc2',1,'lwip_htons(u16_t x):&#160;def.c']]],
-  ['lwip_5fhttpc_5fhave_5ffile_5fio_136',['LWIP_HTTPC_HAVE_FILE_IO',['../group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c',1,'http_client.h']]],
-  ['lwip_5fhttpd_5fabort_5fon_5fclose_5fmem_5ferror_137',['LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR',['../group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fcgi_138',['LWIP_HTTPD_CGI',['../group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fcgi_5fssi_139',['LWIP_HTTPD_CGI_SSI',['../group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fcustom_5ffiles_140',['LWIP_HTTPD_CUSTOM_FILES',['../group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fdynamic_5ffile_5fread_141',['LWIP_HTTPD_DYNAMIC_FILE_READ',['../group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fdynamic_5fheaders_142',['LWIP_HTTPD_DYNAMIC_HEADERS',['../group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5ffile_5fstate_143',['LWIP_HTTPD_FILE_STATE',['../group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5ffs_5fasync_5fread_144',['LWIP_HTTPD_FS_ASYNC_READ',['../group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fkill_5fold_5fon_5fconnections_5fexceeded_145',['LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED',['../group__httpd__opts.html#ga0d5074965efd40786182287895feb691',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fmax_5freq_5flength_146',['LWIP_HTTPD_MAX_REQ_LENGTH',['../group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fmax_5frequest_5furi_5flen_147',['LWIP_HTTPD_MAX_REQUEST_URI_LEN',['../group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fomit_5fheader_5ffor_5fextensionless_5furi_148',['LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI',['../group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fpost_5fmax_5fresponse_5furi_5flen_149',['LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN',['../group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5freq_5fbufsize_150',['LWIP_HTTPD_REQ_BUFSIZE',['../group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5freq_5fqueuelen_151',['LWIP_HTTPD_REQ_QUEUELEN',['../group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fssi_152',['LWIP_HTTPD_SSI',['../group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fssi_5fby_5ffile_5fextension_153',['LWIP_HTTPD_SSI_BY_FILE_EXTENSION',['../group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fssi_5finclude_5ftag_154',['LWIP_HTTPD_SSI_INCLUDE_TAG',['../group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fssi_5fmultipart_155',['LWIP_HTTPD_SSI_MULTIPART',['../group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fssi_5fraw_156',['LWIP_HTTPD_SSI_RAW',['../group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fsupport_5f11_5fkeepalive_157',['LWIP_HTTPD_SUPPORT_11_KEEPALIVE',['../group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fsupport_5fextstatus_158',['LWIP_HTTPD_SUPPORT_EXTSTATUS',['../group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fsupport_5fpost_159',['LWIP_HTTPD_SUPPORT_POST',['../group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fsupport_5frequestlist_160',['LWIP_HTTPD_SUPPORT_REQUESTLIST',['../group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5fsupport_5fv09_161',['LWIP_HTTPD_SUPPORT_V09',['../group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd',1,'httpd_opts.h']]],
-  ['lwip_5fhttpd_5ftiming_162',['LWIP_HTTPD_TIMING',['../group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a',1,'httpd_opts.h']]],
-  ['lwip_5fiana_5fhwtype_163',['lwip_iana_hwtype',['../group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe',1,'iana.h']]],
-  ['lwip_5fiana_5fhwtype_5fethernet_164',['LWIP_IANA_HWTYPE_ETHERNET',['../group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fdhcp_5fclient_165',['LWIP_IANA_PORT_DHCP_CLIENT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fdhcp_5fserver_166',['LWIP_IANA_PORT_DHCP_SERVER',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fhttp_167',['LWIP_IANA_PORT_HTTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fhttps_168',['LWIP_IANA_PORT_HTTPS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fmdns_169',['LWIP_IANA_PORT_MDNS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fmqtt_170',['LWIP_IANA_PORT_MQTT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fnetbios_171',['LWIP_IANA_PORT_NETBIOS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fnumber_172',['lwip_iana_port_number',['../group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fsecure_5fmqtt_173',['LWIP_IANA_PORT_SECURE_MQTT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fsmtp_174',['LWIP_IANA_PORT_SMTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fsmtps_175',['LWIP_IANA_PORT_SMTPS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fsnmp_176',['LWIP_IANA_PORT_SNMP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fsnmp_5ftrap_177',['LWIP_IANA_PORT_SNMP_TRAP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5fsntp_178',['LWIP_IANA_PORT_SNTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb',1,'iana.h']]],
-  ['lwip_5fiana_5fport_5ftftp_179',['LWIP_IANA_PORT_TFTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050',1,'iana.h']]],
-  ['lwip_5ficmp_180',['LWIP_ICMP',['../group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6',1,'opt.h']]],
-  ['lwip_5ficmp6_181',['LWIP_ICMP6',['../group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f',1,'opt.h']]],
-  ['lwip_5ficmp6_5fdatasize_182',['LWIP_ICMP6_DATASIZE',['../group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf',1,'opt.h']]],
-  ['lwip_5ficmp6_5fhl_183',['LWIP_ICMP6_HL',['../group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79',1,'opt.h']]],
-  ['lwip_5ficmp_5fecho_5fcheck_5finput_5fpbuf_5flen_184',['LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN',['../icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e',1,'icmp.c']]],
-  ['lwip_5fieee_5feth_5ftype_185',['lwip_ieee_eth_type',['../group__ieee.html#gab3a7b97666b100584972d158acbbd1f4',1,'ieee.h']]],
-  ['lwip_5fif_5findextoname_186',['lwip_if_indextoname',['../group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c'],['../group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c']]],
-  ['lwip_5fif_5fnametoindex_187',['lwip_if_nametoindex',['../group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be',1,'lwip_if_nametoindex(const char *ifname):&#160;if_api.c'],['../group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be',1,'lwip_if_nametoindex(const char *ifname):&#160;if_api.c']]],
-  ['lwip_5figmp_188',['LWIP_IGMP',['../group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923',1,'opt.h']]],
-  ['lwip_5finit_189',['lwip_init',['../group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9',1,'lwip_init(void):&#160;init.c'],['../group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9',1,'lwip_init(void):&#160;init.c']]],
-  ['lwip_5finline_5fip_5fchksum_190',['LWIP_INLINE_IP_CHKSUM',['../ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f',1,'ip4.c']]],
-  ['lwip_5fip_5faddr_5ftype_191',['lwip_ip_addr_type',['../group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c',1,'ip_addr.h']]],
-  ['lwip_5fip_5fcheck_5fpbuf_5fref_5fcount_5ffor_5ftx_192',['LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX',['../ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063',1,'ip.h']]],
-  ['lwip_5fipv4_193',['LWIP_IPV4',['../group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410',1,'opt.h']]],
-  ['lwip_5fipv6_194',['LWIP_IPV6',['../group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f',1,'opt.h']]],
-  ['lwip_5fipv6_5faddress_5flifetimes_195',['LWIP_IPV6_ADDRESS_LIFETIMES',['../group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858',1,'opt.h']]],
-  ['lwip_5fipv6_5fautoconfig_196',['LWIP_IPV6_AUTOCONFIG',['../group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03',1,'opt.h']]],
-  ['lwip_5fipv6_5fdhcp6_197',['LWIP_IPV6_DHCP6',['../group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6',1,'opt.h']]],
-  ['lwip_5fipv6_5fdhcp6_5fstateful_198',['LWIP_IPV6_DHCP6_STATEFUL',['../group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155',1,'opt.h']]],
-  ['lwip_5fipv6_5fdhcp6_5fstateless_199',['LWIP_IPV6_DHCP6_STATELESS',['../group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930',1,'opt.h']]],
-  ['lwip_5fipv6_5fdup_5fdetect_5fattempts_200',['LWIP_IPV6_DUP_DETECT_ATTEMPTS',['../group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb',1,'opt.h']]],
-  ['lwip_5fipv6_5fforward_201',['LWIP_IPV6_FORWARD',['../group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32',1,'opt.h']]],
-  ['lwip_5fipv6_5ffrag_202',['LWIP_IPV6_FRAG',['../group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3',1,'opt.h']]],
-  ['lwip_5fipv6_5fmld_203',['LWIP_IPV6_MLD',['../group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528',1,'opt.h']]],
-  ['lwip_5fipv6_5fnum_5faddresses_204',['LWIP_IPV6_NUM_ADDRESSES',['../group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3',1,'opt.h']]],
-  ['lwip_5fipv6_5freass_205',['LWIP_IPV6_REASS',['../group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864',1,'opt.h']]],
-  ['lwip_5fipv6_5fscope_5ftype_206',['lwip_ipv6_scope_type',['../group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe',1,'ip6_zone.h']]],
-  ['lwip_5fipv6_5fscopes_207',['LWIP_IPV6_SCOPES',['../group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5',1,'opt.h']]],
-  ['lwip_5fipv6_5fscopes_5fdebug_208',['LWIP_IPV6_SCOPES_DEBUG',['../group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b',1,'opt.h']]],
-  ['lwip_5fipv6_5fsend_5frouter_5fsolicit_209',['LWIP_IPV6_SEND_ROUTER_SOLICIT',['../group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c',1,'opt.h']]],
-  ['lwip_5fitoa_210',['lwip_itoa',['../group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284',1,'lwip_itoa(char *result, size_t bufsize, int number):&#160;def.c'],['../group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284',1,'lwip_itoa(char *result, size_t bufsize, int number):&#160;def.c']]],
-  ['lwip_5flisten_211',['lwip_listen',['../sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b',1,'lwip_listen(int s, int backlog):&#160;sockets.c'],['../sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b',1,'lwip_listen(int s, int backlog):&#160;sockets.c']]],
-  ['lwip_5floopback_5fmax_5fpbufs_212',['LWIP_LOOPBACK_MAX_PBUFS',['../group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea',1,'opt.h']]],
-  ['lwip_5floopif_5fmulticast_213',['LWIP_LOOPIF_MULTICAST',['../group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300',1,'opt.h']]],
-  ['lwip_5flowpan6_5f802154_5fdebug_214',['LWIP_LOWPAN6_802154_DEBUG',['../lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58',1,'lowpan6_opts.h']]],
-  ['lwip_5flowpan6_5fdebug_215',['LWIP_LOWPAN6_DEBUG',['../lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754',1,'lowpan6_opts.h']]],
-  ['lwip_5flowpan6_5fdecompression_5fdebug_216',['LWIP_LOWPAN6_DECOMPRESSION_DEBUG',['../lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0',1,'lowpan6_opts.h']]],
-  ['lwip_5flowpan6_5fip_5fcompressed_5fdebug_217',['LWIP_LOWPAN6_IP_COMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8',1,'lowpan6_opts.h']]],
-  ['lwip_5fmakeu32_218',['LWIP_MAKEU32',['../def_8h.html#acf56d3da92a0a7a8a62a617e793e948c',1,'def.h']]],
-  ['lwip_5fmark_5ftcpip_5fthread_219',['LWIP_MARK_TCPIP_THREAD',['../group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e',1,'opt.h']]],
-  ['lwip_5fmem_5falign_220',['LWIP_MEM_ALIGN',['../group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc',1,'arch.h']]],
-  ['lwip_5fmem_5falign_5fbuffer_221',['LWIP_MEM_ALIGN_BUFFER',['../group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e',1,'arch.h']]],
-  ['lwip_5fmem_5falign_5fsize_222',['LWIP_MEM_ALIGN_SIZE',['../group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18',1,'arch.h']]],
-  ['lwip_5fmempool_5falloc_223',['LWIP_MEMPOOL_ALLOC',['../group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a',1,'memp.h']]],
-  ['lwip_5fmempool_5fdeclare_224',['LWIP_MEMPOOL_DECLARE',['../group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb',1,'memp.h']]],
-  ['lwip_5fmempool_5ffree_225',['LWIP_MEMPOOL_FREE',['../group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04',1,'memp.h']]],
-  ['lwip_5fmempool_5finit_226',['LWIP_MEMPOOL_INIT',['../group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41',1,'memp.h']]],
-  ['lwip_5fmempool_5fprototype_227',['LWIP_MEMPOOL_PROTOTYPE',['../group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13',1,'memp.h']]],
-  ['lwip_5fmib2_5fcallbacks_228',['LWIP_MIB2_CALLBACKS',['../group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29',1,'opt.h']]],
-  ['lwip_5fmpu_5fcompatible_229',['LWIP_MPU_COMPATIBLE',['../group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9',1,'opt.h']]],
-  ['lwip_5fmulticast_5fping_230',['LWIP_MULTICAST_PING',['../group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661',1,'opt.h']]],
-  ['lwip_5fmulticast_5ftx_5foptions_231',['LWIP_MULTICAST_TX_OPTIONS',['../group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30',1,'opt.h']]],
-  ['lwip_5fnd6_5fallow_5fra_5fupdates_232',['LWIP_ND6_ALLOW_RA_UPDATES',['../group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9',1,'opt.h']]],
-  ['lwip_5fnd6_5fdelay_5ffirst_5fprobe_5ftime_233',['LWIP_ND6_DELAY_FIRST_PROBE_TIME',['../group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715',1,'opt.h']]],
-  ['lwip_5fnd6_5fmax_5fanycast_5fdelay_5ftime_234',['LWIP_ND6_MAX_ANYCAST_DELAY_TIME',['../group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df',1,'opt.h']]],
-  ['lwip_5fnd6_5fmax_5fmulticast_5fsolicit_235',['LWIP_ND6_MAX_MULTICAST_SOLICIT',['../group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30',1,'opt.h']]],
-  ['lwip_5fnd6_5fmax_5fneighbor_5fadvertisement_236',['LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT',['../group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a',1,'opt.h']]],
-  ['lwip_5fnd6_5fmax_5funicast_5fsolicit_237',['LWIP_ND6_MAX_UNICAST_SOLICIT',['../group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691',1,'opt.h']]],
-  ['lwip_5fnd6_5fnum_5fdestinations_238',['LWIP_ND6_NUM_DESTINATIONS',['../group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672',1,'opt.h']]],
-  ['lwip_5fnd6_5fnum_5fneighbors_239',['LWIP_ND6_NUM_NEIGHBORS',['../group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16',1,'opt.h']]],
-  ['lwip_5fnd6_5fnum_5fprefixes_240',['LWIP_ND6_NUM_PREFIXES',['../group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a',1,'opt.h']]],
-  ['lwip_5fnd6_5fnum_5frouters_241',['LWIP_ND6_NUM_ROUTERS',['../group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a',1,'opt.h']]],
-  ['lwip_5fnd6_5fqueueing_242',['LWIP_ND6_QUEUEING',['../group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f',1,'opt.h']]],
-  ['lwip_5fnd6_5frdnss_5fmax_5fdns_5fservers_243',['LWIP_ND6_RDNSS_MAX_DNS_SERVERS',['../group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429',1,'opt.h']]],
-  ['lwip_5fnd6_5freachable_5ftime_244',['LWIP_ND6_REACHABLE_TIME',['../group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74',1,'opt.h']]],
-  ['lwip_5fnd6_5fretrans_5ftimer_245',['LWIP_ND6_RETRANS_TIMER',['../group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9',1,'opt.h']]],
-  ['lwip_5fnd6_5ftcp_5freachability_5fhints_246',['LWIP_ND6_TCP_REACHABILITY_HINTS',['../group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4',1,'opt.h']]],
-  ['lwip_5fnetbios_5frespond_5fname_5fquery_247',['LWIP_NETBIOS_RESPOND_NAME_QUERY',['../group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84',1,'netbiosns_opts.h']]],
-  ['lwip_5fnetbuf_5frecvinfo_248',['LWIP_NETBUF_RECVINFO',['../group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa',1,'opt.h']]],
-  ['lwip_5fnetconn_249',['LWIP_NETCONN',['../group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77',1,'opt.h']]],
-  ['lwip_5fnetconn_5fdo_5faccepted_250',['lwip_netconn_do_accepted',['../api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5',1,'lwip_netconn_do_accepted(void *m):&#160;api_msg.c'],['../api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5',1,'lwip_netconn_do_accepted(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fbind_251',['lwip_netconn_do_bind',['../api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768',1,'lwip_netconn_do_bind(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768',1,'lwip_netconn_do_bind(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fbind_5fif_252',['lwip_netconn_do_bind_if',['../api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605',1,'lwip_netconn_do_bind_if(void *m):&#160;api_msg.c'],['../api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605',1,'lwip_netconn_do_bind_if(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fclose_253',['lwip_netconn_do_close',['../api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d',1,'lwip_netconn_do_close(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d',1,'lwip_netconn_do_close(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fconnect_254',['lwip_netconn_do_connect',['../api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902',1,'lwip_netconn_do_connect(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902',1,'lwip_netconn_do_connect(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fdelconn_255',['lwip_netconn_do_delconn',['../api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59',1,'lwip_netconn_do_delconn(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59',1,'lwip_netconn_do_delconn(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fdisconnect_256',['lwip_netconn_do_disconnect',['../api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a',1,'lwip_netconn_do_disconnect(void *m):&#160;api_msg.c'],['../api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a',1,'lwip_netconn_do_disconnect(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fgetaddr_257',['lwip_netconn_do_getaddr',['../api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163',1,'lwip_netconn_do_getaddr(void *m):&#160;api_msg.c'],['../api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163',1,'lwip_netconn_do_getaddr(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fgethostbyname_258',['lwip_netconn_do_gethostbyname',['../api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61',1,'lwip_netconn_do_gethostbyname(void *arg):&#160;api_msg.c'],['../api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61',1,'lwip_netconn_do_gethostbyname(void *arg):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fjoin_5fleave_5fgroup_259',['lwip_netconn_do_join_leave_group',['../api__msg_8c.html#a7402b52416828906a5679828cce37546',1,'lwip_netconn_do_join_leave_group(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a7402b52416828906a5679828cce37546',1,'lwip_netconn_do_join_leave_group(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fjoin_5fleave_5fgroup_5fnetif_260',['lwip_netconn_do_join_leave_group_netif',['../api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722',1,'lwip_netconn_do_join_leave_group_netif(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722',1,'lwip_netconn_do_join_leave_group_netif(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5flisten_261',['lwip_netconn_do_listen',['../api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f',1,'lwip_netconn_do_listen(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f',1,'lwip_netconn_do_listen(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fnewconn_262',['lwip_netconn_do_newconn',['../api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236',1,'lwip_netconn_do_newconn(void *m):&#160;api_msg.c'],['../api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236',1,'lwip_netconn_do_newconn(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5frecv_263',['lwip_netconn_do_recv',['../api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f',1,'lwip_netconn_do_recv(void *m):&#160;api_msg.c'],['../api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f',1,'lwip_netconn_do_recv(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fsend_264',['lwip_netconn_do_send',['../api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c',1,'lwip_netconn_do_send(void *m):&#160;api_msg.c'],['../api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c',1,'lwip_netconn_do_send(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fwrite_265',['lwip_netconn_do_write',['../api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c',1,'lwip_netconn_do_write(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c',1,'lwip_netconn_do_write(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5ffullduplex_266',['LWIP_NETCONN_FULLDUPLEX',['../group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406',1,'opt.h']]],
-  ['lwip_5fnetconn_5fsem_5fper_5fthread_267',['LWIP_NETCONN_SEM_PER_THREAD',['../group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4',1,'opt.h']]],
-  ['lwip_5fnetif_5fapi_268',['LWIP_NETIF_API',['../group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77',1,'opt.h']]],
-  ['lwip_5fnetif_5fext_5fstatus_5fcallback_269',['LWIP_NETIF_EXT_STATUS_CALLBACK',['../group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e',1,'opt.h']]],
-  ['lwip_5fnetif_5fhostname_270',['LWIP_NETIF_HOSTNAME',['../group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1',1,'opt.h']]],
-  ['lwip_5fnetif_5fhwaddrhint_271',['LWIP_NETIF_HWADDRHINT',['../group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9',1,'opt.h']]],
-  ['lwip_5fnetif_5flink_5fcallback_272',['LWIP_NETIF_LINK_CALLBACK',['../group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b',1,'opt.h']]],
-  ['lwip_5fnetif_5floopback_273',['LWIP_NETIF_LOOPBACK',['../group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01',1,'opt.h']]],
-  ['lwip_5fnetif_5floopback_5fmultithreading_274',['LWIP_NETIF_LOOPBACK_MULTITHREADING',['../group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5',1,'opt.h']]],
-  ['lwip_5fnetif_5fremove_5fcallback_275',['LWIP_NETIF_REMOVE_CALLBACK',['../group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf',1,'opt.h']]],
-  ['lwip_5fnetif_5fstatus_5fcallback_276',['LWIP_NETIF_STATUS_CALLBACK',['../group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36',1,'opt.h']]],
-  ['lwip_5fnetif_5ftx_5fsingle_5fpbuf_277',['LWIP_NETIF_TX_SINGLE_PBUF',['../group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e',1,'opt.h']]],
-  ['lwip_5fno_5fctype_5fh_278',['LWIP_NO_CTYPE_H',['../group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800',1,'arch.h']]],
-  ['lwip_5fno_5finttypes_5fh_279',['LWIP_NO_INTTYPES_H',['../group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373',1,'arch.h']]],
-  ['lwip_5fno_5flimits_5fh_280',['LWIP_NO_LIMITS_H',['../group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805',1,'arch.h']]],
-  ['lwip_5fno_5fstddef_5fh_281',['LWIP_NO_STDDEF_H',['../group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d',1,'arch.h']]],
-  ['lwip_5fno_5fstdint_5fh_282',['LWIP_NO_STDINT_H',['../group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1',1,'arch.h']]],
-  ['lwip_5fnoassert_283',['LWIP_NOASSERT',['../group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41',1,'debug.h']]],
-  ['lwip_5fnsc_5fipv4_5faddress_5fchanged_284',['LWIP_NSC_IPV4_ADDRESS_CHANGED',['../netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32',1,'netif.h']]],
-  ['lwip_5fnsc_5fipv4_5fgateway_5fchanged_285',['LWIP_NSC_IPV4_GATEWAY_CHANGED',['../netif_8h.html#a22400d2202581b4a7273cded712adf49',1,'netif.h']]],
-  ['lwip_5fnsc_5fipv4_5fnetmask_5fchanged_286',['LWIP_NSC_IPV4_NETMASK_CHANGED',['../netif_8h.html#ad747072771a887443ab33f90a12077d4',1,'netif.h']]],
-  ['lwip_5fnsc_5fipv4_5fsettings_5fchanged_287',['LWIP_NSC_IPV4_SETTINGS_CHANGED',['../netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a',1,'netif.h']]],
-  ['lwip_5fnsc_5fipv6_5faddr_5fstate_5fchanged_288',['LWIP_NSC_IPV6_ADDR_STATE_CHANGED',['../netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6',1,'netif.h']]],
-  ['lwip_5fnsc_5fipv6_5fset_289',['LWIP_NSC_IPV6_SET',['../netif_8h.html#a8fb4317a77ee2e3848be80db15618666',1,'netif.h']]],
-  ['lwip_5fnsc_5flink_5fchanged_290',['LWIP_NSC_LINK_CHANGED',['../netif_8h.html#a5ad7308195c0581680dd62fb148501cd',1,'netif.h']]],
-  ['lwip_5fnsc_5fnetif_5fadded_291',['LWIP_NSC_NETIF_ADDED',['../netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2',1,'netif.h']]],
-  ['lwip_5fnsc_5fnetif_5fremoved_292',['LWIP_NSC_NETIF_REMOVED',['../netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9',1,'netif.h']]],
-  ['lwip_5fnsc_5fstatus_5fchanged_293',['LWIP_NSC_STATUS_CHANGED',['../netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2',1,'netif.h']]],
-  ['lwip_5fnum_5fcyclic_5ftimers_294',['lwip_num_cyclic_timers',['../timeouts_8c.html#a9d01f287a19f20b073d3a1c306ecbfcd',1,'lwip_num_cyclic_timers:&#160;timeouts.c'],['../timeouts_8h.html#a9d01f287a19f20b073d3a1c306ecbfcd',1,'lwip_num_cyclic_timers:&#160;timeouts.c']]],
-  ['lwip_5fnum_5fnetif_5fclient_5fdata_295',['LWIP_NUM_NETIF_CLIENT_DATA',['../group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936',1,'opt.h']]],
-  ['lwip_5fnum_5fsys_5ftimeout_5finternal_296',['LWIP_NUM_SYS_TIMEOUT_INTERNAL',['../group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804',1,'opt.h']]],
-  ['lwip_5fpacked_5fcast_297',['LWIP_PACKED_CAST',['../group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446',1,'arch.h']]],
-  ['lwip_5fpbuf_5fcustom_5fdata_298',['LWIP_PBUF_CUSTOM_DATA',['../group__lwip__opts__pbuf.html#ga3b7067723b378457373722ca1a46a9d6',1,'opt.h']]],
-  ['lwip_5fpbuf_5fref_5ft_299',['LWIP_PBUF_REF_T',['../group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38',1,'opt.h']]],
-  ['lwip_5fperf_300',['LWIP_PERF',['../group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de',1,'opt.h']]],
-  ['lwip_5fplatform_5fassert_301',['LWIP_PLATFORM_ASSERT',['../group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0',1,'arch.h']]],
-  ['lwip_5fplatform_5fdiag_302',['LWIP_PLATFORM_DIAG',['../group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b',1,'arch.h']]],
-  ['lwip_5fpollscan_5fclear_303',['LWIP_POLLSCAN_CLEAR',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7',1,'sockets.c']]],
-  ['lwip_5fpollscan_5fdec_5fwait_304',['LWIP_POLLSCAN_DEC_WAIT',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1',1,'sockets.c']]],
-  ['lwip_5fpollscan_5finc_5fwait_305',['LWIP_POLLSCAN_INC_WAIT',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d',1,'sockets.c']]],
-  ['lwip_5fpollscan_5fopts_306',['lwip_pollscan_opts',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9',1,'sockets.c']]],
-  ['lwip_5fposix_5fsockets_5fio_5fnames_307',['LWIP_POSIX_SOCKETS_IO_NAMES',['../group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402',1,'opt.h']]],
-  ['lwip_5fprovide_5ferrno_308',['LWIP_PROVIDE_ERRNO',['../group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade',1,'arch.h']]],
-  ['lwip_5fptr_5fnumeric_5fcast_309',['LWIP_PTR_NUMERIC_CAST',['../group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a',1,'arch.h']]],
-  ['lwip_5frand_310',['LWIP_RAND',['../group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a',1,'arch.h']]],
-  ['lwip_5fraw_311',['LWIP_RAW',['../group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221',1,'opt.h']]],
-  ['lwip_5frc_5fdevelopment_312',['LWIP_RC_DEVELOPMENT',['../group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b',1,'init.h']]],
-  ['lwip_5frc_5frelease_313',['LWIP_RC_RELEASE',['../group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469',1,'init.h']]],
-  ['lwip_5frfc7668_5fip_5funcompressed_5fdebug_314',['LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1',1,'lowpan6_opts.h']]],
-  ['lwip_5frfc7668_5flinux_5fworkaround_5fpublic_5faddress_315',['LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS',['../lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8',1,'lowpan6_opts.h']]],
-  ['lwip_5fselect_5fcb_316',['lwip_select_cb',['../structlwip__select__cb.html',1,'']]],
-  ['lwip_5fshutdown_317',['lwip_shutdown',['../sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1',1,'lwip_shutdown(int s, int how):&#160;sockets.c'],['../sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1',1,'lwip_shutdown(int s, int how):&#160;sockets.c']]],
-  ['lwip_5fsingle_5fnetif_318',['LWIP_SINGLE_NETIF',['../group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be',1,'opt.h']]],
-  ['lwip_5fsnmp_319',['LWIP_SNMP',['../group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c',1,'snmp_opts.h']]],
-  ['lwip_5fsnmp_5fv3_320',['LWIP_SNMP_V3',['../snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b',1,'snmp_opts.h']]],
-  ['lwip_5fso_5flinger_321',['LWIP_SO_LINGER',['../group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d',1,'opt.h']]],
-  ['lwip_5fso_5frcvbuf_322',['LWIP_SO_RCVBUF',['../group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28',1,'opt.h']]],
-  ['lwip_5fso_5frcvtimeo_323',['LWIP_SO_RCVTIMEO',['../group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed',1,'opt.h']]],
-  ['lwip_5fso_5fsndrcvtimeo_5fnonstandard_324',['LWIP_SO_SNDRCVTIMEO_NONSTANDARD',['../group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942',1,'opt.h']]],
-  ['lwip_5fso_5fsndtimeo_325',['LWIP_SO_SNDTIMEO',['../group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58',1,'opt.h']]],
-  ['lwip_5fsock_326',['lwip_sock',['../structlwip__sock.html',1,'']]],
-  ['lwip_5fsocket_327',['LWIP_SOCKET',['../group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f',1,'opt.h']]],
-  ['lwip_5fsocket_5foffset_328',['LWIP_SOCKET_OFFSET',['../group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e',1,'opt.h']]],
-  ['lwip_5fsocket_5fpoll_329',['LWIP_SOCKET_POLL',['../group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200',1,'opt.h']]],
-  ['lwip_5fsocket_5fselect_330',['LWIP_SOCKET_SELECT',['../group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb',1,'opt.h']]],
-  ['lwip_5fsocket_5fthread_5fcleanup_331',['lwip_socket_thread_cleanup',['../sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7',1,'lwip_socket_thread_cleanup(void):&#160;sockets.c'],['../sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7',1,'lwip_socket_thread_cleanup(void):&#160;sockets.c']]],
-  ['lwip_5fsocket_5fthread_5finit_332',['lwip_socket_thread_init',['../sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0',1,'lwip_socket_thread_init(void):&#160;sockets.c'],['../sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0',1,'lwip_socket_thread_init(void):&#160;sockets.c']]],
-  ['lwip_5fstats_333',['LWIP_STATS',['../group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b',1,'opt.h']]],
-  ['lwip_5fstats_334',['lwip_stats',['../stats_8c.html#a614735db0145db9ba944ede600d1d19b',1,'lwip_stats:&#160;stats.c'],['../stats_8h.html#a614735db0145db9ba944ede600d1d19b',1,'lwip_stats:&#160;stats.c']]],
-  ['lwip_5fstats_5fdisplay_335',['LWIP_STATS_DISPLAY',['../group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1',1,'opt.h']]],
-  ['lwip_5fstricmp_336',['lwip_stricmp',['../group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a',1,'lwip_stricmp(const char *str1, const char *str2):&#160;def.c'],['../group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a',1,'lwip_stricmp(const char *str1, const char *str2):&#160;def.c']]],
-  ['lwip_5fstrnicmp_337',['lwip_strnicmp',['../group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a',1,'lwip_strnicmp(const char *str1, const char *str2, size_t len):&#160;def.c'],['../group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a',1,'lwip_strnicmp(const char *str1, const char *str2, size_t len):&#160;def.c']]],
-  ['lwip_5fstrnstr_338',['lwip_strnstr',['../group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c'],['../group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c']]],
-  ['lwip_5fsupport_5fcustom_5fpbuf_339',['LWIP_SUPPORT_CUSTOM_PBUF',['../pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9',1,'pbuf.h']]],
-  ['lwip_5ftcp_340',['LWIP_TCP',['../group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9',1,'opt.h']]],
-  ['lwip_5ftcp_5fcalc_5finitial_5fcwnd_341',['LWIP_TCP_CALC_INITIAL_CWND',['../tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84',1,'tcp_in.c']]],
-  ['lwip_5ftcp_5fclose_5ftimeout_5fms_5fdefault_342',['LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT',['../group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36',1,'opt.h']]],
-  ['lwip_5ftcp_5fkeepalive_343',['LWIP_TCP_KEEPALIVE',['../group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77',1,'opt.h']]],
-  ['lwip_5ftcp_5fmax_5fsack_5fnum_344',['LWIP_TCP_MAX_SACK_NUM',['../group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc',1,'opt.h']]],
-  ['lwip_5ftcp_5fpcb_5fnum_5fext_5fargs_345',['LWIP_TCP_PCB_NUM_EXT_ARGS',['../group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223',1,'opt.h']]],
-  ['lwip_5ftcp_5fsack_5fout_346',['LWIP_TCP_SACK_OUT',['../group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f',1,'opt.h']]],
-  ['lwip_5ftcp_5ftimestamps_347',['LWIP_TCP_TIMESTAMPS',['../group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd',1,'opt.h']]],
-  ['lwip_5ftcpip_5fcore_5flocking_348',['LWIP_TCPIP_CORE_LOCKING',['../group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011',1,'opt.h']]],
-  ['lwip_5ftcpip_5fcore_5flocking_5finput_349',['LWIP_TCPIP_CORE_LOCKING_INPUT',['../group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf',1,'opt.h']]],
-  ['lwip_5ftcpip_5fthread_5falive_350',['LWIP_TCPIP_THREAD_ALIVE',['../group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb',1,'opt.h']]],
-  ['lwip_5ftcpip_5ftimeout_351',['LWIP_TCPIP_TIMEOUT',['../group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99',1,'opt.h']]],
-  ['lwip_5fthread_5ffn_352',['lwip_thread_fn',['../sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9',1,'sys.h']]],
-  ['lwip_5ftimers_353',['LWIP_TIMERS',['../group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c',1,'opt.h']]],
-  ['lwip_5ftimers_5fcustom_354',['LWIP_TIMERS_CUSTOM',['../group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815',1,'opt.h']]],
-  ['lwip_5ftimeval_5fprivate_355',['LWIP_TIMEVAL_PRIVATE',['../sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa',1,'sockets.h']]],
-  ['lwip_5fudp_356',['LWIP_UDP',['../group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3',1,'opt.h']]],
-  ['lwip_5fudplite_357',['LWIP_UDPLITE',['../group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61',1,'opt.h']]],
-  ['lwip_5funused_5farg_358',['LWIP_UNUSED_ARG',['../group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf',1,'arch.h']]],
-  ['lwip_5fversion_359',['LWIP_VERSION',['../group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59',1,'init.h']]],
-  ['lwip_5fversion_5fmajor_360',['LWIP_VERSION_MAJOR',['../group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246',1,'init.h']]],
-  ['lwip_5fversion_5fminor_361',['LWIP_VERSION_MINOR',['../group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034',1,'init.h']]],
-  ['lwip_5fversion_5frc_362',['LWIP_VERSION_RC',['../group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1',1,'init.h']]],
-  ['lwip_5fversion_5frevision_363',['LWIP_VERSION_REVISION',['../group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50',1,'init.h']]],
-  ['lwip_5fversion_5fstring_364',['LWIP_VERSION_STRING',['../group__lwip__version.html#gab47e87bc38eef94486db402813183ba7',1,'init.h']]],
-  ['lwip_5fwnd_5fscale_365',['LWIP_WND_SCALE',['../group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530',1,'opt.h']]],
-  ['lwiperf_2ec_366',['lwiperf.c',['../lwiperf_8c.html',1,'']]],
-  ['lwiperf_2eh_367',['lwiperf.h',['../lwiperf_8h.html',1,'']]],
-  ['lwiperf_5fabort_368',['lwiperf_abort',['../group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004',1,'lwiperf_abort(void *lwiperf_session):&#160;lwiperf.c'],['../group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004',1,'lwiperf_abort(void *lwiperf_session):&#160;lwiperf.c']]],
-  ['lwiperf_5fcheck_5frx_5fdata_369',['LWIPERF_CHECK_RX_DATA',['../lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902',1,'lwiperf.c']]],
-  ['lwiperf_5fclient_370',['LWIPERF_CLIENT',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110',1,'lwiperf.h']]],
-  ['lwiperf_5fclient_5ftype_371',['lwiperf_client_type',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c',1,'lwiperf.h']]],
-  ['lwiperf_5fdual_372',['LWIPERF_DUAL',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede',1,'lwiperf.h']]],
-  ['lwiperf_5freport_5ffn_373',['lwiperf_report_fn',['../lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd',1,'lwiperf.h']]],
-  ['lwiperf_5freport_5ftype_374',['lwiperf_report_type',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6',1,'lwiperf.h']]],
-  ['lwiperf_5fserver_5fip_5ftype_375',['LWIPERF_SERVER_IP_TYPE',['../lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a',1,'lwiperf.c']]],
-  ['lwiperf_5fsettings_5ft_376',['lwiperf_settings_t',['../lwiperf_8c.html#a1e652bca1f12cfe6187a567d6b3be6a2',1,'lwiperf.c']]],
-  ['lwiperf_5fstart_5ftcp_5fclient_377',['lwiperf_start_tcp_client',['../group__iperf.html#ga1088722d967f0f465d45fd3b15dde445',1,'lwiperf_start_tcp_client(const ip_addr_t *remote_addr, u16_t remote_port, enum lwiperf_client_type type, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga1088722d967f0f465d45fd3b15dde445',1,'lwiperf_start_tcp_client(const ip_addr_t *remote_addr, u16_t remote_port, enum lwiperf_client_type type, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
-  ['lwiperf_5fstart_5ftcp_5fclient_5fdefault_378',['lwiperf_start_tcp_client_default',['../group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456',1,'lwiperf_start_tcp_client_default(const ip_addr_t *remote_addr, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456',1,'lwiperf_start_tcp_client_default(const ip_addr_t *remote_addr, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
-  ['lwiperf_5fstart_5ftcp_5fserver_379',['lwiperf_start_tcp_server',['../group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec',1,'lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec',1,'lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
-  ['lwiperf_5fstart_5ftcp_5fserver_5fdefault_380',['lwiperf_start_tcp_server_default',['../group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
-  ['lwiperf_5fstate_5ftcp_5ft_381',['lwiperf_state_tcp_t',['../lwiperf_8c.html#a96ae8ebbc5d13657a641ed174ae22e5b',1,'lwiperf.c']]],
-  ['lwiperf_5ftcp_5faborted_5flocal_382',['LWIPERF_TCP_ABORTED_LOCAL',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb',1,'lwiperf.h']]],
-  ['lwiperf_5ftcp_5faborted_5flocal_5fdataerror_383',['LWIPERF_TCP_ABORTED_LOCAL_DATAERROR',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5',1,'lwiperf.h']]],
-  ['lwiperf_5ftcp_5faborted_5flocal_5ftxerror_384',['LWIPERF_TCP_ABORTED_LOCAL_TXERROR',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40',1,'lwiperf.h']]],
-  ['lwiperf_5ftcp_5faborted_5fremote_385',['LWIPERF_TCP_ABORTED_REMOTE',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d',1,'lwiperf.h']]],
-  ['lwiperf_5ftcp_5fdone_5fclient_386',['LWIPERF_TCP_DONE_CLIENT',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b',1,'lwiperf.h']]],
-  ['lwiperf_5ftcp_5fdone_5fserver_387',['LWIPERF_TCP_DONE_SERVER',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5',1,'lwiperf.h']]],
-  ['lwiperf_5ftcp_5fmax_5fidle_5fsec_388',['LWIPERF_TCP_MAX_IDLE_SEC',['../lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673',1,'lwiperf.c']]],
-  ['lwiperf_5ftradeoff_389',['LWIPERF_TRADEOFF',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964',1,'lwiperf.h']]],
-  ['lwipopts_20h_390',['Options (lwipopts.h)',['../group__lwip__opts.html',1,'']]]
+  ['lwip_5fdhcp_5fdiscover_5fadd_5fhostname_95',['LWIP_DHCP_DISCOVER_ADD_HOSTNAME',['../group__lwip__opts__dhcp.html#gad6b030f8e828666953661578f936e605',1,'opt.h']]],
+  ['lwip_5fdhcp_5fdoes_5facd_5fcheck_96',['LWIP_DHCP_DOES_ACD_CHECK',['../group__lwip__opts__dhcp.html#gadd0c82329fccb78342e3eef98233aa55',1,'opt.h']]],
+  ['lwip_5fdhcp_5fget_5fntp_5fsrv_97',['LWIP_DHCP_GET_NTP_SRV',['../group__lwip__opts__dhcp.html#ga2cc18315edcd5ffc083d1256f7d22a83',1,'opt.h']]],
+  ['lwip_5fdhcp_5fmax_5fdns_5fservers_98',['LWIP_DHCP_MAX_DNS_SERVERS',['../group__lwip__opts__dhcp.html#ga60ccc20fbb08be24b5d5f599dd47a6a6',1,'opt.h']]],
+  ['lwip_5fdhcp_5fmax_5fntp_5fservers_99',['LWIP_DHCP_MAX_NTP_SERVERS',['../group__lwip__opts__dhcp.html#ga9d014e3f7dc9e1e7c7decd8652ba65e2',1,'opt.h']]],
+  ['lwip_5fdns_100',['LWIP_DNS',['../group__lwip__opts__dns.html#ga98710dd81446b7cb2daac736bae6f646',1,'opt.h']]],
+  ['lwip_5fdns_5fapi_5fhostent_5fstorage_101',['LWIP_DNS_API_HOSTENT_STORAGE',['../netdb_8c.html#a768ab8ead892d6454709680340cd070e',1,'netdb.c']]],
+  ['lwip_5fdns_5fsecure_102',['LWIP_DNS_SECURE',['../group__lwip__opts__dns.html#ga8979c30dfbfde609d5139f80aabdfcc5',1,'opt.h']]],
+  ['lwip_5fdns_5fsupport_5fmdns_5fqueries_103',['LWIP_DNS_SUPPORT_MDNS_QUERIES',['../group__lwip__opts__dns.html#gafcbde5706a70ace562bd1f7d2d6f77cb',1,'opt.h']]],
+  ['lwip_5fethernet_104',['LWIP_ETHERNET',['../group__lwip__opts__arp.html#ga30e02dc217cc2995d0fd241d510c904f',1,'opt.h']]],
+  ['lwip_5fevent_5fapi_105',['LWIP_EVENT_API',['../group__lwip__opts__tcp.html#ga39f76e811117155be8525bb386ecddb7',1,'opt.h']]],
+  ['lwip_5ffcntl_106',['lwip_fcntl',['../sockets_8c.html#ae84296093574ec746f8f88321356388f',1,'lwip_fcntl(int s, int cmd, int val):&#160;sockets.c'],['../sockets_8h.html#ae84296093574ec746f8f88321356388f',1,'lwip_fcntl(int s, int cmd, int val):&#160;sockets.c']]],
+  ['lwip_5ffionread_5flinuxmode_107',['LWIP_FIONREAD_LINUXMODE',['../group__lwip__opts__socket.html#ga0543eea2abe390d0bdc843c33debd762',1,'opt.h']]],
+  ['lwip_5ffreeaddrinfo_108',['lwip_freeaddrinfo',['../netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5',1,'lwip_freeaddrinfo(struct addrinfo *ai):&#160;netdb.c'],['../lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5',1,'lwip_freeaddrinfo(struct addrinfo *ai):&#160;netdb.c']]],
+  ['lwip_5fgetaddrinfo_109',['lwip_getaddrinfo',['../netdb_8c.html#af356989c172a51187e22b557f22d4165',1,'lwip_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res):&#160;netdb.c'],['../lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165',1,'lwip_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res):&#160;netdb.c']]],
+  ['lwip_5fgethostbyname_110',['lwip_gethostbyname',['../netdb_8c.html#abe6a6a103a2f6fa4e13098e455ac7bb3',1,'lwip_gethostbyname(const char *name):&#160;netdb.c'],['../lwip_2netdb_8h.html#abe6a6a103a2f6fa4e13098e455ac7bb3',1,'lwip_gethostbyname(const char *name):&#160;netdb.c']]],
+  ['lwip_5fgethostbyname_5fr_111',['lwip_gethostbyname_r',['../netdb_8c.html#afa229e90916f6c8d6308828f45351d2d',1,'lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop):&#160;netdb.c'],['../lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d',1,'lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop):&#160;netdb.c']]],
+  ['lwip_5fhave_5floopif_112',['LWIP_HAVE_LOOPIF',['../group__lwip__opts__loop.html#gaa2b1f736373cd896e212644aa453fbaf',1,'opt.h']]],
+  ['lwip_5fhook_5fdhcp6_5fappend_5foptions_113',['LWIP_HOOK_DHCP6_APPEND_OPTIONS',['../group__lwip__opts__hooks.html#ga4068b3313e32f711ba016215fc2c886a',1,'opt.h']]],
+  ['lwip_5fhook_5fdhcp_5fappend_5foptions_114',['LWIP_HOOK_DHCP_APPEND_OPTIONS',['../group__lwip__opts__hooks.html#ga40e6c9aba06e66e5df1b4ca18329f9b4',1,'opt.h']]],
+  ['lwip_5fhook_5fdhcp_5fparse_5foption_115',['LWIP_HOOK_DHCP_PARSE_OPTION',['../group__lwip__opts__hooks.html#gafbbbc574863c0f88988936bd1434f2d2',1,'opt.h']]],
+  ['lwip_5fhook_5fetharp_5fget_5fgw_116',['LWIP_HOOK_ETHARP_GET_GW',['../group__lwip__opts__hooks.html#ga2b76f127325fd5ca8b80077a4b6160b1',1,'opt.h']]],
+  ['lwip_5fhook_5ffilename_117',['LWIP_HOOK_FILENAME',['../group__lwip__opts__hooks.html#ga11ac9d637cb6afc0a32e8da7f51d0c0d',1,'opt.h']]],
+  ['lwip_5fhook_5fip4_5fcanforward_118',['LWIP_HOOK_IP4_CANFORWARD',['../group__lwip__opts__hooks.html#gaed848a98dbb5c8856a27e379986ea70d',1,'opt.h']]],
+  ['lwip_5fhook_5fip4_5finput_119',['LWIP_HOOK_IP4_INPUT',['../group__lwip__opts__hooks.html#ga9124237c28e2f18f3b28d5be09e9ccb6',1,'opt.h']]],
+  ['lwip_5fhook_5fip4_5froute_120',['LWIP_HOOK_IP4_ROUTE',['../group__lwip__opts__hooks.html#ga5d1061ad722a73012a28dbaf0f169b70',1,'opt.h']]],
+  ['lwip_5fhook_5fip4_5froute_5fsrc_121',['LWIP_HOOK_IP4_ROUTE_SRC',['../group__lwip__opts__hooks.html#gaa410d9cbe1d4fa4c8a7f49af7b501024',1,'opt.h']]],
+  ['lwip_5fhook_5fip6_5finput_122',['LWIP_HOOK_IP6_INPUT',['../group__lwip__opts__hooks.html#gaccbdd3d0250f7176dcd799ca06007f20',1,'opt.h']]],
+  ['lwip_5fhook_5fip6_5froute_123',['LWIP_HOOK_IP6_ROUTE',['../group__lwip__opts__hooks.html#ga8245a4bc7ffb172e3bf32276f9d126ce',1,'opt.h']]],
+  ['lwip_5fhook_5fmemp_5favailable_124',['LWIP_HOOK_MEMP_AVAILABLE',['../group__lwip__opts__hooks.html#ga13e90672158221b40f8b12bf9d8b721f',1,'opt.h']]],
+  ['lwip_5fhook_5fnd6_5fget_5fgw_125',['LWIP_HOOK_ND6_GET_GW',['../group__lwip__opts__hooks.html#ga287544c3d74bc2a2d645bddbbc4fbdd0',1,'opt.h']]],
+  ['lwip_5fhook_5fnetconn_5fexternal_5fresolve_126',['LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE',['../group__lwip__opts__hooks.html#gae35e4b7374868dc748b12dedb8f807e5',1,'opt.h']]],
+  ['lwip_5fhook_5fsockets_5fgetsockopt_127',['LWIP_HOOK_SOCKETS_GETSOCKOPT',['../group__lwip__opts__hooks.html#gabdaeb09ac9f441934e21a087544a1af1',1,'opt.h']]],
+  ['lwip_5fhook_5fsockets_5fsetsockopt_128',['LWIP_HOOK_SOCKETS_SETSOCKOPT',['../group__lwip__opts__hooks.html#ga14ea9210c09da4dd33bc85bd8a01b48a',1,'opt.h']]],
+  ['lwip_5fhook_5ftcp_5finpacket_5fpcb_129',['LWIP_HOOK_TCP_INPACKET_PCB',['../group__lwip__opts__hooks.html#gabed8b1cda4aba2d108fa62cdd74895a2',1,'opt.h']]],
+  ['lwip_5fhook_5ftcp_5fisn_130',['LWIP_HOOK_TCP_ISN',['../group__lwip__opts__hooks.html#ga078d203053911cf3af178392700386a4',1,'opt.h']]],
+  ['lwip_5fhook_5ftcp_5fout_5fadd_5ftcpopts_131',['LWIP_HOOK_TCP_OUT_ADD_TCPOPTS',['../group__lwip__opts__hooks.html#ga0ef31b749307b63c06633645d4de21f0',1,'opt.h']]],
+  ['lwip_5fhook_5ftcp_5fout_5ftcpopt_5flength_132',['LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH',['../group__lwip__opts__hooks.html#ga31c0694abe4eedf3ff039b7073c2293f',1,'opt.h']]],
+  ['lwip_5fhook_5funknown_5feth_5fprotocol_133',['LWIP_HOOK_UNKNOWN_ETH_PROTOCOL',['../group__lwip__opts__hooks.html#ga6cc92f5101dd7a0420e18e1f2101abf4',1,'opt.h']]],
+  ['lwip_5fhook_5fvlan_5fcheck_134',['LWIP_HOOK_VLAN_CHECK',['../group__lwip__opts__hooks.html#ga2f020543772368f8f4355f50f24c86a9',1,'opt.h']]],
+  ['lwip_5fhook_5fvlan_5fset_135',['LWIP_HOOK_VLAN_SET',['../group__lwip__opts__hooks.html#ga2b6e450b4934b95df9b9a9d2b9a4d57e',1,'opt.h']]],
+  ['lwip_5fhtonl_136',['lwip_htonl',['../def_8c.html#a14f94347a5b9b9e3602705b75b7ae524',1,'lwip_htonl(u32_t n):&#160;def.c'],['../def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37',1,'lwip_htonl(u32_t x):&#160;def.c']]],
+  ['lwip_5fhtons_137',['lwip_htons',['../def_8c.html#ad637280639de4066392e6b5614fa3e56',1,'lwip_htons(u16_t n):&#160;def.c'],['../def_8h.html#ac49eb25570806fb51c329d4f86302cc2',1,'lwip_htons(u16_t x):&#160;def.c']]],
+  ['lwip_5fhttpc_5fhave_5ffile_5fio_138',['LWIP_HTTPC_HAVE_FILE_IO',['../group__httpc.html#ga055b9a8bf8f4e2c18c621471773fa66c',1,'http_client.h']]],
+  ['lwip_5fhttpd_5fabort_5fon_5fclose_5fmem_5ferror_139',['LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR',['../group__httpd__opts.html#ga0ff20ebc4ab50d4aa6151c3241dacb3a',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fcgi_140',['LWIP_HTTPD_CGI',['../group__httpd__opts.html#gafb28f7c5fee75f013a199d427452372c',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fcgi_5fssi_141',['LWIP_HTTPD_CGI_SSI',['../group__httpd__opts.html#gad3960bf65731bd0f1341867664afe860',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fcustom_5ffiles_142',['LWIP_HTTPD_CUSTOM_FILES',['../group__httpd__opts.html#gadadb70f5663cdf004bf879e3b5d326bd',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fdynamic_5ffile_5fread_143',['LWIP_HTTPD_DYNAMIC_FILE_READ',['../group__httpd__opts.html#ga1ee8d7c975c7e3d1c9d9dd9b43660c79',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fdynamic_5fheaders_144',['LWIP_HTTPD_DYNAMIC_HEADERS',['../group__httpd__opts.html#ga75932fc5eeb9abeddfdaf8413574c6d7',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5ffile_5fextension_145',['LWIP_HTTPD_FILE_EXTENSION',['../group__httpd__opts.html#gaa3648a9fdefe3ab1c890b715a4786429',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5ffile_5fstate_146',['LWIP_HTTPD_FILE_STATE',['../group__httpd__opts.html#gaedd0fa3d356170d8ca3557acb410fd7c',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5ffs_5fasync_5fread_147',['LWIP_HTTPD_FS_ASYNC_READ',['../group__httpd__opts.html#ga51cb673cb5cc362acc409f23c1e0a331',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fkill_5fold_5fon_5fconnections_5fexceeded_148',['LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED',['../group__httpd__opts.html#ga0d5074965efd40786182287895feb691',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fmax_5freq_5flength_149',['LWIP_HTTPD_MAX_REQ_LENGTH',['../group__httpd__opts.html#ga30dc71c59f3904df7daaf293f74f91f8',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fmax_5frequest_5furi_5flen_150',['LWIP_HTTPD_MAX_REQUEST_URI_LEN',['../group__httpd__opts.html#gaca4ef53e7a9abbd8d4bd8bc1ba7b486a',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fomit_5fheader_5ffor_5fextensionless_5furi_151',['LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI',['../group__httpd__opts.html#ga82a030ce2ecdcf741b02b7be41c012b3',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fpost_5fmax_5fresponse_5furi_5flen_152',['LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN',['../group__httpd__opts.html#gaa27f7c5450392d10aeed033ca878cce3',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5freq_5fbufsize_153',['LWIP_HTTPD_REQ_BUFSIZE',['../group__httpd__opts.html#ga8dbe61a35228da0e7365a088197191b8',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5freq_5fqueuelen_154',['LWIP_HTTPD_REQ_QUEUELEN',['../group__httpd__opts.html#gaef23f4e3525aa5dd0ecbce9b5e16d4e0',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_155',['LWIP_HTTPD_SSI',['../group__httpd__opts.html#gacb70e0cdd30a940f8bce681c6cc63949',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_5fby_5ffile_5fextension_156',['LWIP_HTTPD_SSI_BY_FILE_EXTENSION',['../group__httpd__opts.html#gaba2d4cfe4c1f5bdbe37b339084a7d466',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_5fextensions_157',['LWIP_HTTPD_SSI_EXTENSIONS',['../group__httpd__opts.html#ga006baa7219cff5ee02f5a14ef7d7c89d',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_5finclude_5ftag_158',['LWIP_HTTPD_SSI_INCLUDE_TAG',['../group__httpd__opts.html#ga975961a6d22d1a077118fb85dfec809a',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_5fmultipart_159',['LWIP_HTTPD_SSI_MULTIPART',['../group__httpd__opts.html#ga3167d52d20cf90857e2c809b92458bf0',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fssi_5fraw_160',['LWIP_HTTPD_SSI_RAW',['../group__httpd__opts.html#ga520858778b84d4d2fa125294c0f119e5',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5f11_5fkeepalive_161',['LWIP_HTTPD_SUPPORT_11_KEEPALIVE',['../group__httpd__opts.html#ga6f78487bc829f7f98274f1264020045e',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5fextstatus_162',['LWIP_HTTPD_SUPPORT_EXTSTATUS',['../group__httpd__opts.html#ga85ebddbc4236b1e31bfa68fa163f9b07',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5fpost_163',['LWIP_HTTPD_SUPPORT_POST',['../group__httpd__opts.html#gacbea06ce33933e3ef2f2f1834a21cc2c',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5frequestlist_164',['LWIP_HTTPD_SUPPORT_REQUESTLIST',['../group__httpd__opts.html#ga0bd0f9a89423fb3bbfea4e4c6141ae43',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5fsupport_5fv09_165',['LWIP_HTTPD_SUPPORT_V09',['../group__httpd__opts.html#ga7a8f4ab787b6fb8482c8a36c9fd0c7dd',1,'httpd_opts.h']]],
+  ['lwip_5fhttpd_5ftiming_166',['LWIP_HTTPD_TIMING',['../group__httpd__opts.html#ga054db3f080715942967969c6ae30bb6a',1,'httpd_opts.h']]],
+  ['lwip_5fiana_5fhwtype_167',['lwip_iana_hwtype',['../group__iana.html#ga3d2bbfcb56c8adf3be8c8d12868cecfe',1,'iana.h']]],
+  ['lwip_5fiana_5fhwtype_5fethernet_168',['LWIP_IANA_HWTYPE_ETHERNET',['../group__iana.html#gga3d2bbfcb56c8adf3be8c8d12868cecfea89e82e6ac55811bb26fe66ec029f2a0c',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fdhcp_5fclient_169',['LWIP_IANA_PORT_DHCP_CLIENT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a9fcae1f16758e1ac35dab343fc897f40',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fdhcp_5fserver_170',['LWIP_IANA_PORT_DHCP_SERVER',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ac70ae96c985cf3660e26aa496094916d',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fhttp_171',['LWIP_IANA_PORT_HTTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a1c665cb8e57dff577f4966493c15b618',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fhttps_172',['LWIP_IANA_PORT_HTTPS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ad07fb8ff2b18006405d904b5b3810c88',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fmdns_173',['LWIP_IANA_PORT_MDNS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a839da325f45916d7b27d53d5e5e97dc6',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fmqtt_174',['LWIP_IANA_PORT_MQTT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a172d486d82c552ef3540cf8d61b14b22',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fnetbios_175',['LWIP_IANA_PORT_NETBIOS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae1cf6eaab024b31aff5bf407d38e0ede',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fnumber_176',['lwip_iana_port_number',['../group__iana.html#gac9396d90585e49e9a287179bf5aa9ba0',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsecure_5fmqtt_177',['LWIP_IANA_PORT_SECURE_MQTT',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ab833e9dc7646bd7affde45691bc66601',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsmtp_178',['LWIP_IANA_PORT_SMTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0ae2645895203ca3c54005afad053a813c',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsmtps_179',['LWIP_IANA_PORT_SMTPS',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a88f8872246977c6e24c617266ada1a3b',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsnmp_180',['LWIP_IANA_PORT_SNMP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aeb10a37f0c48e053b138f65b843c45d3',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsnmp_5ftrap_181',['LWIP_IANA_PORT_SNMP_TRAP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0aff60c0d3e8eca210b7e4faca3491f4a8',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5fsntp_182',['LWIP_IANA_PORT_SNTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a79c377ce09e05cd4410a8865d41b3efb',1,'iana.h']]],
+  ['lwip_5fiana_5fport_5ftftp_183',['LWIP_IANA_PORT_TFTP',['../group__iana.html#ggac9396d90585e49e9a287179bf5aa9ba0a7b318226afef92e019b67227acf94050',1,'iana.h']]],
+  ['lwip_5ficmp_184',['LWIP_ICMP',['../group__lwip__opts__icmp.html#gae4d45345c3ab8e5a355fda1d8d24fca6',1,'opt.h']]],
+  ['lwip_5ficmp6_185',['LWIP_ICMP6',['../group__lwip__opts__icmp6.html#ga65ac8bcbad242cba3a2b557e1574b21f',1,'opt.h']]],
+  ['lwip_5ficmp6_5fdatasize_186',['LWIP_ICMP6_DATASIZE',['../group__lwip__opts__icmp6.html#gaa88c55e37e5d7b865b91a9399313bbbf',1,'opt.h']]],
+  ['lwip_5ficmp6_5fhl_187',['LWIP_ICMP6_HL',['../group__lwip__opts__icmp6.html#ga82193577b4045e1ac1533c4341a2bd79',1,'opt.h']]],
+  ['lwip_5ficmp_5fecho_5fcheck_5finput_5fpbuf_5flen_188',['LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN',['../icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e',1,'icmp.c']]],
+  ['lwip_5fieee_5feth_5ftype_189',['lwip_ieee_eth_type',['../group__ieee.html#gab3a7b97666b100584972d158acbbd1f4',1,'ieee.h']]],
+  ['lwip_5fif_5findextoname_190',['lwip_if_indextoname',['../group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c'],['../group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c']]],
+  ['lwip_5fif_5fnametoindex_191',['lwip_if_nametoindex',['../group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be',1,'lwip_if_nametoindex(const char *ifname):&#160;if_api.c'],['../group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be',1,'lwip_if_nametoindex(const char *ifname):&#160;if_api.c']]],
+  ['lwip_5figmp_192',['LWIP_IGMP',['../group__lwip__opts__igmp.html#gadaf25915ae1fd69c0943ef68cbb38923',1,'opt.h']]],
+  ['lwip_5finit_193',['lwip_init',['../group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9',1,'lwip_init(void):&#160;init.c'],['../group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9',1,'lwip_init(void):&#160;init.c']]],
+  ['lwip_5finline_5fip_5fchksum_194',['LWIP_INLINE_IP_CHKSUM',['../ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f',1,'ip4.c']]],
+  ['lwip_5fip_5faddr_5ftype_195',['lwip_ip_addr_type',['../group__ipaddr.html#gaf2142f0dfdcc938e2db16aa745ed585c',1,'ip_addr.h']]],
+  ['lwip_5fip_5fcheck_5fpbuf_5fref_5fcount_5ffor_5ftx_196',['LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX',['../ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063',1,'ip.h']]],
+  ['lwip_5fipv4_197',['LWIP_IPV4',['../group__lwip__opts__ipv4.html#ga429e811a80ebb5157e14a854870c4410',1,'opt.h']]],
+  ['lwip_5fipv6_198',['LWIP_IPV6',['../group__lwip__opts__ipv6.html#ga872e3bb3fe2212156d66b18fccc9643f',1,'opt.h']]],
+  ['lwip_5fipv6_5faddress_5flifetimes_199',['LWIP_IPV6_ADDRESS_LIFETIMES',['../group__lwip__opts__ipv6.html#ga2c0127fca1073ad3f0a1e53f00ea8858',1,'opt.h']]],
+  ['lwip_5fipv6_5fautoconfig_200',['LWIP_IPV6_AUTOCONFIG',['../group__lwip__opts__ipv6.html#ga580039bf2baf49fcb9e504e5d2b40a03',1,'opt.h']]],
+  ['lwip_5fipv6_5fdhcp6_201',['LWIP_IPV6_DHCP6',['../group__lwip__opts__dhcpv6.html#ga1ba67b6665026ec0c688dc4b0df047a6',1,'opt.h']]],
+  ['lwip_5fipv6_5fdhcp6_5fstateful_202',['LWIP_IPV6_DHCP6_STATEFUL',['../group__lwip__opts__dhcpv6.html#ga3fc9dbe8feae61621cac4952ac28e155',1,'opt.h']]],
+  ['lwip_5fipv6_5fdhcp6_5fstateless_203',['LWIP_IPV6_DHCP6_STATELESS',['../group__lwip__opts__dhcpv6.html#ga8d6bab14d580d2136430319aab6d7930',1,'opt.h']]],
+  ['lwip_5fipv6_5fdup_5fdetect_5fattempts_204',['LWIP_IPV6_DUP_DETECT_ATTEMPTS',['../group__lwip__opts__ipv6.html#gad8489522d34f37e42b4001bab3781bcb',1,'opt.h']]],
+  ['lwip_5fipv6_5fforward_205',['LWIP_IPV6_FORWARD',['../group__lwip__opts__ipv6.html#gac96c5802de6c75dd62ab38cff6d16a32',1,'opt.h']]],
+  ['lwip_5fipv6_5ffrag_206',['LWIP_IPV6_FRAG',['../group__lwip__opts__ipv6.html#ga9ab6269f3087f6d9f7b2c7181ef043c3',1,'opt.h']]],
+  ['lwip_5fipv6_5fmld_207',['LWIP_IPV6_MLD',['../group__lwip__opts__mld6.html#ga44d8f24eaebbc50221ac1336212a3528',1,'opt.h']]],
+  ['lwip_5fipv6_5fnum_5faddresses_208',['LWIP_IPV6_NUM_ADDRESSES',['../group__lwip__opts__ipv6.html#ga16c1b672604bfb0a66a6aeeb854589d3',1,'opt.h']]],
+  ['lwip_5fipv6_5freass_209',['LWIP_IPV6_REASS',['../group__lwip__opts__ipv6.html#gad0ef160d72e63b02c5e875b06ec53864',1,'opt.h']]],
+  ['lwip_5fipv6_5fscope_5ftype_210',['lwip_ipv6_scope_type',['../group__ip6__zones.html#ga1993c4b6a297b6e92d80a9ce46ddedfe',1,'ip6_zone.h']]],
+  ['lwip_5fipv6_5fscopes_211',['LWIP_IPV6_SCOPES',['../group__lwip__opts__ipv6.html#ga91d1e630059df3b3a296e2b6ff7aead5',1,'opt.h']]],
+  ['lwip_5fipv6_5fscopes_5fdebug_212',['LWIP_IPV6_SCOPES_DEBUG',['../group__lwip__opts__ipv6.html#ga623ef29d27d98fb7be8732730a5ddf4b',1,'opt.h']]],
+  ['lwip_5fipv6_5fsend_5frouter_5fsolicit_213',['LWIP_IPV6_SEND_ROUTER_SOLICIT',['../group__lwip__opts__ipv6.html#ga273ed2e1a4e6a43713a0e4a06a34ee5c',1,'opt.h']]],
+  ['lwip_5fitoa_214',['lwip_itoa',['../group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284',1,'lwip_itoa(char *result, size_t bufsize, int number):&#160;def.c'],['../group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284',1,'lwip_itoa(char *result, size_t bufsize, int number):&#160;def.c']]],
+  ['lwip_5flisten_215',['lwip_listen',['../sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b',1,'lwip_listen(int s, int backlog):&#160;sockets.c'],['../sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b',1,'lwip_listen(int s, int backlog):&#160;sockets.c']]],
+  ['lwip_5floopback_5fmax_5fpbufs_216',['LWIP_LOOPBACK_MAX_PBUFS',['../group__lwip__opts__loop.html#gaacc3ad5d0a771d45fb0a3e3a09b1dbea',1,'opt.h']]],
+  ['lwip_5floopif_5fmulticast_217',['LWIP_LOOPIF_MULTICAST',['../group__lwip__opts__loop.html#ga10a878b390c2fbe421d82502001c7300',1,'opt.h']]],
+  ['lwip_5flowpan6_5f802154_5fdebug_218',['LWIP_LOWPAN6_802154_DEBUG',['../lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fdebug_219',['LWIP_LOWPAN6_DEBUG',['../lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fdecompression_5fdebug_220',['LWIP_LOWPAN6_DECOMPRESSION_DEBUG',['../lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fip_5fcompressed_5fdebug_221',['LWIP_LOWPAN6_IP_COMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8',1,'lowpan6_opts.h']]],
+  ['lwip_5fmakeu32_222',['LWIP_MAKEU32',['../def_8h.html#acf56d3da92a0a7a8a62a617e793e948c',1,'def.h']]],
+  ['lwip_5fmark_5ftcpip_5fthread_223',['LWIP_MARK_TCPIP_THREAD',['../group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e',1,'sys.h']]],
+  ['lwip_5fmdns_5fsearch_224',['LWIP_MDNS_SEARCH',['../group__mdns__opts.html#gaaf489604dcdf94d2adcd723f6c7d7163',1,'mdns_opts.h']]],
+  ['lwip_5fmem_5falign_225',['LWIP_MEM_ALIGN',['../group__compiler__abstraction.html#gaa8e8724eb1c220cbbb90de9e175ce1dc',1,'arch.h']]],
+  ['lwip_5fmem_5falign_5fbuffer_226',['LWIP_MEM_ALIGN_BUFFER',['../group__compiler__abstraction.html#ga25591dcb72fccc7b5dc46fbc1959694e',1,'arch.h']]],
+  ['lwip_5fmem_5falign_5fsize_227',['LWIP_MEM_ALIGN_SIZE',['../group__compiler__abstraction.html#gaef204be511fd32f681b55abc08e9ae18',1,'arch.h']]],
+  ['lwip_5fmempool_5falloc_228',['LWIP_MEMPOOL_ALLOC',['../group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a',1,'memp.h']]],
+  ['lwip_5fmempool_5fdeclare_229',['LWIP_MEMPOOL_DECLARE',['../group__mempool.html#ga5b1fb3ce7942432d87cc948b1c5ed6cb',1,'memp.h']]],
+  ['lwip_5fmempool_5ffree_230',['LWIP_MEMPOOL_FREE',['../group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04',1,'memp.h']]],
+  ['lwip_5fmempool_5finit_231',['LWIP_MEMPOOL_INIT',['../group__mempool.html#ga60b51c06d276f525b35d8b7abd4dcb41',1,'memp.h']]],
+  ['lwip_5fmempool_5fprototype_232',['LWIP_MEMPOOL_PROTOTYPE',['../group__mempool.html#ga92fc8c29d0e2654f2a2ecc43b2b7fb13',1,'memp.h']]],
+  ['lwip_5fmib2_5fcallbacks_233',['LWIP_MIB2_CALLBACKS',['../group__lwip__opts__mib2.html#gad84d6a781880cec19a1ef4b2339fea29',1,'opt.h']]],
+  ['lwip_5fmpu_5fcompatible_234',['LWIP_MPU_COMPATIBLE',['../group__lwip__opts__lock.html#gae9afcefa5d233372abb9413188dd98c9',1,'opt.h']]],
+  ['lwip_5fmulticast_5fping_235',['LWIP_MULTICAST_PING',['../group__lwip__opts__icmp.html#gaf77baf0a83b04312eab4c006ef229661',1,'opt.h']]],
+  ['lwip_5fmulticast_5ftx_5foptions_236',['LWIP_MULTICAST_TX_OPTIONS',['../group__lwip__opts__multicast.html#gab8d7d53247cc62caa76f54b2c5a5df30',1,'opt.h']]],
+  ['lwip_5fnd6_5fallow_5fra_5fupdates_237',['LWIP_ND6_ALLOW_RA_UPDATES',['../group__lwip__opts__nd6.html#gad35d10353ac7c7d2c8d4b83788cdc6d9',1,'opt.h']]],
+  ['lwip_5fnd6_5fdelay_5ffirst_5fprobe_5ftime_238',['LWIP_ND6_DELAY_FIRST_PROBE_TIME',['../group__lwip__opts__nd6.html#ga315bd6d4a9d185766dfc3253cd9d7715',1,'opt.h']]],
+  ['lwip_5fnd6_5fmax_5fanycast_5fdelay_5ftime_239',['LWIP_ND6_MAX_ANYCAST_DELAY_TIME',['../group__lwip__opts__nd6.html#ga960b8973df083fad53ae0eaa79f8c4df',1,'opt.h']]],
+  ['lwip_5fnd6_5fmax_5fmulticast_5fsolicit_240',['LWIP_ND6_MAX_MULTICAST_SOLICIT',['../group__lwip__opts__nd6.html#ga980909018aed54adc10dd68be3572b30',1,'opt.h']]],
+  ['lwip_5fnd6_5fmax_5fneighbor_5fadvertisement_241',['LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT',['../group__lwip__opts__nd6.html#ga86ab0cac87cdc7aeff09384ddbaaba2a',1,'opt.h']]],
+  ['lwip_5fnd6_5fmax_5funicast_5fsolicit_242',['LWIP_ND6_MAX_UNICAST_SOLICIT',['../group__lwip__opts__nd6.html#gafa6f4c2d2c259ab0895fa03a6f08c691',1,'opt.h']]],
+  ['lwip_5fnd6_5fnum_5fdestinations_243',['LWIP_ND6_NUM_DESTINATIONS',['../group__lwip__opts__nd6.html#gacad118b1ae886e80137a1d4f0fb19672',1,'opt.h']]],
+  ['lwip_5fnd6_5fnum_5fneighbors_244',['LWIP_ND6_NUM_NEIGHBORS',['../group__lwip__opts__nd6.html#gab2fe15bdb4e0a41f295eb5577b11ad16',1,'opt.h']]],
+  ['lwip_5fnd6_5fnum_5fprefixes_245',['LWIP_ND6_NUM_PREFIXES',['../group__lwip__opts__nd6.html#gad9cc576b5951f1b5e1c2b0d0bb831d9a',1,'opt.h']]],
+  ['lwip_5fnd6_5fnum_5frouters_246',['LWIP_ND6_NUM_ROUTERS',['../group__lwip__opts__nd6.html#ga75e81a96148f266c8fad8c0bcab2f36a',1,'opt.h']]],
+  ['lwip_5fnd6_5fqueueing_247',['LWIP_ND6_QUEUEING',['../group__lwip__opts__nd6.html#ga0757a3c1b5d1563ad2d77228e1d8a60f',1,'opt.h']]],
+  ['lwip_5fnd6_5frdnss_5fmax_5fdns_5fservers_248',['LWIP_ND6_RDNSS_MAX_DNS_SERVERS',['../group__lwip__opts__nd6.html#gaea4d829c0b52cc6cc28925eee89a7429',1,'opt.h']]],
+  ['lwip_5fnd6_5freachable_5ftime_249',['LWIP_ND6_REACHABLE_TIME',['../group__lwip__opts__nd6.html#ga269db9d61cdfc2fd3bc7b12c56261c74',1,'opt.h']]],
+  ['lwip_5fnd6_5fretrans_5ftimer_250',['LWIP_ND6_RETRANS_TIMER',['../group__lwip__opts__nd6.html#ga461abcbeef1d236d1f3201827dd28ad9',1,'opt.h']]],
+  ['lwip_5fnd6_5ftcp_5freachability_5fhints_251',['LWIP_ND6_TCP_REACHABILITY_HINTS',['../group__lwip__opts__nd6.html#ga9d7cb6fd447ef0f6726f565e2c7509c4',1,'opt.h']]],
+  ['lwip_5fnetbios_5frespond_5fname_5fquery_252',['LWIP_NETBIOS_RESPOND_NAME_QUERY',['../group__netbiosns__opts.html#gaa9dec8fc3dee5e72fbe9b854437bce84',1,'netbiosns_opts.h']]],
+  ['lwip_5fnetbuf_5frecvinfo_253',['LWIP_NETBUF_RECVINFO',['../group__lwip__opts__udp.html#ga72021505969c5ce29e972486d7794baa',1,'opt.h']]],
+  ['lwip_5fnetconn_254',['LWIP_NETCONN',['../group__lwip__opts__netconn.html#ga478041b8544461258f6961bf0f3c1a77',1,'opt.h']]],
+  ['lwip_5fnetconn_5fdo_5faccepted_255',['lwip_netconn_do_accepted',['../api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5',1,'lwip_netconn_do_accepted(void *m):&#160;api_msg.c'],['../api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5',1,'lwip_netconn_do_accepted(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fbind_256',['lwip_netconn_do_bind',['../api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768',1,'lwip_netconn_do_bind(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768',1,'lwip_netconn_do_bind(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fbind_5fif_257',['lwip_netconn_do_bind_if',['../api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605',1,'lwip_netconn_do_bind_if(void *m):&#160;api_msg.c'],['../api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605',1,'lwip_netconn_do_bind_if(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fclose_258',['lwip_netconn_do_close',['../api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d',1,'lwip_netconn_do_close(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d',1,'lwip_netconn_do_close(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fconnect_259',['lwip_netconn_do_connect',['../api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902',1,'lwip_netconn_do_connect(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902',1,'lwip_netconn_do_connect(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fdelconn_260',['lwip_netconn_do_delconn',['../api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59',1,'lwip_netconn_do_delconn(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59',1,'lwip_netconn_do_delconn(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fdisconnect_261',['lwip_netconn_do_disconnect',['../api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a',1,'lwip_netconn_do_disconnect(void *m):&#160;api_msg.c'],['../api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a',1,'lwip_netconn_do_disconnect(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fgetaddr_262',['lwip_netconn_do_getaddr',['../api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163',1,'lwip_netconn_do_getaddr(void *m):&#160;api_msg.c'],['../api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163',1,'lwip_netconn_do_getaddr(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fgethostbyname_263',['lwip_netconn_do_gethostbyname',['../api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61',1,'lwip_netconn_do_gethostbyname(void *arg):&#160;api_msg.c'],['../api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61',1,'lwip_netconn_do_gethostbyname(void *arg):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fjoin_5fleave_5fgroup_264',['lwip_netconn_do_join_leave_group',['../api__msg_8c.html#a7402b52416828906a5679828cce37546',1,'lwip_netconn_do_join_leave_group(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a7402b52416828906a5679828cce37546',1,'lwip_netconn_do_join_leave_group(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fjoin_5fleave_5fgroup_5fnetif_265',['lwip_netconn_do_join_leave_group_netif',['../api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722',1,'lwip_netconn_do_join_leave_group_netif(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722',1,'lwip_netconn_do_join_leave_group_netif(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5flisten_266',['lwip_netconn_do_listen',['../api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f',1,'lwip_netconn_do_listen(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f',1,'lwip_netconn_do_listen(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fnewconn_267',['lwip_netconn_do_newconn',['../api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236',1,'lwip_netconn_do_newconn(void *m):&#160;api_msg.c'],['../api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236',1,'lwip_netconn_do_newconn(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5frecv_268',['lwip_netconn_do_recv',['../api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f',1,'lwip_netconn_do_recv(void *m):&#160;api_msg.c'],['../api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f',1,'lwip_netconn_do_recv(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fsend_269',['lwip_netconn_do_send',['../api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c',1,'lwip_netconn_do_send(void *m):&#160;api_msg.c'],['../api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c',1,'lwip_netconn_do_send(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fwrite_270',['lwip_netconn_do_write',['../api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c',1,'lwip_netconn_do_write(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c',1,'lwip_netconn_do_write(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5ffullduplex_271',['LWIP_NETCONN_FULLDUPLEX',['../group__lwip__opts__netconn.html#ga7bfe8487a3abffdd9d6730977d22c406',1,'opt.h']]],
+  ['lwip_5fnetconn_5fsem_5fper_5fthread_272',['LWIP_NETCONN_SEM_PER_THREAD',['../group__lwip__opts__netconn.html#ga2543345adf7d2c307df78a54ac2ba8c4',1,'opt.h']]],
+  ['lwip_5fnetif_5fapi_273',['LWIP_NETIF_API',['../group__lwip__opts__netif.html#gadd45fb65f2d0e6de5a0d14ff9e101b77',1,'opt.h']]],
+  ['lwip_5fnetif_5fext_5fstatus_5fcallback_274',['LWIP_NETIF_EXT_STATUS_CALLBACK',['../group__lwip__opts__netif.html#ga090482867ba04d442ab5b8ad745c0e1e',1,'opt.h']]],
+  ['lwip_5fnetif_5fhostname_275',['LWIP_NETIF_HOSTNAME',['../group__lwip__opts__netif.html#gaa714dbfa66822ec4c6111bdb8cf753c1',1,'opt.h']]],
+  ['lwip_5fnetif_5fhwaddrhint_276',['LWIP_NETIF_HWADDRHINT',['../group__lwip__opts__netif.html#gad1d5e878d94b56ba687cef69be936ad9',1,'opt.h']]],
+  ['lwip_5fnetif_5flink_5fcallback_277',['LWIP_NETIF_LINK_CALLBACK',['../group__lwip__opts__netif.html#ga1a446932dd927cc4136ba654c13bb97b',1,'opt.h']]],
+  ['lwip_5fnetif_5floopback_278',['LWIP_NETIF_LOOPBACK',['../group__lwip__opts__loop.html#ga724a0ea765d5a47d026d529725f31c01',1,'opt.h']]],
+  ['lwip_5fnetif_5floopback_5fmultithreading_279',['LWIP_NETIF_LOOPBACK_MULTITHREADING',['../group__lwip__opts__loop.html#gaa28d13ddd5281b1912276991e7ea58c5',1,'opt.h']]],
+  ['lwip_5fnetif_5fremove_5fcallback_280',['LWIP_NETIF_REMOVE_CALLBACK',['../group__lwip__opts__netif.html#ga9c942c2e9655b06d4f73c630d30f60bf',1,'opt.h']]],
+  ['lwip_5fnetif_5fstatus_5fcallback_281',['LWIP_NETIF_STATUS_CALLBACK',['../group__lwip__opts__netif.html#gaffb97d89516c38d3fcb9e44e5d707f36',1,'opt.h']]],
+  ['lwip_5fnetif_5ftx_5fsingle_5fpbuf_282',['LWIP_NETIF_TX_SINGLE_PBUF',['../group__lwip__opts__netif.html#gabafb9f64a80e51b56c0abbcfc1f7e04e',1,'opt.h']]],
+  ['lwip_5fno_5fctype_5fh_283',['LWIP_NO_CTYPE_H',['../group__compiler__abstraction.html#ga6871ce1e92ae09cdad39a9b230a3a800',1,'arch.h']]],
+  ['lwip_5fno_5finttypes_5fh_284',['LWIP_NO_INTTYPES_H',['../group__compiler__abstraction.html#ga5bf52d6f2729d0c8afd365f69d7d4373',1,'arch.h']]],
+  ['lwip_5fno_5flimits_5fh_285',['LWIP_NO_LIMITS_H',['../group__compiler__abstraction.html#gade9c8513419a799cd78a07ae894bb805',1,'arch.h']]],
+  ['lwip_5fno_5fstddef_5fh_286',['LWIP_NO_STDDEF_H',['../group__compiler__abstraction.html#ga53954d507c09e521ec0d44a2450bb89d',1,'arch.h']]],
+  ['lwip_5fno_5fstdint_5fh_287',['LWIP_NO_STDINT_H',['../group__compiler__abstraction.html#ga122c754db96ecad23bc6f4541d6360c1',1,'arch.h']]],
+  ['lwip_5fnoassert_288',['LWIP_NOASSERT',['../group__lwip__assertions.html#ga71b7787802abbfc2218fb1f39f948a41',1,'debug.h']]],
+  ['lwip_5fnsc_5fipv4_5faddr_5fvalid_289',['LWIP_NSC_IPV4_ADDR_VALID',['../netif_8h.html#a716576f3485524d44ef0843839ef0564',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5faddress_5fchanged_290',['LWIP_NSC_IPV4_ADDRESS_CHANGED',['../netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5fgateway_5fchanged_291',['LWIP_NSC_IPV4_GATEWAY_CHANGED',['../netif_8h.html#a22400d2202581b4a7273cded712adf49',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5fnetmask_5fchanged_292',['LWIP_NSC_IPV4_NETMASK_CHANGED',['../netif_8h.html#ad747072771a887443ab33f90a12077d4',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv4_5fsettings_5fchanged_293',['LWIP_NSC_IPV4_SETTINGS_CHANGED',['../netif_8h.html#a4ff19a6f3045f65d0397d30b6609660a',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv6_5faddr_5fstate_5fchanged_294',['LWIP_NSC_IPV6_ADDR_STATE_CHANGED',['../netif_8h.html#a0d70fe11cac43c8fa35827b8e607ccf6',1,'netif.h']]],
+  ['lwip_5fnsc_5fipv6_5fset_295',['LWIP_NSC_IPV6_SET',['../netif_8h.html#a8fb4317a77ee2e3848be80db15618666',1,'netif.h']]],
+  ['lwip_5fnsc_5flink_5fchanged_296',['LWIP_NSC_LINK_CHANGED',['../netif_8h.html#a5ad7308195c0581680dd62fb148501cd',1,'netif.h']]],
+  ['lwip_5fnsc_5fnetif_5fadded_297',['LWIP_NSC_NETIF_ADDED',['../netif_8h.html#adbfecb47897cfe63d4f6366c1fed23b2',1,'netif.h']]],
+  ['lwip_5fnsc_5fnetif_5fremoved_298',['LWIP_NSC_NETIF_REMOVED',['../netif_8h.html#ae8e2dc87c19a03d481ae37bcf7ced5c9',1,'netif.h']]],
+  ['lwip_5fnsc_5fstatus_5fchanged_299',['LWIP_NSC_STATUS_CHANGED',['../netif_8h.html#a6f406ee3ab60e8a4f27ae2483c96b8e2',1,'netif.h']]],
+  ['lwip_5fnum_5fcyclic_5ftimers_300',['lwip_num_cyclic_timers',['../timeouts_8c.html#a9d01f287a19f20b073d3a1c306ecbfcd',1,'lwip_num_cyclic_timers:&#160;timeouts.c'],['../timeouts_8h.html#a9d01f287a19f20b073d3a1c306ecbfcd',1,'lwip_num_cyclic_timers:&#160;timeouts.c']]],
+  ['lwip_5fnum_5fnetif_5fclient_5fdata_301',['LWIP_NUM_NETIF_CLIENT_DATA',['../group__lwip__opts__netif.html#ga94a35212616f9a9aae5c98741612b936',1,'opt.h']]],
+  ['lwip_5fnum_5fsys_5ftimeout_5finternal_302',['LWIP_NUM_SYS_TIMEOUT_INTERNAL',['../group__lwip__opts__memp.html#ga87a05debb46ff82093d0e6dc1aad8804',1,'opt.h']]],
+  ['lwip_5fpacked_5fcast_303',['LWIP_PACKED_CAST',['../group__compiler__abstraction.html#ga4488578f18ad1a76e4fa8bc288c51446',1,'arch.h']]],
+  ['lwip_5fpbuf_5fcustom_5fdata_304',['LWIP_PBUF_CUSTOM_DATA',['../group__lwip__opts__pbuf.html#ga3b7067723b378457373722ca1a46a9d6',1,'opt.h']]],
+  ['lwip_5fpbuf_5fref_5ft_305',['LWIP_PBUF_REF_T',['../group__lwip__opts__pbuf.html#gaaefb80d6bf9257c0f4322c36e1272c38',1,'opt.h']]],
+  ['lwip_5fperf_306',['LWIP_PERF',['../group__lwip__opts__perf.html#ga44acd95b33e2d58a74455279721298de',1,'opt.h']]],
+  ['lwip_5fplatform_5fassert_307',['LWIP_PLATFORM_ASSERT',['../group__compiler__abstraction.html#ga7e8bcd0282525704d6dd596bdd1b47d0',1,'arch.h']]],
+  ['lwip_5fplatform_5fdiag_308',['LWIP_PLATFORM_DIAG',['../group__compiler__abstraction.html#gaccef167be13a500ce30036030a9b142b',1,'arch.h']]],
+  ['lwip_5fpollscan_5fclear_309',['LWIP_POLLSCAN_CLEAR',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9aa9a8fe3199d00016f1f5ad639e1b28f7',1,'sockets.c']]],
+  ['lwip_5fpollscan_5fdec_5fwait_310',['LWIP_POLLSCAN_DEC_WAIT',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9a6c1eefa3e29a39b923c4b522eb1b3eb1',1,'sockets.c']]],
+  ['lwip_5fpollscan_5finc_5fwait_311',['LWIP_POLLSCAN_INC_WAIT',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9ab6511d3104f70c18fb4bd80f24cb867d',1,'sockets.c']]],
+  ['lwip_5fpollscan_5fopts_312',['lwip_pollscan_opts',['../sockets_8c.html#a2f15a466e75cbaaea0c31e63116870f9',1,'sockets.c']]],
+  ['lwip_5fposix_5fsockets_5fio_5fnames_313',['LWIP_POSIX_SOCKETS_IO_NAMES',['../group__lwip__opts__socket.html#ga484c38ab08f60d5b3335d23d31f9a402',1,'opt.h']]],
+  ['lwip_5fprovide_5ferrno_314',['LWIP_PROVIDE_ERRNO',['../group__compiler__abstraction.html#ga8e2cba4c97dd38f4d517ed21cf109ade',1,'arch.h']]],
+  ['lwip_5fptr_5fnumeric_5fcast_315',['LWIP_PTR_NUMERIC_CAST',['../group__compiler__abstraction.html#ga683e5c35d3263fe3145e6a6bc546604a',1,'arch.h']]],
+  ['lwip_5frand_316',['LWIP_RAND',['../group__compiler__abstraction.html#ga77370c377781ee7489e30eaf772ea05a',1,'arch.h']]],
+  ['lwip_5fraw_317',['LWIP_RAW',['../group__lwip__opts__raw.html#gaca452be5cb05d9666f8f57e582c39221',1,'opt.h']]],
+  ['lwip_5frc_5fdevelopment_318',['LWIP_RC_DEVELOPMENT',['../group__lwip__version.html#ga9ca69b1a453eb72efd0bbda333f2a33b',1,'init.h']]],
+  ['lwip_5frc_5frelease_319',['LWIP_RC_RELEASE',['../group__lwip__version.html#ga375ee868e76ed7c458cdf249387bd469',1,'init.h']]],
+  ['lwip_5frfc7668_5fip_5funcompressed_5fdebug_320',['LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a5b7a3e204d2edde5552ca3c8694419c1',1,'lowpan6_opts.h']]],
+  ['lwip_5frfc7668_5flinux_5fworkaround_5fpublic_5faddress_321',['LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS',['../lowpan6__opts_8h.html#af4a4d962af3439b111a8e72e5eeaccf8',1,'lowpan6_opts.h']]],
+  ['lwip_5fselect_5fcb_322',['lwip_select_cb',['../structlwip__select__cb.html',1,'']]],
+  ['lwip_5fshutdown_323',['lwip_shutdown',['../sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1',1,'lwip_shutdown(int s, int how):&#160;sockets.c'],['../sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1',1,'lwip_shutdown(int s, int how):&#160;sockets.c']]],
+  ['lwip_5fsingle_5fnetif_324',['LWIP_SINGLE_NETIF',['../group__lwip__opts__netif.html#ga943063b053eeac76b0b1bcef2ddd93be',1,'opt.h']]],
+  ['lwip_5fsnmp_325',['LWIP_SNMP',['../group__snmp__opts.html#gaf4900859dc53f19f5f67cc34e48ad68c',1,'snmp_opts.h']]],
+  ['lwip_5fsnmp_5fv3_326',['LWIP_SNMP_V3',['../snmp__opts_8h.html#a1fe0e120f979ed400f649019edcefe2b',1,'snmp_opts.h']]],
+  ['lwip_5fso_5flinger_327',['LWIP_SO_LINGER',['../group__lwip__opts__socket.html#gaa91292d5d014dc1c6f1c1f4166269a1d',1,'opt.h']]],
+  ['lwip_5fso_5frcvbuf_328',['LWIP_SO_RCVBUF',['../group__lwip__opts__socket.html#ga06390cebcf4d13d3d47a11365e5fcd28',1,'opt.h']]],
+  ['lwip_5fso_5frcvtimeo_329',['LWIP_SO_RCVTIMEO',['../group__lwip__opts__socket.html#ga91af3ade95b20b9a60c65ed0380fa0ed',1,'opt.h']]],
+  ['lwip_5fso_5fsndrcvtimeo_5fnonstandard_330',['LWIP_SO_SNDRCVTIMEO_NONSTANDARD',['../group__lwip__opts__socket.html#ga5b115bacb569763d8a3889a12229e942',1,'opt.h']]],
+  ['lwip_5fso_5fsndtimeo_331',['LWIP_SO_SNDTIMEO',['../group__lwip__opts__socket.html#ga1162cb685f202d9b21c11344b8209a58',1,'opt.h']]],
+  ['lwip_5fsock_332',['lwip_sock',['../structlwip__sock.html',1,'']]],
+  ['lwip_5fsocket_333',['LWIP_SOCKET',['../group__lwip__opts__socket.html#ga1cb62ce61ac39d7d6728ae5d3d3b927f',1,'opt.h']]],
+  ['lwip_5fsocket_5fexternal_5fheaders_334',['LWIP_SOCKET_EXTERNAL_HEADERS',['../group__lwip__opts__socket.html#ga524c013ecdd8a45a2949f2a433469e82',1,'opt.h']]],
+  ['lwip_5fsocket_5foffset_335',['LWIP_SOCKET_OFFSET',['../group__lwip__opts__socket.html#gad0197c845fbb44c920b272f0fef3b57e',1,'opt.h']]],
+  ['lwip_5fsocket_5fpoll_336',['LWIP_SOCKET_POLL',['../group__lwip__opts__socket.html#ga6c14d705e3321429683f24de9f5a7200',1,'opt.h']]],
+  ['lwip_5fsocket_5fselect_337',['LWIP_SOCKET_SELECT',['../group__lwip__opts__socket.html#ga68417078b71b0be9735256f52933dcdb',1,'opt.h']]],
+  ['lwip_5fsocket_5fthread_5fcleanup_338',['lwip_socket_thread_cleanup',['../sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7',1,'lwip_socket_thread_cleanup(void):&#160;sockets.c'],['../sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7',1,'lwip_socket_thread_cleanup(void):&#160;sockets.c']]],
+  ['lwip_5fsocket_5fthread_5finit_339',['lwip_socket_thread_init',['../sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0',1,'lwip_socket_thread_init(void):&#160;sockets.c'],['../sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0',1,'lwip_socket_thread_init(void):&#160;sockets.c']]],
+  ['lwip_5fstats_340',['LWIP_STATS',['../group__lwip__opts__stats.html#ga542b58734cc01902c5e099f6efdc5f1b',1,'opt.h']]],
+  ['lwip_5fstats_341',['lwip_stats',['../stats_8c.html#a614735db0145db9ba944ede600d1d19b',1,'lwip_stats:&#160;stats.c'],['../stats_8h.html#a614735db0145db9ba944ede600d1d19b',1,'lwip_stats:&#160;stats.c']]],
+  ['lwip_5fstats_5fdisplay_342',['LWIP_STATS_DISPLAY',['../group__lwip__opts__stats.html#gacdc38ed58d1900b5d3d109a65be1c3d1',1,'opt.h']]],
+  ['lwip_5fstricmp_343',['lwip_stricmp',['../group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a',1,'lwip_stricmp(const char *str1, const char *str2):&#160;def.c'],['../group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a',1,'lwip_stricmp(const char *str1, const char *str2):&#160;def.c']]],
+  ['lwip_5fstrnicmp_344',['lwip_strnicmp',['../group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a',1,'lwip_strnicmp(const char *str1, const char *str2, size_t len):&#160;def.c'],['../group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a',1,'lwip_strnicmp(const char *str1, const char *str2, size_t len):&#160;def.c']]],
+  ['lwip_5fstrnistr_345',['lwip_strnistr',['../group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa',1,'lwip_strnistr(const char *buffer, const char *token, size_t n):&#160;def.c'],['../group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa',1,'lwip_strnistr(const char *buffer, const char *token, size_t n):&#160;def.c']]],
+  ['lwip_5fstrnstr_346',['lwip_strnstr',['../group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c'],['../group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c']]],
+  ['lwip_5fsupport_5fcustom_5fpbuf_347',['LWIP_SUPPORT_CUSTOM_PBUF',['../pbuf_8h.html#a64174c5169b48dc17674324afd9c63b9',1,'pbuf.h']]],
+  ['lwip_5ftcp_348',['LWIP_TCP',['../group__lwip__opts__tcp.html#gaa4ed98deb97b77c633cb8870f34c71e9',1,'opt.h']]],
+  ['lwip_5ftcp_5fcalc_5finitial_5fcwnd_349',['LWIP_TCP_CALC_INITIAL_CWND',['../tcp__in_8c.html#aea174f2c6ca4cb0ad270dd8d0faf0c84',1,'tcp_in.c']]],
+  ['lwip_5ftcp_5fclose_5ftimeout_5fms_5fdefault_350',['LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT',['../group__lwip__opts__socket.html#ga3e7498d5d2921f0df3792de72f384d36',1,'opt.h']]],
+  ['lwip_5ftcp_5fkeepalive_351',['LWIP_TCP_KEEPALIVE',['../group__lwip__opts__socket.html#ga8b9369ab260f032686a81c77c5b4db77',1,'opt.h']]],
+  ['lwip_5ftcp_5fmax_5fsack_5fnum_352',['LWIP_TCP_MAX_SACK_NUM',['../group__lwip__opts__tcp.html#gaaac0e9f559a8e3c251f3504cebcf44dc',1,'opt.h']]],
+  ['lwip_5ftcp_5fpcb_5fnum_5fext_5fargs_353',['LWIP_TCP_PCB_NUM_EXT_ARGS',['../group__lwip__opts__tcp.html#ga40b1cdad52eaa91a3f5c242fc92ee223',1,'opt.h']]],
+  ['lwip_5ftcp_5frto_5ftime_354',['LWIP_TCP_RTO_TIME',['../group__lwip__opts__tcp.html#gade23373901980c6e7a43cef813386ebe',1,'opt.h']]],
+  ['lwip_5ftcp_5fsack_5fout_355',['LWIP_TCP_SACK_OUT',['../group__lwip__opts__tcp.html#gaf1b6a015d29fea67b906c276e1e8314f',1,'opt.h']]],
+  ['lwip_5ftcp_5ftimestamps_356',['LWIP_TCP_TIMESTAMPS',['../group__lwip__opts__tcp.html#ga249bc450bb818cf2ef3cf1472ff354fd',1,'opt.h']]],
+  ['lwip_5ftcpip_5fcore_5flocking_357',['LWIP_TCPIP_CORE_LOCKING',['../group__lwip__opts__lock.html#ga8e46232794349c209e8ed4e9e7e4f011',1,'opt.h']]],
+  ['lwip_5ftcpip_5fcore_5flocking_5finput_358',['LWIP_TCPIP_CORE_LOCKING_INPUT',['../group__lwip__opts__lock.html#ga351beb1c06affe49e717bc9f76c66acf',1,'opt.h']]],
+  ['lwip_5ftcpip_5fthread_5falive_359',['LWIP_TCPIP_THREAD_ALIVE',['../group__lwip__opts__thread.html#ga8b99d75d9e0a0868567d10c8522915bb',1,'opt.h']]],
+  ['lwip_5ftcpip_5ftimeout_360',['LWIP_TCPIP_TIMEOUT',['../group__lwip__opts__netconn.html#ga1cd8d15a42262a0defaedabed126ea99',1,'opt.h']]],
+  ['lwip_5fthread_5ffn_361',['lwip_thread_fn',['../sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9',1,'sys.h']]],
+  ['lwip_5ftimers_362',['LWIP_TIMERS',['../group__lwip__opts__timers.html#ga25a41610055f91cbd0960256240b8f2c',1,'opt.h']]],
+  ['lwip_5ftimers_5fcustom_363',['LWIP_TIMERS_CUSTOM',['../group__lwip__opts__timers.html#gaff0ea56f3e3d8e86c49b50557bc13815',1,'opt.h']]],
+  ['lwip_5ftimeval_5fprivate_364',['LWIP_TIMEVAL_PRIVATE',['../sockets_8h.html#aaffd64f6887883ec6401e6bb684c40fa',1,'sockets.h']]],
+  ['lwip_5fudp_365',['LWIP_UDP',['../group__lwip__opts__udp.html#gab6030e96e72df649d2650fd32d7a67b3',1,'opt.h']]],
+  ['lwip_5fudplite_366',['LWIP_UDPLITE',['../group__lwip__opts__udp.html#ga35731bc5f337943e474a15c1cd538a61',1,'opt.h']]],
+  ['lwip_5funused_5farg_367',['LWIP_UNUSED_ARG',['../group__compiler__abstraction.html#ga70624a5deb8b9199406372a7f3603ecf',1,'arch.h']]],
+  ['lwip_5fversion_368',['LWIP_VERSION',['../group__lwip__version.html#ga0a0d322fad0a67aa5b8f1b8c9dfcfe59',1,'init.h']]],
+  ['lwip_5fversion_5fmajor_369',['LWIP_VERSION_MAJOR',['../group__lwip__version.html#ga4308c06ef36496e00c798d96d7d03246',1,'init.h']]],
+  ['lwip_5fversion_5fminor_370',['LWIP_VERSION_MINOR',['../group__lwip__version.html#ga1e596388c15ba81e753c5633fad1c034',1,'init.h']]],
+  ['lwip_5fversion_5frc_371',['LWIP_VERSION_RC',['../group__lwip__version.html#gac1dc92d8f453a98560de7e2e00a221a1',1,'init.h']]],
+  ['lwip_5fversion_5frevision_372',['LWIP_VERSION_REVISION',['../group__lwip__version.html#ga0a57983df1b199cf39a2e6a2d90e3d50',1,'init.h']]],
+  ['lwip_5fversion_5fstring_373',['LWIP_VERSION_STRING',['../group__lwip__version.html#gab47e87bc38eef94486db402813183ba7',1,'init.h']]],
+  ['lwip_5fwnd_5fscale_374',['LWIP_WND_SCALE',['../group__lwip__opts__tcp.html#ga88dbbfeeeb41b129fdc8235fc08bb530',1,'opt.h']]],
+  ['lwiperf_2ec_375',['lwiperf.c',['../lwiperf_8c.html',1,'']]],
+  ['lwiperf_2eh_376',['lwiperf.h',['../lwiperf_8h.html',1,'']]],
+  ['lwiperf_5fabort_377',['lwiperf_abort',['../group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004',1,'lwiperf_abort(void *lwiperf_session):&#160;lwiperf.c'],['../group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004',1,'lwiperf_abort(void *lwiperf_session):&#160;lwiperf.c']]],
+  ['lwiperf_5fcheck_5frx_5fdata_378',['LWIPERF_CHECK_RX_DATA',['../lwiperf_8c.html#af51dcfc53fe575411c26e18963f1b902',1,'lwiperf.c']]],
+  ['lwiperf_5fclient_379',['LWIPERF_CLIENT',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cae1862655ebaaea2e7e0261dff0173110',1,'lwiperf.h']]],
+  ['lwiperf_5fclient_5ftype_380',['lwiperf_client_type',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76c',1,'lwiperf.h']]],
+  ['lwiperf_5fdual_381',['LWIPERF_DUAL',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76cab0381feca6655968e7380622e7a63ede',1,'lwiperf.h']]],
+  ['lwiperf_5freport_5ffn_382',['lwiperf_report_fn',['../lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd',1,'lwiperf.h']]],
+  ['lwiperf_5freport_5ftype_383',['lwiperf_report_type',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6',1,'lwiperf.h']]],
+  ['lwiperf_5fserver_5fip_5ftype_384',['LWIPERF_SERVER_IP_TYPE',['../lwiperf_8c.html#a1351e47d0bdb7d0fe0efaf9f1b2b0f7a',1,'lwiperf.c']]],
+  ['lwiperf_5fsettings_5ft_385',['lwiperf_settings_t',['../lwiperf_8c.html#a1e652bca1f12cfe6187a567d6b3be6a2',1,'lwiperf.c']]],
+  ['lwiperf_5fstart_5ftcp_5fclient_386',['lwiperf_start_tcp_client',['../group__iperf.html#ga1088722d967f0f465d45fd3b15dde445',1,'lwiperf_start_tcp_client(const ip_addr_t *remote_addr, u16_t remote_port, enum lwiperf_client_type type, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga1088722d967f0f465d45fd3b15dde445',1,'lwiperf_start_tcp_client(const ip_addr_t *remote_addr, u16_t remote_port, enum lwiperf_client_type type, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
+  ['lwiperf_5fstart_5ftcp_5fclient_5fdefault_387',['lwiperf_start_tcp_client_default',['../group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456',1,'lwiperf_start_tcp_client_default(const ip_addr_t *remote_addr, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456',1,'lwiperf_start_tcp_client_default(const ip_addr_t *remote_addr, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
+  ['lwiperf_5fstart_5ftcp_5fserver_388',['lwiperf_start_tcp_server',['../group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec',1,'lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec',1,'lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
+  ['lwiperf_5fstart_5ftcp_5fserver_5fdefault_389',['lwiperf_start_tcp_server_default',['../group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
+  ['lwiperf_5fstate_5ftcp_5ft_390',['lwiperf_state_tcp_t',['../lwiperf_8c.html#a96ae8ebbc5d13657a641ed174ae22e5b',1,'lwiperf.c']]],
+  ['lwiperf_5ftcp_5faborted_5flocal_391',['LWIPERF_TCP_ABORTED_LOCAL',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6abee2bf6da51a0845c15ac52b280203cb',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5flocal_5fdataerror_392',['LWIPERF_TCP_ABORTED_LOCAL_DATAERROR',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6adda7e5dbaf1e04eb04ec0fd2b05584a5',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5flocal_5ftxerror_393',['LWIPERF_TCP_ABORTED_LOCAL_TXERROR',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a3d4e1f5742d80aeafb6b22aa74d93e40',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5faborted_5fremote_394',['LWIPERF_TCP_ABORTED_REMOTE',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6ae664c0f987584f07fb0f6f8896aada0d',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5fdone_5fclient_395',['LWIPERF_TCP_DONE_CLIENT',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6a4f9bde0cad305eaab25d2c1d0196677b',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5fdone_5fserver_396',['LWIPERF_TCP_DONE_SERVER',['../lwiperf_8h.html#ab72a2d205e43d5243a291f937bbc24d6aa52255236ad2983346311ce7f28210e5',1,'lwiperf.h']]],
+  ['lwiperf_5ftcp_5fmax_5fidle_5fsec_397',['LWIPERF_TCP_MAX_IDLE_SEC',['../lwiperf_8c.html#a646d7e0b37c5cefdd6eef38a3fba4673',1,'lwiperf.c']]],
+  ['lwiperf_5ftradeoff_398',['LWIPERF_TRADEOFF',['../lwiperf_8h.html#ab3280e56eb41bd6f698a20843573f76caccdab7ee6e1b0981861e66f0755f7964',1,'lwiperf.h']]],
+  ['lwipopts_20h_399',['Options (lwipopts.h)',['../group__lwip__opts.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/classes_1.js b/doc/doxygen/output/html/search/classes_1.js
index 35844ed..11ec83f 100644
--- a/doc/doxygen/output/html/search/classes_1.js
+++ b/doc/doxygen/output/html/search/classes_1.js
@@ -1,5 +1,7 @@
 var searchData=
 [
-  ['api_5fmsg_0',['api_msg',['../structapi__msg.html',1,'']]],
-  ['autoip_1',['autoip',['../structautoip.html',1,'']]]
+  ['acd_0',['acd',['../structacd.html',1,'']]],
+  ['altcp_5fallocator_5fs_1',['altcp_allocator_s',['../structaltcp__allocator__s.html',1,'']]],
+  ['api_5fmsg_2',['api_msg',['../structapi__msg.html',1,'']]],
+  ['autoip_3',['autoip',['../structautoip.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/classes_6.js b/doc/doxygen/output/html/search/classes_6.js
index e5326c1..b109c59 100644
--- a/doc/doxygen/output/html/search/classes_6.js
+++ b/doc/doxygen/output/html/search/classes_6.js
@@ -3,22 +3,23 @@
   ['icmp6_5fecho_5fhdr_0',['icmp6_echo_hdr',['../structicmp6__echo__hdr.html',1,'']]],
   ['icmp6_5fhdr_1',['icmp6_hdr',['../structicmp6__hdr.html',1,'']]],
   ['icmp_5fecho_5fhdr_2',['icmp_echo_hdr',['../structicmp__echo__hdr.html',1,'']]],
-  ['ieee_5f802154_5fhdr_3',['ieee_802154_hdr',['../structieee__802154__hdr.html',1,'']]],
-  ['igmp_5fgroup_4',['igmp_group',['../structigmp__group.html',1,'']]],
-  ['igmp_5fmsg_5',['igmp_msg',['../structigmp__msg.html',1,'']]],
-  ['ip4_5faddr_6',['ip4_addr',['../structip4__addr.html',1,'']]],
-  ['ip4_5faddr_5fpacked_7',['ip4_addr_packed',['../structip4__addr__packed.html',1,'']]],
-  ['ip4_5faddr_5fwordaligned_8',['ip4_addr_wordaligned',['../structip4__addr__wordaligned.html',1,'']]],
-  ['ip6_5faddr_9',['ip6_addr',['../structip6__addr.html',1,'']]],
-  ['ip6_5faddr_5fpacked_10',['ip6_addr_packed',['../structip6__addr__packed.html',1,'']]],
-  ['ip6_5fhdr_11',['ip6_hdr',['../structip6__hdr.html',1,'']]],
-  ['ip6_5freass_5fhelper_12',['ip6_reass_helper',['../structip6__reass__helper.html',1,'']]],
-  ['ip6_5freassdata_13',['ip6_reassdata',['../structip6__reassdata.html',1,'']]],
-  ['ip_5faddr_14',['ip_addr',['../structip__addr.html',1,'']]],
-  ['ip_5fglobals_15',['ip_globals',['../structip__globals.html',1,'']]],
-  ['ip_5freass_5fhelper_16',['ip_reass_helper',['../structip__reass__helper.html',1,'']]],
-  ['ip_5freassdata_17',['ip_reassdata',['../structip__reassdata.html',1,'']]],
-  ['ipv4_5fchanged_5fs_18',['ipv4_changed_s',['../structnetif__ext__callback__args__t_1_1ipv4__changed__s.html',1,'netif_ext_callback_args_t']]],
-  ['ipv6_5faddr_5fstate_5fchanged_5fs_19',['ipv6_addr_state_changed_s',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html',1,'netif_ext_callback_args_t']]],
-  ['ipv6_5fset_5fs_20',['ipv6_set_s',['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html',1,'netif_ext_callback_args_t']]]
+  ['icmp_5fhdr_3',['icmp_hdr',['../structicmp__hdr.html',1,'']]],
+  ['ieee_5f802154_5fhdr_4',['ieee_802154_hdr',['../structieee__802154__hdr.html',1,'']]],
+  ['igmp_5fgroup_5',['igmp_group',['../structigmp__group.html',1,'']]],
+  ['igmp_5fmsg_6',['igmp_msg',['../structigmp__msg.html',1,'']]],
+  ['ip4_5faddr_7',['ip4_addr',['../structip4__addr.html',1,'']]],
+  ['ip4_5faddr_5fpacked_8',['ip4_addr_packed',['../structip4__addr__packed.html',1,'']]],
+  ['ip4_5faddr_5fwordaligned_9',['ip4_addr_wordaligned',['../structip4__addr__wordaligned.html',1,'']]],
+  ['ip6_5faddr_10',['ip6_addr',['../structip6__addr.html',1,'']]],
+  ['ip6_5faddr_5fpacked_11',['ip6_addr_packed',['../structip6__addr__packed.html',1,'']]],
+  ['ip6_5fhdr_12',['ip6_hdr',['../structip6__hdr.html',1,'']]],
+  ['ip6_5freass_5fhelper_13',['ip6_reass_helper',['../structip6__reass__helper.html',1,'']]],
+  ['ip6_5freassdata_14',['ip6_reassdata',['../structip6__reassdata.html',1,'']]],
+  ['ip_5faddr_15',['ip_addr',['../structip__addr.html',1,'']]],
+  ['ip_5fglobals_16',['ip_globals',['../structip__globals.html',1,'']]],
+  ['ip_5freass_5fhelper_17',['ip_reass_helper',['../structip__reass__helper.html',1,'']]],
+  ['ip_5freassdata_18',['ip_reassdata',['../structip__reassdata.html',1,'']]],
+  ['ipv4_5fchanged_5fs_19',['ipv4_changed_s',['../structnetif__ext__callback__args__t_1_1ipv4__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['ipv6_5faddr_5fstate_5fchanged_5fs_20',['ipv6_addr_state_changed_s',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html',1,'netif_ext_callback_args_t']]],
+  ['ipv6_5fset_5fs_21',['ipv6_set_s',['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html',1,'netif_ext_callback_args_t']]]
 ];
diff --git a/doc/doxygen/output/html/search/classes_8.js b/doc/doxygen/output/html/search/classes_8.js
index 3187f78..5d45de7 100644
--- a/doc/doxygen/output/html/search/classes_8.js
+++ b/doc/doxygen/output/html/search/classes_8.js
@@ -1,16 +1,19 @@
 var searchData=
 [
-  ['mdns_5fhost_0',['mdns_host',['../structmdns__host.html',1,'']]],
-  ['mdns_5foutpacket_1',['mdns_outpacket',['../structmdns__outpacket.html',1,'']]],
-  ['mdns_5fpacket_2',['mdns_packet',['../structmdns__packet.html',1,'']]],
-  ['mdns_5frr_5finfo_3',['mdns_rr_info',['../structmdns__rr__info.html',1,'']]],
-  ['mdns_5fservice_4',['mdns_service',['../structmdns__service.html',1,'']]],
-  ['mem_5',['mem',['../structmem.html',1,'']]],
-  ['memp_5fdesc_6',['memp_desc',['../structmemp__desc.html',1,'']]],
-  ['mld_5fgroup_7',['mld_group',['../structmld__group.html',1,'']]],
-  ['mld_5fheader_8',['mld_header',['../structmld__header.html',1,'']]],
-  ['mqtt_5fclient_5fs_9',['mqtt_client_s',['../structmqtt__client__s.html',1,'']]],
-  ['mqtt_5fconnect_5fclient_5finfo_5ft_10',['mqtt_connect_client_info_t',['../structmqtt__connect__client__info__t.html',1,'']]],
-  ['mqtt_5frequest_5ft_11',['mqtt_request_t',['../structmqtt__request__t.html',1,'']]],
-  ['mqtt_5fringbuf_5ft_12',['mqtt_ringbuf_t',['../structmqtt__ringbuf__t.html',1,'']]]
+  ['mdns_5fdelayed_5fmsg_0',['mdns_delayed_msg',['../structmdns__delayed__msg.html',1,'']]],
+  ['mdns_5fhost_1',['mdns_host',['../structmdns__host.html',1,'']]],
+  ['mdns_5foutmsg_2',['mdns_outmsg',['../structmdns__outmsg.html',1,'']]],
+  ['mdns_5foutpacket_3',['mdns_outpacket',['../structmdns__outpacket.html',1,'']]],
+  ['mdns_5fpacket_4',['mdns_packet',['../structmdns__packet.html',1,'']]],
+  ['mdns_5frequest_5',['mdns_request',['../structmdns__request.html',1,'']]],
+  ['mdns_5frr_5finfo_6',['mdns_rr_info',['../structmdns__rr__info.html',1,'']]],
+  ['mdns_5fservice_7',['mdns_service',['../structmdns__service.html',1,'']]],
+  ['mem_8',['mem',['../structmem.html',1,'']]],
+  ['memp_5fdesc_9',['memp_desc',['../structmemp__desc.html',1,'']]],
+  ['mld_5fgroup_10',['mld_group',['../structmld__group.html',1,'']]],
+  ['mld_5fheader_11',['mld_header',['../structmld__header.html',1,'']]],
+  ['mqtt_5fclient_5fs_12',['mqtt_client_s',['../structmqtt__client__s.html',1,'']]],
+  ['mqtt_5fconnect_5fclient_5finfo_5ft_13',['mqtt_connect_client_info_t',['../structmqtt__connect__client__info__t.html',1,'']]],
+  ['mqtt_5frequest_5ft_14',['mqtt_request_t',['../structmqtt__request__t.html',1,'']]],
+  ['mqtt_5fringbuf_5ft_15',['mqtt_ringbuf_t',['../structmqtt__ringbuf__t.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_0.js b/doc/doxygen/output/html/search/defines_0.js
index 2ed14d7..6464e80 100644
--- a/doc/doxygen/output/html/search/defines_0.js
+++ b/doc/doxygen/output/html/search/defines_0.js
@@ -1,19 +1,19 @@
 var searchData=
 [
-  ['altcp_5fmbedtls_5fdebug_0',['ALTCP_MBEDTLS_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5flib_5fdebug_1',['ALTCP_MBEDTLS_LIB_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5flib_5fdebug_5flevel_5fmin_2',['ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN',['../altcp__tls__mbedtls__opts_8h.html#ad8561bbfabb4ec81ad1c4d7304d16bb5',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fsession_5fcache_5fsize_3',['ALTCP_MBEDTLS_SESSION_CACHE_SIZE',['../altcp__tls__mbedtls__opts_8h.html#a1c8a3f37f8ede74835b03eedcdc41973',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fsession_5fcache_5ftimeout_5fseconds_4',['ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fsession_5fticket_5fcipher_5',['ALTCP_MBEDTLS_SESSION_TICKET_CIPHER',['../altcp__tls__mbedtls__opts_8h.html#a4917dbc00f43f88eb703c8ba89bd37f6',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fsession_5fticket_5ftimeout_5fseconds_6',['ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a66eff71890153166578b0b78d780ac50',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fuse_5fsession_5fcache_7',['ALTCP_MBEDTLS_USE_SESSION_CACHE',['../altcp__tls__mbedtls__opts_8h.html#abd6b53a101f046337a4d77c749dbab66',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fmbedtls_5fuse_5fsession_5ftickets_8',['ALTCP_MBEDTLS_USE_SESSION_TICKETS',['../altcp__tls__mbedtls__opts_8h.html#ae3dbc4de0fc53bcda746c9dfd5618d3b',1,'altcp_tls_mbedtls_opts.h']]],
-  ['altcp_5fproxyconnect_5fclient_5fagent_9',['ALTCP_PROXYCONNECT_CLIENT_AGENT',['../altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f',1,'altcp_proxyconnect.c']]],
-  ['api_5fevent_10',['API_EVENT',['../api_8h.html#a3ce590f58be8f60dbde361920863b26d',1,'api.h']]],
-  ['arp_5fage_5frerequest_5fused_5funicast_11',['ARP_AGE_REREQUEST_USED_UNICAST',['../etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a',1,'etharp.c']]],
-  ['arp_5fmaxpending_12',['ARP_MAXPENDING',['../etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9',1,'etharp.c']]],
-  ['arp_5ftmr_5finterval_13',['ARP_TMR_INTERVAL',['../lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37',1,'etharp.h']]],
-  ['autoip_5fremove_5fstruct_14',['autoip_remove_struct',['../autoip_8h.html#aaeb4b778fce078bee84144ab50916b15',1,'autoip.h']]],
-  ['autoip_5ftmr_5finterval_15',['AUTOIP_TMR_INTERVAL',['../autoip_8h.html#a8986919a452ab77eec9a199ff6668e92',1,'autoip.h']]]
+  ['acd_5ftmr_5finterval_0',['ACD_TMR_INTERVAL',['../acd_8h.html#aace6da0b0dacd77a9d6bd11f424ffa82',1,'acd.h']]],
+  ['altcp_5fmbedtls_5fauthmode_1',['ALTCP_MBEDTLS_AUTHMODE',['../altcp__tls__mbedtls__opts_8h.html#a12aba61586bd71cb42b0925b9211b366',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fdebug_2',['ALTCP_MBEDTLS_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a7727456eeb0b3311213936413d238989',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5flib_5fdebug_3',['ALTCP_MBEDTLS_LIB_DEBUG',['../altcp__tls__mbedtls__opts_8h.html#a12262be84ab6a04e2aff7ca152328308',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5flib_5fdebug_5flevel_5fmin_4',['ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN',['../altcp__tls__mbedtls__opts_8h.html#ad8561bbfabb4ec81ad1c4d7304d16bb5',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fcache_5fsize_5',['ALTCP_MBEDTLS_SESSION_CACHE_SIZE',['../altcp__tls__mbedtls__opts_8h.html#a1c8a3f37f8ede74835b03eedcdc41973',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fcache_5ftimeout_5fseconds_6',['ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a6acb28346f87b2310fc00ec1fccba2b6',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fticket_5fcipher_7',['ALTCP_MBEDTLS_SESSION_TICKET_CIPHER',['../altcp__tls__mbedtls__opts_8h.html#a4917dbc00f43f88eb703c8ba89bd37f6',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fsession_5fticket_5ftimeout_5fseconds_8',['ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS',['../altcp__tls__mbedtls__opts_8h.html#a66eff71890153166578b0b78d780ac50',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fuse_5fsession_5fcache_9',['ALTCP_MBEDTLS_USE_SESSION_CACHE',['../altcp__tls__mbedtls__opts_8h.html#abd6b53a101f046337a4d77c749dbab66',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fmbedtls_5fuse_5fsession_5ftickets_10',['ALTCP_MBEDTLS_USE_SESSION_TICKETS',['../altcp__tls__mbedtls__opts_8h.html#ae3dbc4de0fc53bcda746c9dfd5618d3b',1,'altcp_tls_mbedtls_opts.h']]],
+  ['altcp_5fproxyconnect_5fclient_5fagent_11',['ALTCP_PROXYCONNECT_CLIENT_AGENT',['../altcp__proxyconnect_8c.html#a344227f22aa1b58f7ed737a2d4f4636f',1,'altcp_proxyconnect.c']]],
+  ['api_5fevent_12',['API_EVENT',['../api_8h.html#a3ce590f58be8f60dbde361920863b26d',1,'api.h']]],
+  ['arp_5fage_5frerequest_5fused_5funicast_13',['ARP_AGE_REREQUEST_USED_UNICAST',['../etharp_8c.html#ac71515a6f140b25de49e9bf432b2bb2a',1,'etharp.c']]],
+  ['arp_5fmaxpending_14',['ARP_MAXPENDING',['../etharp_8c.html#a0a03fea13e060da5a53a10a75a96def9',1,'etharp.c']]],
+  ['arp_5ftmr_5finterval_15',['ARP_TMR_INTERVAL',['../lwip_2etharp_8h.html#aaa3d8ed1eb1129f518345e37b38cfc37',1,'etharp.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_1.js b/doc/doxygen/output/html/search/defines_1.js
index 8d6db09..b10abef 100644
--- a/doc/doxygen/output/html/search/defines_1.js
+++ b/doc/doxygen/output/html/search/defines_1.js
@@ -4,18 +4,19 @@
   ['dhcp6_5fremove_5fstruct_1',['dhcp6_remove_struct',['../dhcp6_8h.html#a76941ddba22fe00dfc47d2f339f7aca3',1,'dhcp6.h']]],
   ['dhcp6_5fstatus_5fsuccess_2',['DHCP6_STATUS_SUCCESS',['../prot_2dhcp6_8h.html#a878a7734e159826e82e958fe3a5ca175',1,'dhcp6.h']]],
   ['dhcp6_5ftimer_5fmsecs_3',['DHCP6_TIMER_MSECS',['../dhcp6_8h.html#afdd69327dc7d9f5cc4f029d706f60c8f',1,'dhcp6.h']]],
-  ['dhcp_5fcoarse_5ftimer_5fmsecs_4',['DHCP_COARSE_TIMER_MSECS',['../dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6',1,'dhcp.h']]],
-  ['dhcp_5fcoarse_5ftimer_5fsecs_5',['DHCP_COARSE_TIMER_SECS',['../dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e',1,'dhcp.h']]],
-  ['dhcp_5fcreate_5frand_5fxid_6',['DHCP_CREATE_RAND_XID',['../dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835',1,'dhcp.c']]],
-  ['dhcp_5ffine_5ftimer_5fmsecs_7',['DHCP_FINE_TIMER_MSECS',['../dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f',1,'dhcp.h']]],
-  ['dhcp_5fmax_5fmsg_5flen_8',['DHCP_MAX_MSG_LEN',['../dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b',1,'dhcp.c']]],
-  ['dhcp_5fmin_5freply_5flen_9',['DHCP_MIN_REPLY_LEN',['../dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab',1,'dhcp.c']]],
-  ['dhcp_5foptions_5flen_10',['DHCP_OPTIONS_LEN',['../prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06',1,'dhcp.h']]],
-  ['dhcp_5fremove_5fstruct_11',['dhcp_remove_struct',['../dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc',1,'dhcp.h']]],
-  ['dns_5fmax_5fttl_12',['DNS_MAX_TTL',['../dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2',1,'dns.c']]],
-  ['dns_5fmquery_5fport_13',['DNS_MQUERY_PORT',['../prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276',1,'dns.h']]],
-  ['dns_5fport_5fallowed_14',['DNS_PORT_ALLOWED',['../dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0',1,'dns.c']]],
-  ['dns_5frand_5ftxid_15',['DNS_RAND_TXID',['../dns_8c.html#a9209c204996270af5cfdfd6e391267a1',1,'dns.c']]],
-  ['dns_5fserver_5fport_16',['DNS_SERVER_PORT',['../prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317',1,'dns.h']]],
-  ['dns_5ftmr_5finterval_17',['DNS_TMR_INTERVAL',['../dns_8h.html#a464a7435c4c00735af59033d2acd83bb',1,'dns.h']]]
+  ['dhcp_5fadd_5fextra_5frequest_5foptions_4',['DHCP_ADD_EXTRA_REQUEST_OPTIONS',['../dhcp_8c.html#aa29d020558b37b29d5d5ae50dfeb0c88',1,'dhcp.c']]],
+  ['dhcp_5fcoarse_5ftimer_5fmsecs_5',['DHCP_COARSE_TIMER_MSECS',['../dhcp_8h.html#ad84b8f4deec421bbf6fd85e8fae047d6',1,'dhcp.h']]],
+  ['dhcp_5fcoarse_5ftimer_5fsecs_6',['DHCP_COARSE_TIMER_SECS',['../dhcp_8h.html#a3751cc5daa0875d415ebacd8ad675f1e',1,'dhcp.h']]],
+  ['dhcp_5fcreate_5frand_5fxid_7',['DHCP_CREATE_RAND_XID',['../dhcp_8c.html#ad6de9c5120654454a330bf5de53c4835',1,'dhcp.c']]],
+  ['dhcp_5ffine_5ftimer_5fmsecs_8',['DHCP_FINE_TIMER_MSECS',['../dhcp_8h.html#a7a26209f52eebe8ded457ae141df403f',1,'dhcp.h']]],
+  ['dhcp_5fmax_5fmsg_5flen_9',['DHCP_MAX_MSG_LEN',['../dhcp_8c.html#a63e9ec4517b80d8576f218d905e31a9b',1,'dhcp.c']]],
+  ['dhcp_5fmin_5freply_5flen_10',['DHCP_MIN_REPLY_LEN',['../dhcp_8c.html#aa52c2b64ef42fbad84a3bcd58052caab',1,'dhcp.c']]],
+  ['dhcp_5foptions_5flen_11',['DHCP_OPTIONS_LEN',['../prot_2dhcp_8h.html#ae99d4be0d03f6f9c8f02f63abde91a06',1,'dhcp.h']]],
+  ['dhcp_5fremove_5fstruct_12',['dhcp_remove_struct',['../dhcp_8h.html#aa92284faa099dac4331c1fc0b997dabc',1,'dhcp.h']]],
+  ['dns_5fmax_5fttl_13',['DNS_MAX_TTL',['../dns_8c.html#a7f5553dc4a0d2bf99ba1282a86df31e2',1,'dns.c']]],
+  ['dns_5fmquery_5fport_14',['DNS_MQUERY_PORT',['../prot_2dns_8h.html#a62d67af5ac6c6b3f98a6566a42564276',1,'dns.h']]],
+  ['dns_5fport_5fallowed_15',['DNS_PORT_ALLOWED',['../dns_8c.html#a97f3b0c56aeee091fdf2f07faf864ce0',1,'dns.c']]],
+  ['dns_5frand_5ftxid_16',['DNS_RAND_TXID',['../dns_8c.html#a9209c204996270af5cfdfd6e391267a1',1,'dns.c']]],
+  ['dns_5fserver_5fport_17',['DNS_SERVER_PORT',['../prot_2dns_8h.html#a9266b48706648ecf0625a3e651095317',1,'dns.h']]],
+  ['dns_5ftmr_5finterval_18',['DNS_TMR_INTERVAL',['../dns_8h.html#a464a7435c4c00735af59033d2acd83bb',1,'dns.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_4.js b/doc/doxygen/output/html/search/defines_4.js
index dfe3b6c..8e9d53c 100644
--- a/doc/doxygen/output/html/search/defines_4.js
+++ b/doc/doxygen/output/html/search/defines_4.js
@@ -1,10 +1,9 @@
 var searchData=
 [
-  ['hostent_5fstorage_0',['HOSTENT_STORAGE',['../netdb_8c.html#acfc1e988534c0e497599b904739f92fe',1,'netdb.c']]],
-  ['http_5fis_5fdata_5fvolatile_1',['HTTP_IS_DATA_VOLATILE',['../httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300',1,'httpd.c']]],
-  ['http_5fis_5fhdr_5fvolatile_2',['HTTP_IS_HDR_VOLATILE',['../httpd_8c.html#af281bc4a762d56243e0b85dd4197174a',1,'httpd.c']]],
-  ['httpc_5fclient_5fagent_3',['HTTPC_CLIENT_AGENT',['../http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a',1,'http_client.c']]],
-  ['httpc_5fdebug_4',['HTTPC_DEBUG',['../http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1',1,'http_client.c']]],
-  ['httpc_5fdebug_5frequest_5',['HTTPC_DEBUG_REQUEST',['../http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a',1,'http_client.c']]],
-  ['httpd_5fssi_5ftag_5funknown_6',['HTTPD_SSI_TAG_UNKNOWN',['../httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca',1,'httpd.h']]]
+  ['http_5fis_5fdata_5fvolatile_0',['HTTP_IS_DATA_VOLATILE',['../httpd_8c.html#aa93d60e8af23b915b5b9652ff71e1300',1,'httpd.c']]],
+  ['http_5fis_5fhdr_5fvolatile_1',['HTTP_IS_HDR_VOLATILE',['../httpd_8c.html#af281bc4a762d56243e0b85dd4197174a',1,'httpd.c']]],
+  ['httpc_5fclient_5fagent_2',['HTTPC_CLIENT_AGENT',['../http__client_8c.html#aeda6122d341b879ba8b0fb2df834276a',1,'http_client.c']]],
+  ['httpc_5fdebug_3',['HTTPC_DEBUG',['../http__client_8c.html#a32d4c0e6e42327e21fb59dabdc152dd1',1,'http_client.c']]],
+  ['httpc_5fdebug_5frequest_4',['HTTPC_DEBUG_REQUEST',['../http__client_8c.html#ad2ec42c8e7adaef67266a5bd12c4ad2a',1,'http_client.c']]],
+  ['httpd_5fssi_5ftag_5funknown_5',['HTTPD_SSI_TAG_UNKNOWN',['../httpd_8h.html#aeb00bcd99ec9627b108832f0b58891ca',1,'httpd.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_5.js b/doc/doxygen/output/html/search/defines_5.js
index 2d7f3b7..6ebd1b9 100644
--- a/doc/doxygen/output/html/search/defines_5.js
+++ b/doc/doxygen/output/html/search/defines_5.js
@@ -7,72 +7,79 @@
   ['inaddr_5floopback_4',['INADDR_LOOPBACK',['../lwip_2inet_8h.html#ae1ac25d7797666cff6d01d6c795c2378',1,'inet.h']]],
   ['inaddr_5fnone_5',['INADDR_NONE',['../lwip_2inet_8h.html#a3d2472d6cf31b73eeb829110dd0fffea',1,'inet.h']]],
   ['ip4_5faddr_6',['IP4_ADDR',['../ip4__addr_8h.html#a58aee4166c466f9ac7035bf5cc9f9974',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fcopy_7',['ip4_addr_copy',['../ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fget_5fnetwork_8',['ip4_addr_get_network',['../ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fget_5fu32_9',['ip4_addr_get_u32',['../ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fisloopback_10',['ip4_addr_isloopback',['../ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fnetcmp_11',['ip4_addr_netcmp',['../ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_12',['ip4_addr_set',['../ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5fany_13',['ip4_addr_set_any',['../ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5fhton_14',['ip4_addr_set_hton',['../ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5floopback_15',['ip4_addr_set_loopback',['../ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5fu32_16',['ip4_addr_set_u32',['../ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520',1,'ip4_addr.h']]],
-  ['ip4_5faddr_5fset_5fzero_17',['ip4_addr_set_zero',['../ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea',1,'ip4_addr.h']]],
-  ['ip4_5fcurrent_5fdest_5faddr_18',['ip4_current_dest_addr',['../ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720',1,'ip.h']]],
-  ['ip4_5fcurrent_5fheader_19',['ip4_current_header',['../ip_8h.html#a3ce482b7e08282effd670001198ecd87',1,'ip.h']]],
-  ['ip4_5fcurrent_5fsrc_5faddr_20',['ip4_current_src_addr',['../ip_8h.html#ad2a62f96b9431a79f0258dc13058b160',1,'ip.h']]],
-  ['ip6_5faddr_21',['IP6_ADDR',['../ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock1_22',['IP6_ADDR_BLOCK1',['../ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock2_23',['IP6_ADDR_BLOCK2',['../ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock3_24',['IP6_ADDR_BLOCK3',['../ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock4_25',['IP6_ADDR_BLOCK4',['../ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock5_26',['IP6_ADDR_BLOCK5',['../ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock6_27',['IP6_ADDR_BLOCK6',['../ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock7_28',['IP6_ADDR_BLOCK7',['../ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fblock8_29',['IP6_ADDR_BLOCK8',['../ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcmp_30',['ip6_addr_cmp',['../ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcmp_5fpacked_31',['ip6_addr_cmp_packed',['../ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcmp_5fzoneless_32',['ip6_addr_cmp_zoneless',['../ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcopy_33',['ip6_addr_copy',['../ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcopy_5ffrom_5fpacked_34',['ip6_addr_copy_from_packed',['../ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fcopy_5fto_5fpacked_35',['ip6_addr_copy_to_packed',['../ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fnetcmp_36',['ip6_addr_netcmp',['../ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fnetcmp_5fzoneless_37',['ip6_addr_netcmp_zoneless',['../ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fpart_38',['IP6_ADDR_PART',['../ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_39',['ip6_addr_set',['../ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_5fany_40',['ip6_addr_set_any',['../ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_5fhton_41',['ip6_addr_set_hton',['../ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_5floopback_42',['ip6_addr_set_loopback',['../ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292',1,'ip6_addr.h']]],
-  ['ip6_5faddr_5fset_5fzero_43',['ip6_addr_set_zero',['../ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c',1,'ip6_addr.h']]],
-  ['ip6_5fcurrent_5fdest_5faddr_44',['ip6_current_dest_addr',['../ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0',1,'ip.h']]],
-  ['ip6_5fcurrent_5fheader_45',['ip6_current_header',['../ip_8h.html#af9bf74750c9d7a219ee88d240300fe69',1,'ip.h']]],
-  ['ip6_5fcurrent_5fsrc_5faddr_46',['ip6_current_src_addr',['../ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245',1,'ip.h']]],
-  ['ip6_5freass_5ftmr_5finterval_47',['IP6_REASS_TMR_INTERVAL',['../ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2',1,'ip6_frag.h']]],
-  ['ip_5faccept_5flink_5flayer_5faddressed_5fport_48',['IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT',['../ip4_8c.html#a185c7d6380711847105430931692b267',1,'ip4.c']]],
-  ['ip_5fcurrent_5fdest_5faddr_49',['ip_current_dest_addr',['../ip_8h.html#a9135977868017c3deeec86b525e13997',1,'ip_current_dest_addr:&#160;ip.h'],['../ip_8h.html#a9135977868017c3deeec86b525e13997',1,'ip_current_dest_addr:&#160;ip.h']]],
-  ['ip_5fcurrent_5fheader_5fproto_50',['ip_current_header_proto',['../ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f',1,'ip.h']]],
-  ['ip_5fcurrent_5fheader_5ftot_5flen_51',['ip_current_header_tot_len',['../ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2',1,'ip.h']]],
-  ['ip_5fcurrent_5finput_5fnetif_52',['ip_current_input_netif',['../ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4',1,'ip.h']]],
-  ['ip_5fcurrent_5fis_5fv6_53',['ip_current_is_v6',['../ip_8h.html#abc56623d434a204298a4e98352af1c9d',1,'ip.h']]],
-  ['ip_5fcurrent_5fnetif_54',['ip_current_netif',['../ip_8h.html#aabecef3c7653a9767c79245c44fcab9f',1,'ip.h']]],
-  ['ip_5fcurrent_5fsrc_5faddr_55',['ip_current_src_addr',['../ip_8h.html#a4e35b7692c228c98e738892f0a215647',1,'ip_current_src_addr:&#160;ip.h'],['../ip_8h.html#a4e35b7692c228c98e738892f0a215647',1,'ip_current_src_addr:&#160;ip.h']]],
-  ['ip_5fget_5foption_56',['ip_get_option',['../ip_8h.html#a26e077f52de4a97ff89c02415c084518',1,'ip.h']]],
-  ['ip_5fhdr_5fget_5fversion_57',['IP_HDR_GET_VERSION',['../prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374',1,'ip.h']]],
-  ['ip_5fnext_5fheader_5fptr_58',['ip_next_header_ptr',['../ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26',1,'ip.h']]],
-  ['ip_5fntoa_59',['ip_ntoa',['../ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1',1,'ip4_addr.h']]],
-  ['ip_5foptions_5fsend_60',['IP_OPTIONS_SEND',['../ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824',1,'ip4.h']]],
-  ['ip_5foutput_5fhinted_61',['ip_output_hinted',['../ip_8h.html#accbc01f37dd426a66de41693a5450207',1,'ip.h']]],
-  ['ip_5foutput_5fif_5fhdrincl_62',['ip_output_if_hdrincl',['../ip_8h.html#aac608b92f8f226c3574d6bb855f12496',1,'ip.h']]],
-  ['ip_5fpcb_63',['IP_PCB',['../ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53',1,'ip.h']]],
-  ['ip_5freass_5fcheck_5foverlap_64',['IP_REASS_CHECK_OVERLAP',['../ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe',1,'IP_REASS_CHECK_OVERLAP:&#160;ip4_frag.c'],['../ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe',1,'IP_REASS_CHECK_OVERLAP:&#160;ip6_frag.c']]],
-  ['ip_5freass_5ffree_5foldest_65',['IP_REASS_FREE_OLDEST',['../ip4__frag_8c.html#a510934accf149433bdcf683993e79080',1,'IP_REASS_FREE_OLDEST:&#160;ip4_frag.c'],['../ip6__frag_8c.html#a510934accf149433bdcf683993e79080',1,'IP_REASS_FREE_OLDEST:&#160;ip6_frag.c']]],
-  ['ip_5freset_5foption_66',['ip_reset_option',['../ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc',1,'ip.h']]],
-  ['ip_5fset_5foption_67',['ip_set_option',['../ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93',1,'ip.h']]],
-  ['ipaddr_5fany_68',['IPADDR_ANY',['../ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2',1,'ip4_addr.h']]],
-  ['ipaddr_5fbroadcast_69',['IPADDR_BROADCAST',['../ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a',1,'ip4_addr.h']]],
-  ['ipaddr_5floopback_70',['IPADDR_LOOPBACK',['../ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e',1,'ip4_addr.h']]],
-  ['ipaddr_5fnone_71',['IPADDR_NONE',['../ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544',1,'ip4_addr.h']]],
-  ['ipaddr_5fwordaligned_5fcopy_5ffrom_5fip4_5faddr_5ft_72',['IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419',1,'etharp.h']]],
-  ['ipaddr_5fwordaligned_5fcopy_5fto_5fip4_5faddr_5ft_73',['IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030',1,'etharp.h']]],
-  ['ipv6_5ffrag_5fcopyheader_74',['IPV6_FRAG_COPYHEADER',['../ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7',1,'ip6_frag.h']]]
+  ['ip4_5faddr_5fcmp_7',['ip4_addr_cmp',['../ip4__addr_8h.html#a59494c562c62fdf62a6c9c6a66a50fb3',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fcopy_8',['ip4_addr_copy',['../ip4__addr_8h.html#a2f4e9c339e897e6ca5cb4a2f1e8394d5',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fget_5fnetwork_9',['ip4_addr_get_network',['../ip4__addr_8h.html#a81658cb05ba504d13ee860e82dc444e9',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fget_5fu32_10',['ip4_addr_get_u32',['../ip4__addr_8h.html#ad50d93464bbbda199b585c54869a3a4b',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fisloopback_11',['ip4_addr_isloopback',['../ip4__addr_8h.html#a46dabb4df212d156004fa5afe03e2051',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fnet_5feq_12',['ip4_addr_net_eq',['../ip4__addr_8h.html#a95d05df9201602fc873a97fb61fd1134',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fnetcmp_13',['ip4_addr_netcmp',['../ip4__addr_8h.html#afd43f6ceb2df8d50c84509ad1059f514',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_14',['ip4_addr_set',['../ip4__addr_8h.html#a33a17a8d2025ce3715db835534868e88',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fany_15',['ip4_addr_set_any',['../ip4__addr_8h.html#afaaed3762ce8e9de14fcf73b19964567',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fhton_16',['ip4_addr_set_hton',['../ip4__addr_8h.html#a901850ec90b01b9bf6baf69561aa465a',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5floopback_17',['ip4_addr_set_loopback',['../ip4__addr_8h.html#a5c7eae50a387987a7f56c29c74255c3c',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fu32_18',['ip4_addr_set_u32',['../ip4__addr_8h.html#aeb39f58b38435f89219c8ccb509eb520',1,'ip4_addr.h']]],
+  ['ip4_5faddr_5fset_5fzero_19',['ip4_addr_set_zero',['../ip4__addr_8h.html#a973b6ad98e037fc45f1e11d29cda99ea',1,'ip4_addr.h']]],
+  ['ip4_5fcurrent_5fdest_5faddr_20',['ip4_current_dest_addr',['../ip_8h.html#a2833c8d59910dd7c0e87ab3bb174e720',1,'ip.h']]],
+  ['ip4_5fcurrent_5fheader_21',['ip4_current_header',['../ip_8h.html#a3ce482b7e08282effd670001198ecd87',1,'ip.h']]],
+  ['ip4_5fcurrent_5fsrc_5faddr_22',['ip4_current_src_addr',['../ip_8h.html#ad2a62f96b9431a79f0258dc13058b160',1,'ip.h']]],
+  ['ip6_5faddr_23',['IP6_ADDR',['../ip6__addr_8h.html#a30c92254d6abe631de6a5accfd491bc3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock1_24',['IP6_ADDR_BLOCK1',['../ip6__addr_8h.html#ae258ebfa66d18c8c428bf3d8fd0f969c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock2_25',['IP6_ADDR_BLOCK2',['../ip6__addr_8h.html#a9193137423b6b936d25c2e6cf33b4921',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock3_26',['IP6_ADDR_BLOCK3',['../ip6__addr_8h.html#a6466b1c0edd03d6a5986dcc79f7d8bb6',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock4_27',['IP6_ADDR_BLOCK4',['../ip6__addr_8h.html#a2a5d7de341ce708b7145ad4d72652c71',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock5_28',['IP6_ADDR_BLOCK5',['../ip6__addr_8h.html#a56a11cfaa169389c319f8bd027ac524c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock6_29',['IP6_ADDR_BLOCK6',['../ip6__addr_8h.html#a116d7c5c8bf8531b27f8a9fa98e728c3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock7_30',['IP6_ADDR_BLOCK7',['../ip6__addr_8h.html#ab87bee320ecc0e923931ee6f49802deb',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fblock8_31',['IP6_ADDR_BLOCK8',['../ip6__addr_8h.html#af3d1f9876bf256ec964bd3809d7ed1b4',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp_32',['ip6_addr_cmp',['../ip6__addr_8h.html#aea8d4c4134abff1c76bc997a91163fe1',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp_5fpacked_33',['ip6_addr_cmp_packed',['../ip6__addr_8h.html#a11fe84789e3f039b3f71009e802946a8',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcmp_5fzoneless_34',['ip6_addr_cmp_zoneless',['../ip6__addr_8h.html#ad0fc088972d395839a7ad75d3dab8322',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_35',['ip6_addr_copy',['../ip6__addr_8h.html#a7b17e85a46bd8368ce27fc644e058073',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5ffrom_5fpacked_36',['ip6_addr_copy_from_packed',['../ip6__addr_8h.html#a05575d46c233ffb13fb03a3a2c8a16b3',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fcopy_5fto_5fpacked_37',['ip6_addr_copy_to_packed',['../ip6__addr_8h.html#a6c46d12fa7d36c47b629d0ccdefa114b',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5feq_38',['ip6_addr_eq',['../ip6__addr_8h.html#a9ea0b6b837baff1e1e62cccd4f17d50e',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnet_5feq_39',['ip6_addr_net_eq',['../ip6__addr_8h.html#a9a983c7d613ab45e37aaf66c067a0c7a',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnet_5fzoneless_5feq_40',['ip6_addr_net_zoneless_eq',['../ip6__addr_8h.html#afc9d2b8d0a05f2ff23ab3b7fd3bf8229',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnetcmp_41',['ip6_addr_netcmp',['../ip6__addr_8h.html#a76b01f76b65647767d00ee9fad9fbaa2',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fnetcmp_5fzoneless_42',['ip6_addr_netcmp_zoneless',['../ip6__addr_8h.html#acc1622ab895680da0a3b6e5e56070342',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fpacked_5feq_43',['ip6_addr_packed_eq',['../ip6__addr_8h.html#aa324ac65d537997ebaaed78bd40f6da9',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fpart_44',['IP6_ADDR_PART',['../ip6__addr_8h.html#a1d78feeb50aec8f2c07d840829f49ddd',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_45',['ip6_addr_set',['../ip6__addr_8h.html#aa7b4ba4202b5f64dee605fe159e9c3ad',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fany_46',['ip6_addr_set_any',['../ip6__addr_8h.html#ae2d1ce50ec6dbee890e2f8ae64abdf6b',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fhton_47',['ip6_addr_set_hton',['../ip6__addr_8h.html#ad636c27d56d1b3deca9f780bc173d3c2',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5floopback_48',['ip6_addr_set_loopback',['../ip6__addr_8h.html#a02f5271e922f34a09153ce84839ad292',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fset_5fzero_49',['ip6_addr_set_zero',['../ip6__addr_8h.html#af696d3b81f4cb9c40ece912de73ed53c',1,'ip6_addr.h']]],
+  ['ip6_5faddr_5fzoneless_5feq_50',['ip6_addr_zoneless_eq',['../ip6__addr_8h.html#a811d8a2aa6417ae22a7a46b27d9ead26',1,'ip6_addr.h']]],
+  ['ip6_5fcurrent_5fdest_5faddr_51',['ip6_current_dest_addr',['../ip_8h.html#a176525c2192d37ee9eaeba8012c5d9c0',1,'ip.h']]],
+  ['ip6_5fcurrent_5fheader_52',['ip6_current_header',['../ip_8h.html#af9bf74750c9d7a219ee88d240300fe69',1,'ip.h']]],
+  ['ip6_5fcurrent_5fsrc_5faddr_53',['ip6_current_src_addr',['../ip_8h.html#ac40a9e4a21ecf5bb39813bb6ca5bb245',1,'ip.h']]],
+  ['ip6_5freass_5ftmr_5finterval_54',['IP6_REASS_TMR_INTERVAL',['../ip6__frag_8h.html#ad0730ee4db9fbebdf071bb33d75698a2',1,'ip6_frag.h']]],
+  ['ip_5faccept_5flink_5flayer_5faddressed_5fport_55',['IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT',['../ip4_8c.html#a185c7d6380711847105430931692b267',1,'ip4.c']]],
+  ['ip_5fcurrent_5fdest_5faddr_56',['ip_current_dest_addr',['../ip_8h.html#a9135977868017c3deeec86b525e13997',1,'ip_current_dest_addr:&#160;ip.h'],['../ip_8h.html#a9135977868017c3deeec86b525e13997',1,'ip_current_dest_addr:&#160;ip.h']]],
+  ['ip_5fcurrent_5fheader_5fproto_57',['ip_current_header_proto',['../ip_8h.html#af27c43c23b59d68a8463cd5ad035b20f',1,'ip.h']]],
+  ['ip_5fcurrent_5fheader_5ftot_5flen_58',['ip_current_header_tot_len',['../ip_8h.html#a2ca15ea285a10982294378cd7b8e83e2',1,'ip.h']]],
+  ['ip_5fcurrent_5finput_5fnetif_59',['ip_current_input_netif',['../ip_8h.html#ae214afa9d3f1b26fc8d538436b8fa3c4',1,'ip.h']]],
+  ['ip_5fcurrent_5fis_5fv6_60',['ip_current_is_v6',['../ip_8h.html#abc56623d434a204298a4e98352af1c9d',1,'ip.h']]],
+  ['ip_5fcurrent_5fnetif_61',['ip_current_netif',['../ip_8h.html#aabecef3c7653a9767c79245c44fcab9f',1,'ip.h']]],
+  ['ip_5fcurrent_5fsrc_5faddr_62',['ip_current_src_addr',['../ip_8h.html#a4e35b7692c228c98e738892f0a215647',1,'ip_current_src_addr:&#160;ip.h'],['../ip_8h.html#a4e35b7692c228c98e738892f0a215647',1,'ip_current_src_addr:&#160;ip.h']]],
+  ['ip_5fget_5foption_63',['ip_get_option',['../ip_8h.html#a26e077f52de4a97ff89c02415c084518',1,'ip.h']]],
+  ['ip_5fhdr_5fget_5fversion_64',['IP_HDR_GET_VERSION',['../prot_2ip_8h.html#afc29766fb0707c63b64568c5fa44a374',1,'ip.h']]],
+  ['ip_5fnext_5fheader_5fptr_65',['ip_next_header_ptr',['../ip_8h.html#a68d25b5924b768cbf2f1a78bbabfce26',1,'ip.h']]],
+  ['ip_5fntoa_66',['ip_ntoa',['../ip4__addr_8h.html#a2b2230516e7911dfacc9b87644ba30f1',1,'ip4_addr.h']]],
+  ['ip_5foptions_5fsend_67',['IP_OPTIONS_SEND',['../ip4_8h.html#a516aa115f61c368cbe74fae2da2c6824',1,'ip4.h']]],
+  ['ip_5foutput_5fhinted_68',['ip_output_hinted',['../ip_8h.html#accbc01f37dd426a66de41693a5450207',1,'ip.h']]],
+  ['ip_5foutput_5fif_5fhdrincl_69',['ip_output_if_hdrincl',['../ip_8h.html#aac608b92f8f226c3574d6bb855f12496',1,'ip.h']]],
+  ['ip_5fpcb_70',['IP_PCB',['../ip_8h.html#a8bdf4b5f674375e76cdd968826d80e53',1,'ip.h']]],
+  ['ip_5freass_5fcheck_5foverlap_71',['IP_REASS_CHECK_OVERLAP',['../ip4__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe',1,'IP_REASS_CHECK_OVERLAP:&#160;ip4_frag.c'],['../ip6__frag_8c.html#af920fb8127d00dd7a8b809afd28723fe',1,'IP_REASS_CHECK_OVERLAP:&#160;ip6_frag.c']]],
+  ['ip_5freass_5ffree_5foldest_72',['IP_REASS_FREE_OLDEST',['../ip4__frag_8c.html#a510934accf149433bdcf683993e79080',1,'IP_REASS_FREE_OLDEST:&#160;ip4_frag.c'],['../ip6__frag_8c.html#a510934accf149433bdcf683993e79080',1,'IP_REASS_FREE_OLDEST:&#160;ip6_frag.c']]],
+  ['ip_5freset_5foption_73',['ip_reset_option',['../ip_8h.html#a441c63f00c4b0cb69fc34ca6b55307cc',1,'ip.h']]],
+  ['ip_5fset_5foption_74',['ip_set_option',['../ip_8h.html#a13f48cf825c7f074dc05bea54e9d6a93',1,'ip.h']]],
+  ['ipaddr_5fany_75',['IPADDR_ANY',['../ip4__addr_8h.html#ad6ed0d622d61ecd6edd606e3b564f0a2',1,'ip4_addr.h']]],
+  ['ipaddr_5fbroadcast_76',['IPADDR_BROADCAST',['../ip4__addr_8h.html#ac661fca7e7d25e5cd379b811a767c29a',1,'ip4_addr.h']]],
+  ['ipaddr_5floopback_77',['IPADDR_LOOPBACK',['../ip4__addr_8h.html#a6f51a2eb21547df4e6b3ba046188345e',1,'ip4_addr.h']]],
+  ['ipaddr_5fnone_78',['IPADDR_NONE',['../ip4__addr_8h.html#abc4b2e3531c4992f2ae4b8c0f9751544',1,'ip4_addr.h']]],
+  ['ipaddr_5fwordaligned_5fcopy_5ffrom_5fip4_5faddr_5ft_79',['IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a7dff02ff186f844b731cecbe614b7419',1,'etharp.h']]],
+  ['ipaddr_5fwordaligned_5fcopy_5fto_5fip4_5faddr_5ft_80',['IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T',['../lwip_2prot_2etharp_8h.html#a94f1c2a6ad7cecdfe759c0490ba7f030',1,'etharp.h']]],
+  ['ipv6_5ffrag_5fcopyheader_81',['IPV6_FRAG_COPYHEADER',['../ip6__frag_8h.html#a151e742cf7f0e5c3a08f31db0370cea7',1,'ip6_frag.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_6.js b/doc/doxygen/output/html/search/defines_6.js
index cff8c82..7a4e528 100644
--- a/doc/doxygen/output/html/search/defines_6.js
+++ b/doc/doxygen/output/html/search/defines_6.js
@@ -12,18 +12,18 @@
   ['lwip_5faltcp_5ftls_5fmbedtls_9',['LWIP_ALTCP_TLS_MBEDTLS',['../altcp__tls__mbedtls__opts_8h.html#ac8dbfe10a4a9a64c1e2c62ea97e48639',1,'altcp_tls_mbedtls_opts.h']]],
   ['lwip_5farp_5ffilter_5fnetif_10',['LWIP_ARP_FILTER_NETIF',['../netif_2ethernet_8h.html#a1ecae0406a3b714c02b632379f26a365',1,'ethernet.h']]],
   ['lwip_5fautoip_5fcreate_5fseed_5faddr_11',['LWIP_AUTOIP_CREATE_SEED_ADDR',['../autoip_8c.html#acec75069f6e6ecbe200c5691e56ecd43',1,'autoip.c']]],
-  ['lwip_5fautoip_5frand_12',['LWIP_AUTOIP_RAND',['../autoip_8c.html#a634535156cc1a8cf9f04d3d5c74f8a59',1,'autoip.c']]],
-  ['lwip_5fcompat_5fmutex_13',['LWIP_COMPAT_MUTEX',['../sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6',1,'sys.h']]],
-  ['lwip_5fdebug_14',['LWIP_DEBUG',['../debug_8h.html#a957d947c94fda9b85d4aee0aab72952a',1,'debug.h']]],
-  ['lwip_5fdns_5fapi_5fhostent_5fstorage_15',['LWIP_DNS_API_HOSTENT_STORAGE',['../netdb_8c.html#a768ab8ead892d6454709680340cd070e',1,'netdb.c']]],
-  ['lwip_5ficmp_5fecho_5fcheck_5finput_5fpbuf_5flen_16',['LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN',['../icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e',1,'icmp.c']]],
-  ['lwip_5finline_5fip_5fchksum_17',['LWIP_INLINE_IP_CHKSUM',['../ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f',1,'ip4.c']]],
-  ['lwip_5fip_5fcheck_5fpbuf_5fref_5fcount_5ffor_5ftx_18',['LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX',['../ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063',1,'ip.h']]],
-  ['lwip_5flowpan6_5f802154_5fdebug_19',['LWIP_LOWPAN6_802154_DEBUG',['../lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58',1,'lowpan6_opts.h']]],
-  ['lwip_5flowpan6_5fdebug_20',['LWIP_LOWPAN6_DEBUG',['../lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754',1,'lowpan6_opts.h']]],
-  ['lwip_5flowpan6_5fdecompression_5fdebug_21',['LWIP_LOWPAN6_DECOMPRESSION_DEBUG',['../lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0',1,'lowpan6_opts.h']]],
-  ['lwip_5flowpan6_5fip_5fcompressed_5fdebug_22',['LWIP_LOWPAN6_IP_COMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8',1,'lowpan6_opts.h']]],
-  ['lwip_5fmakeu32_23',['LWIP_MAKEU32',['../def_8h.html#acf56d3da92a0a7a8a62a617e793e948c',1,'def.h']]],
+  ['lwip_5fcompat_5fmutex_12',['LWIP_COMPAT_MUTEX',['../sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6',1,'sys.h']]],
+  ['lwip_5fdebug_13',['LWIP_DEBUG',['../debug_8h.html#a957d947c94fda9b85d4aee0aab72952a',1,'debug.h']]],
+  ['lwip_5fdns_5fapi_5fhostent_5fstorage_14',['LWIP_DNS_API_HOSTENT_STORAGE',['../netdb_8c.html#a768ab8ead892d6454709680340cd070e',1,'netdb.c']]],
+  ['lwip_5ficmp_5fecho_5fcheck_5finput_5fpbuf_5flen_15',['LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN',['../icmp_8c.html#a6b9fd6be0a7dcf301bc86b9e96e3857e',1,'icmp.c']]],
+  ['lwip_5finline_5fip_5fchksum_16',['LWIP_INLINE_IP_CHKSUM',['../ip4_8c.html#a9652ce304f893f6245c6ba9daea0a30f',1,'ip4.c']]],
+  ['lwip_5fip_5fcheck_5fpbuf_5fref_5fcount_5ffor_5ftx_17',['LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX',['../ip_8h.html#a355679dba1c0d8ef07ce3abcd28e3063',1,'ip.h']]],
+  ['lwip_5flowpan6_5f802154_5fdebug_18',['LWIP_LOWPAN6_802154_DEBUG',['../lowpan6__opts_8h.html#acf9a44be56d5dca9e45f644571d66f58',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fdebug_19',['LWIP_LOWPAN6_DEBUG',['../lowpan6__opts_8h.html#ae90ebb32999c6df5cc83705e133e1754',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fdecompression_5fdebug_20',['LWIP_LOWPAN6_DECOMPRESSION_DEBUG',['../lowpan6__opts_8h.html#a7f4db0bd3dbe36a19efbd24cd8b7fcf0',1,'lowpan6_opts.h']]],
+  ['lwip_5flowpan6_5fip_5fcompressed_5fdebug_21',['LWIP_LOWPAN6_IP_COMPRESSED_DEBUG',['../lowpan6__opts_8h.html#a231bc758484376dfd2ded6931c462df8',1,'lowpan6_opts.h']]],
+  ['lwip_5fmakeu32_22',['LWIP_MAKEU32',['../def_8h.html#acf56d3da92a0a7a8a62a617e793e948c',1,'def.h']]],
+  ['lwip_5fnsc_5fipv4_5faddr_5fvalid_23',['LWIP_NSC_IPV4_ADDR_VALID',['../netif_8h.html#a716576f3485524d44ef0843839ef0564',1,'netif.h']]],
   ['lwip_5fnsc_5fipv4_5faddress_5fchanged_24',['LWIP_NSC_IPV4_ADDRESS_CHANGED',['../netif_8h.html#aeb4e790199b02469aa04c044ef5cfa32',1,'netif.h']]],
   ['lwip_5fnsc_5fipv4_5fgateway_5fchanged_25',['LWIP_NSC_IPV4_GATEWAY_CHANGED',['../netif_8h.html#a22400d2202581b4a7273cded712adf49',1,'netif.h']]],
   ['lwip_5fnsc_5fipv4_5fnetmask_5fchanged_26',['LWIP_NSC_IPV4_NETMASK_CHANGED',['../netif_8h.html#ad747072771a887443ab33f90a12077d4',1,'netif.h']]],
diff --git a/doc/doxygen/output/html/search/defines_7.js b/doc/doxygen/output/html/search/defines_7.js
index 22f72c1..11a0729 100644
--- a/doc/doxygen/output/html/search/defines_7.js
+++ b/doc/doxygen/output/html/search/defines_7.js
@@ -1,10 +1,12 @@
 var searchData=
 [
-  ['mib2_5fcopy_5fsysuptime_5fto_0',['MIB2_COPY_SYSUPTIME_TO',['../snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c',1,'snmp.h']]],
-  ['min_5freq_5flen_1',['MIN_REQ_LEN',['../httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a',1,'httpd.c']]],
-  ['min_5fsize_2',['MIN_SIZE',['../mem_8c.html#a278694c2333c9826f21ddd2c2d220f66',1,'mem.c']]],
-  ['mqtt_5fctl_5fpacket_5ftype_3',['MQTT_CTL_PACKET_TYPE',['../mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b',1,'mqtt.c']]],
-  ['mqtt_5fdebug_4',['MQTT_DEBUG',['../mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d',1,'mqtt.c']]],
-  ['mqtt_5fringbuf_5ffree_5',['mqtt_ringbuf_free',['../mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa',1,'mqtt.c']]],
-  ['mqtt_5fringbuf_5flinear_5fread_5flength_6',['mqtt_ringbuf_linear_read_length',['../mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3',1,'mqtt.c']]]
+  ['mdns_5fprobe_5fcount_0',['MDNS_PROBE_COUNT',['../mdns_8c.html#af24e590bf9c225a2efc0b55fac14809d',1,'mdns.c']]],
+  ['mdns_5fresponse_5fdelay_5fmax_1',['MDNS_RESPONSE_DELAY_MAX',['../mdns_8c.html#a482d6bf710af4424b71ee57034edbdbe',1,'mdns.c']]],
+  ['mib2_5fcopy_5fsysuptime_5fto_2',['MIB2_COPY_SYSUPTIME_TO',['../snmp_8h.html#abe6b270482ca9af07c029f3136d8ec9c',1,'snmp.h']]],
+  ['min_5freq_5flen_3',['MIN_REQ_LEN',['../httpd_8c.html#aa8e2f3e13ac1fcacd85c558d6e40e40a',1,'httpd.c']]],
+  ['min_5fsize_4',['MIN_SIZE',['../mem_8c.html#a278694c2333c9826f21ddd2c2d220f66',1,'mem.c']]],
+  ['mqtt_5fctl_5fpacket_5ftype_5',['MQTT_CTL_PACKET_TYPE',['../mqtt_8c.html#a45c57ebd31832f1c128d847067c4688b',1,'mqtt.c']]],
+  ['mqtt_5fdebug_6',['MQTT_DEBUG',['../mqtt_8c.html#a99c325e06cc17ee24e09dab251606f9d',1,'mqtt.c']]],
+  ['mqtt_5fringbuf_5ffree_7',['mqtt_ringbuf_free',['../mqtt_8c.html#afba101fbf26b556c869060d3d013c8fa',1,'mqtt.c']]],
+  ['mqtt_5fringbuf_5flinear_5fread_5flength_8',['mqtt_ringbuf_linear_read_length',['../mqtt_8c.html#ad82b4039213ab3f1d9e4bcd3aa0c88a3',1,'mqtt.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_8.js b/doc/doxygen/output/html/search/defines_8.js
index 51663d1..1610251 100644
--- a/doc/doxygen/output/html/search/defines_8.js
+++ b/doc/doxygen/output/html/search/defines_8.js
@@ -28,7 +28,9 @@
   ['netconn_5fset_5frecvbufsize_25',['netconn_set_recvbufsize',['../api_8h.html#a04785274634a5b504c760731c2e70725',1,'api.h']]],
   ['netconn_5fset_5fsendtimeout_26',['netconn_set_sendtimeout',['../api_8h.html#a3ce3ad9f660e99b11fec20cafaf8f016',1,'api.h']]],
   ['netconn_5ftype_27',['netconn_type',['../api_8h.html#a62cd17ad03bb2817cb0c419e1c9790b1',1,'api.h']]],
-  ['netif_5fis_5flink_5fup_28',['netif_is_link_up',['../netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8',1,'netif.h']]],
-  ['netif_5fmax_5fhwaddr_5flen_29',['NETIF_MAX_HWADDR_LEN',['../netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41',1,'netif.h']]],
-  ['netif_5fnamesize_30',['NETIF_NAMESIZE',['../netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a',1,'netif.h']]]
+  ['netif_5fget_5figmp_5fmac_5ffilter_28',['netif_get_igmp_mac_filter',['../netif_8h.html#a0a674553c18b429b53397372ea82fcaf',1,'netif.h']]],
+  ['netif_5fget_5fmld_5fmac_5ffilter_29',['netif_get_mld_mac_filter',['../netif_8h.html#a046c4816e37c3c4b84b3634eeeea7029',1,'netif.h']]],
+  ['netif_5fis_5flink_5fup_30',['netif_is_link_up',['../netif_8h.html#a780be4c3fa9f7f2534f7865666c3a1b8',1,'netif.h']]],
+  ['netif_5fmax_5fhwaddr_5flen_31',['NETIF_MAX_HWADDR_LEN',['../netif_8h.html#ab887a8ec553de1be1d04cf2961c63c41',1,'netif.h']]],
+  ['netif_5fnamesize_32',['NETIF_NAMESIZE',['../netif_8h.html#a302f24fbfe883ee4840ffc71f267ae2a',1,'netif.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_a.js b/doc/doxygen/output/html/search/defines_a.js
index 7e7d5a9..b53cc2b 100644
--- a/doc/doxygen/output/html/search/defines_a.js
+++ b/doc/doxygen/output/html/search/defines_a.js
@@ -1,32 +1,4 @@
 var searchData=
 [
-  ['selwait_5ft_0',['SELWAIT_T',['../sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196',1,'sockets_priv.h']]],
-  ['slip_5fmax_5fsize_1',['SLIP_MAX_SIZE',['../slipif_8c.html#accf448f9dabb0f33ef46b40355691cab',1,'slipif.c']]],
-  ['slip_5frx_5fqueue_2',['SLIP_RX_QUEUE',['../slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668',1,'slipif.h']]],
-  ['slip_5fsio_5fspeed_3',['SLIP_SIO_SPEED',['../slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc',1,'slipif.c']]],
-  ['slip_5fuse_5frx_5fthread_4',['SLIP_USE_RX_THREAD',['../slipif_8h.html#a198967c11f79cffc32192710294e8826',1,'slipif.h']]],
-  ['smtp_5fpoll_5finterval_5',['SMTP_POLL_INTERVAL',['../smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e',1,'smtp.c']]],
-  ['smtp_5ftimeout_6',['SMTP_TIMEOUT',['../smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6',1,'smtp.c']]],
-  ['smtp_5ftimeout_5fdatablock_7',['SMTP_TIMEOUT_DATABLOCK',['../smtp_8c.html#ad853ab316a3b866b87c0454053febfe3',1,'smtp.c']]],
-  ['smtp_5ftimeout_5fdataterm_8',['SMTP_TIMEOUT_DATATERM',['../smtp_8c.html#a73855e673457f748b6bcba49aab9b035',1,'smtp.c']]],
-  ['snmp_5fcreate_5fthread_5fsync_5fnode_9',['SNMP_CREATE_THREAD_SYNC_NODE',['../snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2',1,'snmp_threadsync.h']]],
-  ['snmp_5fgentrap_5fauth_5ffailure_10',['SNMP_GENTRAP_AUTH_FAILURE',['../apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f',1,'snmp.h']]],
-  ['snmp_5fgentrap_5fcoldstart_11',['SNMP_GENTRAP_COLDSTART',['../apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019',1,'snmp.h']]],
-  ['snmp_5fgentrap_5fegp_5fneighbor_5floss_12',['SNMP_GENTRAP_EGP_NEIGHBOR_LOSS',['../apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee',1,'snmp.h']]],
-  ['snmp_5fgentrap_5fenterprise_5fspecific_13',['SNMP_GENTRAP_ENTERPRISE_SPECIFIC',['../apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43',1,'snmp.h']]],
-  ['snmp_5fgentrap_5flinkdown_14',['SNMP_GENTRAP_LINKDOWN',['../apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16',1,'snmp.h']]],
-  ['snmp_5fgentrap_5flinkup_15',['SNMP_GENTRAP_LINKUP',['../apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186',1,'snmp.h']]],
-  ['snmp_5fgentrap_5fwarmstart_16',['SNMP_GENTRAP_WARMSTART',['../apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926',1,'snmp.h']]],
-  ['snmp_5fnode_5ftree_17',['SNMP_NODE_TREE',['../snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72',1,'snmp_core.h']]],
-  ['sntp_5ffrac_5fto_5fus_18',['SNTP_FRAC_TO_US',['../sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f',1,'sntp.c']]],
-  ['swap_5fbytes_5fin_5fword_19',['SWAP_BYTES_IN_WORD',['../inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18',1,'inet_chksum.h']]],
-  ['sys_5farch_5ftimeout_20',['SYS_ARCH_TIMEOUT',['../sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b',1,'sys.h']]],
-  ['sys_5fmbox_5fempty_21',['SYS_MBOX_EMPTY',['../sys_8h.html#ab0571e67edca0132b144106e9b319ef9',1,'sys.h']]],
-  ['sys_5fmbox_5fset_5finvalid_5fval_22',['sys_mbox_set_invalid_val',['../sys_8h.html#ae293feebb61d36f2db99be53702b8203',1,'sys.h']]],
-  ['sys_5fmbox_5ftryfetch_23',['sys_mbox_tryfetch',['../sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13',1,'sys.h']]],
-  ['sys_5fmbox_5fvalid_5fval_24',['sys_mbox_valid_val',['../sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb',1,'sys.h']]],
-  ['sys_5fsem_5fset_5finvalid_5fval_25',['sys_sem_set_invalid_val',['../sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8',1,'sys.h']]],
-  ['sys_5fsem_5fvalid_5fval_26',['sys_sem_valid_val',['../sys_8h.html#a9e8ad541356786936f23ab83b8f550cc',1,'sys.h']]],
-  ['sys_5fsem_5fwait_27',['sys_sem_wait',['../sys_8h.html#a84e7e4bc00255aee84e6e7289a985703',1,'sys.h']]],
-  ['sys_5ftimeouts_5fsleeptime_5finfinite_28',['SYS_TIMEOUTS_SLEEPTIME_INFINITE',['../timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0',1,'timeouts.h']]]
+  ['question_5fprobe_5fhost_5fany_0',['QUESTION_PROBE_HOST_ANY',['../mdns__out_8h.html#ab3297d69b0effb5eb01a9b8c5a708ea9',1,'mdns_out.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_b.js b/doc/doxygen/output/html/search/defines_b.js
index 504c803..84312f6 100644
--- a/doc/doxygen/output/html/search/defines_b.js
+++ b/doc/doxygen/output/html/search/defines_b.js
@@ -1,11 +1,33 @@
 var searchData=
 [
-  ['tcp_5fbuild_5fmss_5foption_0',['TCP_BUILD_MSS_OPTION',['../tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8',1,'tcp_priv.h']]],
-  ['tcp_5fchecksum_5fon_5fcopy_1',['TCP_CHECKSUM_ON_COPY',['../tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee',1,'tcp_priv.h']]],
-  ['tcp_5fchecksum_5fon_5fcopy_5fsanity_5fcheck_2',['TCP_CHECKSUM_ON_COPY_SANITY_CHECK',['../tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b',1,'tcp_out.c']]],
-  ['tcp_5fdo_5foutput_5fnagle_3',['tcp_do_output_nagle',['../tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f',1,'tcp_priv.h']]],
-  ['tcp_5foversize_5fcalc_5flength_4',['TCP_OVERSIZE_CALC_LENGTH',['../tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129',1,'tcp_out.c']]],
-  ['tcp_5foversize_5fdbgcheck_5',['TCP_OVERSIZE_DBGCHECK',['../tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69',1,'tcp_priv.h']]],
-  ['tcp_5fpcb_5fcommon_6',['TCP_PCB_COMMON',['../tcp_8h.html#a874630045102fc5f1442704a790c8bb8',1,'tcp.h']]],
-  ['tf_5freset_7',['TF_RESET',['../tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990',1,'tcp_priv.h']]]
+  ['selwait_5ft_0',['SELWAIT_T',['../sockets__priv_8h.html#a8f4d240733a9261c668fc66dc4ce8196',1,'sockets_priv.h']]],
+  ['set_5ftimeout_5ffrom_5foffered_1',['SET_TIMEOUT_FROM_OFFERED',['../dhcp_8c.html#a33f306da575f8a437996d073b374df82',1,'dhcp.c']]],
+  ['slip_5fmax_5fsize_2',['SLIP_MAX_SIZE',['../slipif_8c.html#accf448f9dabb0f33ef46b40355691cab',1,'slipif.c']]],
+  ['slip_5frx_5fqueue_3',['SLIP_RX_QUEUE',['../slipif_8h.html#a37ce8613535232db02bfd9ae9b51c668',1,'slipif.h']]],
+  ['slip_5fsio_5fspeed_4',['SLIP_SIO_SPEED',['../slipif_8c.html#a2a9e9ed81732a6794a9b9a712f75a1cc',1,'slipif.c']]],
+  ['slip_5fuse_5frx_5fthread_5',['SLIP_USE_RX_THREAD',['../slipif_8h.html#a198967c11f79cffc32192710294e8826',1,'slipif.h']]],
+  ['smtp_5fpoll_5finterval_6',['SMTP_POLL_INTERVAL',['../smtp_8c.html#a19ebd0b9a82b87fd205fed0dba06649e',1,'smtp.c']]],
+  ['smtp_5ftimeout_7',['SMTP_TIMEOUT',['../smtp_8c.html#a6029851c4f71d98b00d6c49a17ea9ef6',1,'smtp.c']]],
+  ['smtp_5ftimeout_5fdatablock_8',['SMTP_TIMEOUT_DATABLOCK',['../smtp_8c.html#ad853ab316a3b866b87c0454053febfe3',1,'smtp.c']]],
+  ['smtp_5ftimeout_5fdataterm_9',['SMTP_TIMEOUT_DATATERM',['../smtp_8c.html#a73855e673457f748b6bcba49aab9b035',1,'smtp.c']]],
+  ['snmp_5fcreate_5fthread_5fsync_5fnode_10',['SNMP_CREATE_THREAD_SYNC_NODE',['../snmp__threadsync_8h.html#a1971c27c8addf1c426abd1abac54c8d2',1,'snmp_threadsync.h']]],
+  ['snmp_5fgentrap_5fauth_5ffailure_11',['SNMP_GENTRAP_AUTH_FAILURE',['../apps_2snmp_8h.html#aaf312d8bdbeed2c02560321ab24a022f',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fcoldstart_12',['SNMP_GENTRAP_COLDSTART',['../apps_2snmp_8h.html#ae9310bbe1948b3c3bc64c073d4621019',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fegp_5fneighbor_5floss_13',['SNMP_GENTRAP_EGP_NEIGHBOR_LOSS',['../apps_2snmp_8h.html#ac1cd822650d9ac66d0333a5ad600cfee',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fenterprise_5fspecific_14',['SNMP_GENTRAP_ENTERPRISE_SPECIFIC',['../apps_2snmp_8h.html#ab3691cecfa911baa52ccf6054022ba43',1,'snmp.h']]],
+  ['snmp_5fgentrap_5flinkdown_15',['SNMP_GENTRAP_LINKDOWN',['../apps_2snmp_8h.html#a1856efbe83199f456c34a4e5139dfb16',1,'snmp.h']]],
+  ['snmp_5fgentrap_5flinkup_16',['SNMP_GENTRAP_LINKUP',['../apps_2snmp_8h.html#afa665cdc02ccd5ee9fe0c4cb1b792186',1,'snmp.h']]],
+  ['snmp_5fgentrap_5fwarmstart_17',['SNMP_GENTRAP_WARMSTART',['../apps_2snmp_8h.html#a9a2e5824deab50e639b01181307a0926',1,'snmp.h']]],
+  ['snmp_5fnode_5ftree_18',['SNMP_NODE_TREE',['../snmp__core_8h.html#a9ee3aad9305fdd883abb37822be81b72',1,'snmp_core.h']]],
+  ['sntp_5ffrac_5fto_5fus_19',['SNTP_FRAC_TO_US',['../sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f',1,'sntp.c']]],
+  ['swap_5fbytes_5fin_5fword_20',['SWAP_BYTES_IN_WORD',['../inet__chksum_8h.html#a0196bd603262882d16b5264b52eafe18',1,'inet_chksum.h']]],
+  ['sys_5farch_5ftimeout_21',['SYS_ARCH_TIMEOUT',['../sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b',1,'sys.h']]],
+  ['sys_5fmbox_5fempty_22',['SYS_MBOX_EMPTY',['../sys_8h.html#ab0571e67edca0132b144106e9b319ef9',1,'sys.h']]],
+  ['sys_5fmbox_5fset_5finvalid_5fval_23',['sys_mbox_set_invalid_val',['../sys_8h.html#ae293feebb61d36f2db99be53702b8203',1,'sys.h']]],
+  ['sys_5fmbox_5ftryfetch_24',['sys_mbox_tryfetch',['../sys_8h.html#ab7841780b31ba9c0a39a440aad1fca13',1,'sys.h']]],
+  ['sys_5fmbox_5fvalid_5fval_25',['sys_mbox_valid_val',['../sys_8h.html#aae82640d0bdbeec7b9b6511b3f8d99cb',1,'sys.h']]],
+  ['sys_5fsem_5fset_5finvalid_5fval_26',['sys_sem_set_invalid_val',['../sys_8h.html#a2556e570f6973a6f4d57d0e76ef190d8',1,'sys.h']]],
+  ['sys_5fsem_5fvalid_5fval_27',['sys_sem_valid_val',['../sys_8h.html#a9e8ad541356786936f23ab83b8f550cc',1,'sys.h']]],
+  ['sys_5fsem_5fwait_28',['sys_sem_wait',['../sys_8h.html#a84e7e4bc00255aee84e6e7289a985703',1,'sys.h']]],
+  ['sys_5ftimeouts_5fsleeptime_5finfinite_29',['SYS_TIMEOUTS_SLEEPTIME_INFINITE',['../timeouts_8h.html#a9e2b2593e709ff54c7e3c0b003f6f1b0',1,'timeouts.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_c.js b/doc/doxygen/output/html/search/defines_c.js
index 1f2bddd..504c803 100644
--- a/doc/doxygen/output/html/search/defines_c.js
+++ b/doc/doxygen/output/html/search/defines_c.js
@@ -1,4 +1,11 @@
 var searchData=
 [
-  ['unlock_5ftcpip_5fcore_0',['UNLOCK_TCPIP_CORE',['../tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d',1,'tcpip.h']]]
+  ['tcp_5fbuild_5fmss_5foption_0',['TCP_BUILD_MSS_OPTION',['../tcp__priv_8h.html#abdc99c343efc6c81abf60bb62b361dd8',1,'tcp_priv.h']]],
+  ['tcp_5fchecksum_5fon_5fcopy_1',['TCP_CHECKSUM_ON_COPY',['../tcp__priv_8h.html#aea0c47b916a8a25f82d2063335033aee',1,'tcp_priv.h']]],
+  ['tcp_5fchecksum_5fon_5fcopy_5fsanity_5fcheck_2',['TCP_CHECKSUM_ON_COPY_SANITY_CHECK',['../tcp__out_8c.html#a25d7e9081baa5c84f2ebd34b0eb4169b',1,'tcp_out.c']]],
+  ['tcp_5fdo_5foutput_5fnagle_3',['tcp_do_output_nagle',['../tcp__priv_8h.html#afbd7a2997e3a3b7569efc3298e2e409f',1,'tcp_priv.h']]],
+  ['tcp_5foversize_5fcalc_5flength_4',['TCP_OVERSIZE_CALC_LENGTH',['../tcp__out_8c.html#aa2ef22d2384225a1b5fee187411cc129',1,'tcp_out.c']]],
+  ['tcp_5foversize_5fdbgcheck_5',['TCP_OVERSIZE_DBGCHECK',['../tcp__priv_8h.html#a178a6e9966d03c3326b9e0568666bb69',1,'tcp_priv.h']]],
+  ['tcp_5fpcb_5fcommon_6',['TCP_PCB_COMMON',['../tcp_8h.html#a874630045102fc5f1442704a790c8bb8',1,'tcp.h']]],
+  ['tf_5freset_7',['TF_RESET',['../tcp__priv_8h.html#ac9dbdaeac3e25f5badf3a763a1b0b990',1,'tcp_priv.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_d.js b/doc/doxygen/output/html/search/defines_d.js
index 91d3360..1f2bddd 100644
--- a/doc/doxygen/output/html/search/defines_d.js
+++ b/doc/doxygen/output/html/search/defines_d.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['zepif_5floopback_0',['ZEPIF_LOOPBACK',['../zepif_8c.html#a8cae594e71cf385076f7bda166729dcd',1,'zepif.c']]]
+  ['unlock_5ftcpip_5fcore_0',['UNLOCK_TCPIP_CORE',['../tcpip_8h.html#a915effea029b9c4891e1ec635eb1826d',1,'tcpip.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/defines_e.js b/doc/doxygen/output/html/search/defines_e.js
new file mode 100644
index 0000000..91d3360
--- /dev/null
+++ b/doc/doxygen/output/html/search/defines_e.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['zepif_5floopback_0',['ZEPIF_LOOPBACK',['../zepif_8c.html#a8cae594e71cf385076f7bda166729dcd',1,'zepif.c']]]
+];
diff --git a/doc/doxygen/output/html/search/enumvalues_4.js b/doc/doxygen/output/html/search/enumvalues_4.js
index 374b9ac..2e88339 100644
--- a/doc/doxygen/output/html/search/enumvalues_4.js
+++ b/doc/doxygen/output/html/search/enumvalues_4.js
@@ -8,5 +8,5 @@
   ['mqtt_5fconnect_5frefused_5fserver_5',['MQTT_CONNECT_REFUSED_SERVER',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77dade28ec1c2ce3d874e91251d683c92b2a',1,'mqtt.h']]],
   ['mqtt_5fconnect_5frefused_5fusername_5fpass_6',['MQTT_CONNECT_REFUSED_USERNAME_PASS',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da290cf9037054c42022cc864cfade896a',1,'mqtt.h']]],
   ['mqtt_5fconnect_5ftimeout_7',['MQTT_CONNECT_TIMEOUT',['../group__mqtt.html#gga8cf0f360ab20343af37e1d124395a77da57153f2ab4331c6f76a9ee74e1bcfc62',1,'mqtt.h']]],
-  ['mqtt_5fdata_5fflag_5flast_8',['MQTT_DATA_FLAG_LAST',['../group__mqtt.html#gga99fb83031ce9923c84392b4e92f956b5a79cd00d0a5a8df13207e0c49447df87f',1,'mqtt.h']]]
+  ['mqtt_5fdata_5fflag_5flast_8',['MQTT_DATA_FLAG_LAST',['../group__mqtt.html#ggabc6126af1d45847bc59afa0aa3216b04a79cd00d0a5a8df13207e0c49447df87f',1,'mqtt.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/files_0.js b/doc/doxygen/output/html/search/files_0.js
index 386ecf5..6eacfdc 100644
--- a/doc/doxygen/output/html/search/files_0.js
+++ b/doc/doxygen/output/html/search/files_0.js
@@ -1,24 +1,26 @@
 var searchData=
 [
-  ['altcp_2ec_0',['altcp.c',['../altcp_8c.html',1,'']]],
-  ['altcp_2eh_1',['altcp.h',['../altcp_8h.html',1,'']]],
-  ['altcp_5falloc_2ec_2',['altcp_alloc.c',['../altcp__alloc_8c.html',1,'']]],
-  ['altcp_5fpriv_2eh_3',['altcp_priv.h',['../altcp__priv_8h.html',1,'']]],
-  ['altcp_5fproxyconnect_2ec_4',['altcp_proxyconnect.c',['../altcp__proxyconnect_8c.html',1,'']]],
-  ['altcp_5fproxyconnect_2eh_5',['altcp_proxyconnect.h',['../altcp__proxyconnect_8h.html',1,'']]],
-  ['altcp_5ftcp_2ec_6',['altcp_tcp.c',['../altcp__tcp_8c.html',1,'']]],
-  ['altcp_5ftcp_2eh_7',['altcp_tcp.h',['../altcp__tcp_8h.html',1,'']]],
-  ['altcp_5ftls_2eh_8',['altcp_tls.h',['../altcp__tls_8h.html',1,'']]],
-  ['altcp_5ftls_5fmbedtls_2ec_9',['altcp_tls_mbedtls.c',['../altcp__tls__mbedtls_8c.html',1,'']]],
-  ['altcp_5ftls_5fmbedtls_5fmem_2ec_10',['altcp_tls_mbedtls_mem.c',['../altcp__tls__mbedtls__mem_8c.html',1,'']]],
-  ['altcp_5ftls_5fmbedtls_5fmem_2eh_11',['altcp_tls_mbedtls_mem.h',['../altcp__tls__mbedtls__mem_8h.html',1,'']]],
-  ['altcp_5ftls_5fmbedtls_5fopts_2eh_12',['altcp_tls_mbedtls_opts.h',['../altcp__tls__mbedtls__opts_8h.html',1,'']]],
-  ['altcp_5ftls_5fmbedtls_5fstructs_2eh_13',['altcp_tls_mbedtls_structs.h',['../altcp__tls__mbedtls__structs_8h.html',1,'']]],
-  ['api_2eh_14',['api.h',['../api_8h.html',1,'']]],
-  ['api_5flib_2ec_15',['api_lib.c',['../api__lib_8c.html',1,'']]],
-  ['api_5fmsg_2ec_16',['api_msg.c',['../api__msg_8c.html',1,'']]],
-  ['api_5fmsg_2eh_17',['api_msg.h',['../api__msg_8h.html',1,'']]],
-  ['arch_2eh_18',['arch.h',['../arch_8h.html',1,'']]],
-  ['autoip_2ec_19',['autoip.c',['../autoip_8c.html',1,'']]],
-  ['autoip_2eh_20',['autoip.h',['../autoip_8h.html',1,'(Global Namespace)'],['../prot_2autoip_8h.html',1,'(Global Namespace)']]]
+  ['acd_2ec_0',['acd.c',['../acd_8c.html',1,'']]],
+  ['acd_2eh_1',['acd.h',['../acd_8h.html',1,'(Global Namespace)'],['../prot_2acd_8h.html',1,'(Global Namespace)']]],
+  ['altcp_2ec_2',['altcp.c',['../altcp_8c.html',1,'']]],
+  ['altcp_2eh_3',['altcp.h',['../altcp_8h.html',1,'']]],
+  ['altcp_5falloc_2ec_4',['altcp_alloc.c',['../altcp__alloc_8c.html',1,'']]],
+  ['altcp_5fpriv_2eh_5',['altcp_priv.h',['../altcp__priv_8h.html',1,'']]],
+  ['altcp_5fproxyconnect_2ec_6',['altcp_proxyconnect.c',['../altcp__proxyconnect_8c.html',1,'']]],
+  ['altcp_5fproxyconnect_2eh_7',['altcp_proxyconnect.h',['../altcp__proxyconnect_8h.html',1,'']]],
+  ['altcp_5ftcp_2ec_8',['altcp_tcp.c',['../altcp__tcp_8c.html',1,'']]],
+  ['altcp_5ftcp_2eh_9',['altcp_tcp.h',['../altcp__tcp_8h.html',1,'']]],
+  ['altcp_5ftls_2eh_10',['altcp_tls.h',['../altcp__tls_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_2ec_11',['altcp_tls_mbedtls.c',['../altcp__tls__mbedtls_8c.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fmem_2ec_12',['altcp_tls_mbedtls_mem.c',['../altcp__tls__mbedtls__mem_8c.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fmem_2eh_13',['altcp_tls_mbedtls_mem.h',['../altcp__tls__mbedtls__mem_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fopts_2eh_14',['altcp_tls_mbedtls_opts.h',['../altcp__tls__mbedtls__opts_8h.html',1,'']]],
+  ['altcp_5ftls_5fmbedtls_5fstructs_2eh_15',['altcp_tls_mbedtls_structs.h',['../altcp__tls__mbedtls__structs_8h.html',1,'']]],
+  ['api_2eh_16',['api.h',['../api_8h.html',1,'']]],
+  ['api_5flib_2ec_17',['api_lib.c',['../api__lib_8c.html',1,'']]],
+  ['api_5fmsg_2ec_18',['api_msg.c',['../api__msg_8c.html',1,'']]],
+  ['api_5fmsg_2eh_19',['api_msg.h',['../api__msg_8h.html',1,'']]],
+  ['arch_2eh_20',['arch.h',['../arch_8h.html',1,'']]],
+  ['autoip_2ec_21',['autoip.c',['../autoip_8c.html',1,'']]],
+  ['autoip_2eh_22',['autoip.h',['../autoip_8h.html',1,'(Global Namespace)'],['../prot_2autoip_8h.html',1,'(Global Namespace)']]]
 ];
diff --git a/doc/doxygen/output/html/search/files_7.js b/doc/doxygen/output/html/search/files_7.js
index 684d959..444c879 100644
--- a/doc/doxygen/output/html/search/files_7.js
+++ b/doc/doxygen/output/html/search/files_7.js
@@ -2,19 +2,23 @@
 [
   ['mdns_2ec_0',['mdns.c',['../mdns_8c.html',1,'']]],
   ['mdns_2eh_1',['mdns.h',['../mdns_8h.html',1,'']]],
-  ['mdns_5fopts_2eh_2',['mdns_opts.h',['../mdns__opts_8h.html',1,'']]],
-  ['mdns_5fpriv_2eh_3',['mdns_priv.h',['../mdns__priv_8h.html',1,'']]],
-  ['mem_2ec_4',['mem.c',['../mem_8c.html',1,'']]],
-  ['mem_2eh_5',['mem.h',['../mem_8h.html',1,'']]],
-  ['mem_5fpriv_2eh_6',['mem_priv.h',['../mem__priv_8h.html',1,'']]],
-  ['memp_2ec_7',['memp.c',['../memp_8c.html',1,'']]],
-  ['memp_2eh_8',['memp.h',['../memp_8h.html',1,'']]],
-  ['memp_5fpriv_2eh_9',['memp_priv.h',['../memp__priv_8h.html',1,'']]],
-  ['memp_5fstd_2eh_10',['memp_std.h',['../memp__std_8h.html',1,'']]],
-  ['mld6_2ec_11',['mld6.c',['../mld6_8c.html',1,'']]],
-  ['mld6_2eh_12',['mld6.h',['../mld6_8h.html',1,'(Global Namespace)'],['../prot_2mld6_8h.html',1,'(Global Namespace)']]],
-  ['mqtt_2ec_13',['mqtt.c',['../mqtt_8c.html',1,'']]],
-  ['mqtt_2eh_14',['mqtt.h',['../mqtt_8h.html',1,'']]],
-  ['mqtt_5fopts_2eh_15',['mqtt_opts.h',['../mqtt__opts_8h.html',1,'']]],
-  ['mqtt_5fpriv_2eh_16',['mqtt_priv.h',['../mqtt__priv_8h.html',1,'']]]
+  ['mdns_5fdomain_2ec_2',['mdns_domain.c',['../mdns__domain_8c.html',1,'']]],
+  ['mdns_5fdomain_2eh_3',['mdns_domain.h',['../mdns__domain_8h.html',1,'']]],
+  ['mdns_5fopts_2eh_4',['mdns_opts.h',['../mdns__opts_8h.html',1,'']]],
+  ['mdns_5fout_2ec_5',['mdns_out.c',['../mdns__out_8c.html',1,'']]],
+  ['mdns_5fout_2eh_6',['mdns_out.h',['../mdns__out_8h.html',1,'']]],
+  ['mdns_5fpriv_2eh_7',['mdns_priv.h',['../mdns__priv_8h.html',1,'']]],
+  ['mem_2ec_8',['mem.c',['../mem_8c.html',1,'']]],
+  ['mem_2eh_9',['mem.h',['../mem_8h.html',1,'']]],
+  ['mem_5fpriv_2eh_10',['mem_priv.h',['../mem__priv_8h.html',1,'']]],
+  ['memp_2ec_11',['memp.c',['../memp_8c.html',1,'']]],
+  ['memp_2eh_12',['memp.h',['../memp_8h.html',1,'']]],
+  ['memp_5fpriv_2eh_13',['memp_priv.h',['../memp__priv_8h.html',1,'']]],
+  ['memp_5fstd_2eh_14',['memp_std.h',['../memp__std_8h.html',1,'']]],
+  ['mld6_2ec_15',['mld6.c',['../mld6_8c.html',1,'']]],
+  ['mld6_2eh_16',['mld6.h',['../mld6_8h.html',1,'(Global Namespace)'],['../prot_2mld6_8h.html',1,'(Global Namespace)']]],
+  ['mqtt_2ec_17',['mqtt.c',['../mqtt_8c.html',1,'']]],
+  ['mqtt_2eh_18',['mqtt.h',['../mqtt_8h.html',1,'']]],
+  ['mqtt_5fopts_2eh_19',['mqtt_opts.h',['../mqtt__opts_8h.html',1,'']]],
+  ['mqtt_5fpriv_2eh_20',['mqtt_priv.h',['../mqtt__priv_8h.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/files_d.js b/doc/doxygen/output/html/search/files_d.js
index 82e8a93..4415d88 100644
--- a/doc/doxygen/output/html/search/files_d.js
+++ b/doc/doxygen/output/html/search/files_d.js
@@ -9,9 +9,11 @@
   ['tcpip_2ec_6',['tcpip.c',['../tcpip_8c.html',1,'']]],
   ['tcpip_2eh_7',['tcpip.h',['../tcpip_8h.html',1,'']]],
   ['tcpip_5fpriv_2eh_8',['tcpip_priv.h',['../tcpip__priv_8h.html',1,'']]],
-  ['tftp_5fopts_2eh_9',['tftp_opts.h',['../tftp__opts_8h.html',1,'']]],
-  ['tftp_5fserver_2ec_10',['tftp_server.c',['../tftp__server_8c.html',1,'']]],
-  ['tftp_5fserver_2eh_11',['tftp_server.h',['../tftp__server_8h.html',1,'']]],
-  ['timeouts_2ec_12',['timeouts.c',['../timeouts_8c.html',1,'']]],
-  ['timeouts_2eh_13',['timeouts.h',['../timeouts_8h.html',1,'']]]
+  ['tftp_2ec_9',['tftp.c',['../tftp_8c.html',1,'']]],
+  ['tftp_5fclient_2eh_10',['tftp_client.h',['../tftp__client_8h.html',1,'']]],
+  ['tftp_5fcommon_2eh_11',['tftp_common.h',['../tftp__common_8h.html',1,'']]],
+  ['tftp_5fopts_2eh_12',['tftp_opts.h',['../tftp__opts_8h.html',1,'']]],
+  ['tftp_5fserver_2eh_13',['tftp_server.h',['../tftp__server_8h.html',1,'']]],
+  ['timeouts_2ec_14',['timeouts.c',['../timeouts_8c.html',1,'']]],
+  ['timeouts_2eh_15',['timeouts.h',['../timeouts_8h.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_0.js b/doc/doxygen/output/html/search/functions_0.js
index 65ea91f..b49c3a2 100644
--- a/doc/doxygen/output/html/search/functions_0.js
+++ b/doc/doxygen/output/html/search/functions_0.js
@@ -1,50 +1,63 @@
 var searchData=
 [
-  ['altcp_5fabort_0',['altcp_abort',['../group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab',1,'altcp_abort(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab',1,'altcp_abort(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5faccept_1',['altcp_accept',['../group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9',1,'altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept):&#160;altcp.c'],['../group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9',1,'altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept):&#160;altcp.c']]],
-  ['altcp_5falloc_2',['altcp_alloc',['../altcp_8c.html#aa74c9fc358cffeeb7311b4212b0d6fc7',1,'altcp_alloc(void):&#160;altcp.c'],['../altcp__priv_8h.html#aa74c9fc358cffeeb7311b4212b0d6fc7',1,'altcp_alloc(void):&#160;altcp.c']]],
-  ['altcp_5farg_3',['altcp_arg',['../group__altcp.html#ga197a33af038556a04d8f27c7033d771f',1,'altcp_arg(struct altcp_pcb *conn, void *arg):&#160;altcp.c'],['../group__altcp.html#ga197a33af038556a04d8f27c7033d771f',1,'altcp_arg(struct altcp_pcb *conn, void *arg):&#160;altcp.c']]],
-  ['altcp_5fbind_4',['altcp_bind',['../group__altcp.html#ga485b248680f73b9876d8674029c5157c',1,'altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port):&#160;altcp.c'],['../group__altcp.html#ga485b248680f73b9876d8674029c5157c',1,'altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port):&#160;altcp.c']]],
-  ['altcp_5fclose_5',['altcp_close',['../group__altcp.html#ga4329798afdf3709c789a2ee060ee3993',1,'altcp_close(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga4329798afdf3709c789a2ee060ee3993',1,'altcp_close(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5fconnect_6',['altcp_connect',['../group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492',1,'altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected):&#160;altcp.c'],['../group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492',1,'altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected):&#160;altcp.c']]],
-  ['altcp_5ferr_7',['altcp_err',['../group__altcp.html#gadc76a1f3b2448559dc87da1b33291644',1,'altcp_err(struct altcp_pcb *conn, altcp_err_fn err):&#160;altcp.c'],['../group__altcp.html#gadc76a1f3b2448559dc87da1b33291644',1,'altcp_err(struct altcp_pcb *conn, altcp_err_fn err):&#160;altcp.c']]],
-  ['altcp_5ffree_8',['altcp_free',['../altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d',1,'altcp_free(struct altcp_pcb *conn):&#160;altcp.c'],['../altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d',1,'altcp_free(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5flisten_5fwith_5fbacklog_5fand_5ferr_9',['altcp_listen_with_backlog_and_err',['../group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c'],['../group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c']]],
-  ['altcp_5fmss_10',['altcp_mss',['../group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08',1,'altcp_mss(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08',1,'altcp_mss(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5fnew_11',['altcp_new',['../group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c']]],
-  ['altcp_5fnew_5fip6_12',['altcp_new_ip6',['../group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c']]],
-  ['altcp_5fnew_5fip_5ftype_13',['altcp_new_ip_type',['../group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c'],['../group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c']]],
-  ['altcp_5foutput_14',['altcp_output',['../group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6',1,'altcp_output(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6',1,'altcp_output(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5fpoll_15',['altcp_poll',['../group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0',1,'altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval):&#160;altcp.c'],['../group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0',1,'altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval):&#160;altcp.c']]],
-  ['altcp_5fproxyconnect_5falloc_16',['altcp_proxyconnect_alloc',['../altcp__proxyconnect_8c.html#a371cd4386fcbc5f0a0ff6e2fa0408e68',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a371cd4386fcbc5f0a0ff6e2fa0408e68',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
-  ['altcp_5fproxyconnect_5fnew_17',['altcp_proxyconnect_new',['../altcp__proxyconnect_8c.html#a389937c9441d4e3f67412603b3d1d236',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a389937c9441d4e3f67412603b3d1d236',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c']]],
-  ['altcp_5fproxyconnect_5fnew_5ftcp_18',['altcp_proxyconnect_new_tcp',['../altcp__proxyconnect_8c.html#ab0072ee857af8a28b555f14c0f2c9183',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#ab0072ee857af8a28b555f14c0f2c9183',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
-  ['altcp_5fproxyconnect_5ftls_5falloc_19',['altcp_proxyconnect_tls_alloc',['../altcp__proxyconnect_8c.html#aa807e0476719f0ec41b2344d4a0df2f4',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#aa807e0476719f0ec41b2344d4a0df2f4',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
-  ['altcp_5frecv_20',['altcp_recv',['../group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71',1,'altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv):&#160;altcp.c'],['../group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71',1,'altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv):&#160;altcp.c']]],
-  ['altcp_5frecved_21',['altcp_recved',['../group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83',1,'altcp_recved(struct altcp_pcb *conn, u16_t len):&#160;altcp.c'],['../group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83',1,'altcp_recved(struct altcp_pcb *conn, u16_t len):&#160;altcp.c']]],
-  ['altcp_5fsent_22',['altcp_sent',['../group__altcp.html#gab2b228c77c827fb14bfc513171c79f47',1,'altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent):&#160;altcp.c'],['../group__altcp.html#gab2b228c77c827fb14bfc513171c79f47',1,'altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent):&#160;altcp.c']]],
-  ['altcp_5fsetprio_23',['altcp_setprio',['../group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5',1,'altcp_setprio(struct altcp_pcb *conn, u8_t prio):&#160;altcp.c'],['../group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5',1,'altcp_setprio(struct altcp_pcb *conn, u8_t prio):&#160;altcp.c']]],
-  ['altcp_5fshutdown_24',['altcp_shutdown',['../group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319',1,'altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx):&#160;altcp.c'],['../group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319',1,'altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx):&#160;altcp.c']]],
-  ['altcp_5fsndbuf_25',['altcp_sndbuf',['../group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c',1,'altcp_sndbuf(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c',1,'altcp_sndbuf(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5fsndqueuelen_26',['altcp_sndqueuelen',['../group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5',1,'altcp_sndqueuelen(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5',1,'altcp_sndqueuelen(struct altcp_pcb *conn):&#160;altcp.c']]],
-  ['altcp_5ftcp_5falloc_27',['altcp_tcp_alloc',['../altcp__tcp_8c.html#a77582c93bb8a0aa2719e86b8c8505e8a',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c'],['../altcp__tcp_8h.html#a77582c93bb8a0aa2719e86b8c8505e8a',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c']]],
-  ['altcp_5ftls_5falloc_28',['altcp_tls_alloc',['../group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c']]],
-  ['altcp_5ftls_5fconfig_5fserver_5fadd_5fprivkey_5fcert_29',['altcp_tls_config_server_add_privkey_cert',['../group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcontext_30',['altcp_tls_context',['../group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcreate_5fconfig_5fclient_31',['altcp_tls_create_config_client',['../group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcreate_5fconfig_5fclient_5f2wayauth_32',['altcp_tls_create_config_client_2wayauth',['../group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcreate_5fconfig_5fserver_33',['altcp_tls_create_config_server',['../group__altcp__tls.html#gaf6ed13271394371cc89d70ef5128c411',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fcreate_5fconfig_5fserver_5fprivkey_5fcert_34',['altcp_tls_create_config_server_privkey_cert',['../group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5ffree_5fconfig_35',['altcp_tls_free_config',['../group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5ffree_5fentropy_36',['altcp_tls_free_entropy',['../group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2',1,'altcp_tls.h']]],
-  ['altcp_5ftls_5fnew_37',['altcp_tls_new',['../group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c']]],
-  ['altcp_5ftls_5fwrap_38',['altcp_tls_wrap',['../group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c',1,'altcp_tls.h']]],
-  ['altcp_5fwrite_39',['altcp_write',['../group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d',1,'altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags):&#160;altcp.c'],['../group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d',1,'altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags):&#160;altcp.c']]],
-  ['autoip_5farp_5freply_40',['autoip_arp_reply',['../autoip_8c.html#acaf2793325c60dc4531c21a3fd55c16e',1,'autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr):&#160;autoip.c'],['../autoip_8h.html#acaf2793325c60dc4531c21a3fd55c16e',1,'autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr):&#160;autoip.c']]],
-  ['autoip_5fnetwork_5fchanged_41',['autoip_network_changed',['../autoip_8c.html#a11df7a20d52680cd8c1c18fba2b91e9e',1,'autoip_network_changed(struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#a11df7a20d52680cd8c1c18fba2b91e9e',1,'autoip_network_changed(struct netif *netif):&#160;autoip.c']]],
-  ['autoip_5fset_5fstruct_42',['autoip_set_struct',['../group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90',1,'autoip_set_struct(struct netif *netif, struct autoip *autoip):&#160;autoip.c'],['../group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90',1,'autoip_set_struct(struct netif *netif, struct autoip *autoip):&#160;autoip.c']]],
-  ['autoip_5fstart_43',['autoip_start',['../group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8',1,'autoip_start(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8',1,'autoip_start(struct netif *netif):&#160;autoip.c']]],
-  ['autoip_5fstop_44',['autoip_stop',['../group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4',1,'autoip_stop(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4',1,'autoip_stop(struct netif *netif):&#160;autoip.c']]],
-  ['autoip_5fsupplied_5faddress_45',['autoip_supplied_address',['../autoip_8c.html#a1b4f0c53da17395d9de92a85708a1bb9',1,'autoip_supplied_address(const struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#a1b4f0c53da17395d9de92a85708a1bb9',1,'autoip_supplied_address(const struct netif *netif):&#160;autoip.c']]],
-  ['autoip_5ftmr_46',['autoip_tmr',['../autoip_8c.html#a746fc1d7db1bf1617afae166c9d92c2d',1,'autoip_tmr(void):&#160;autoip.c'],['../autoip_8h.html#a746fc1d7db1bf1617afae166c9d92c2d',1,'autoip_tmr(void):&#160;autoip.c']]]
+  ['acd_5fadd_0',['acd_add',['../group__acd.html#ga158856bf139cb2761837ddfa07303bdc',1,'acd_add(struct netif *netif, struct acd *acd, acd_conflict_callback_t acd_conflict_callback):&#160;acd.c'],['../group__acd.html#ga158856bf139cb2761837ddfa07303bdc',1,'acd_add(struct netif *netif, struct acd *acd, acd_conflict_callback_t acd_conflict_callback):&#160;acd.c']]],
+  ['acd_5farp_5freply_1',['acd_arp_reply',['../acd_8c.html#aa92e21410d0f0d357ab9166cda24937a',1,'acd_arp_reply(struct netif *netif, struct etharp_hdr *hdr):&#160;acd.c'],['../acd_8h.html#aa92e21410d0f0d357ab9166cda24937a',1,'acd_arp_reply(struct netif *netif, struct etharp_hdr *hdr):&#160;acd.c']]],
+  ['acd_5fnetif_5fip_5faddr_5fchanged_2',['acd_netif_ip_addr_changed',['../group__acd.html#ga18b444f6fc69325416b463208a754c97',1,'acd_netif_ip_addr_changed(struct netif *netif, const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;acd.c'],['../group__acd.html#ga18b444f6fc69325416b463208a754c97',1,'acd_netif_ip_addr_changed(struct netif *netif, const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;acd.c']]],
+  ['acd_5fnetwork_5fchanged_5flink_5fdown_3',['acd_network_changed_link_down',['../group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff',1,'acd_network_changed_link_down(struct netif *netif):&#160;acd.c'],['../group__acd.html#ga2872fa375f9cd8f5b095639d652f6bff',1,'acd_network_changed_link_down(struct netif *netif):&#160;acd.c']]],
+  ['acd_5fremove_4',['acd_remove',['../group__acd.html#ga70503696bca25e1cfb61fad38b4327da',1,'acd_remove(struct netif *netif, struct acd *acd):&#160;acd.c'],['../group__acd.html#ga70503696bca25e1cfb61fad38b4327da',1,'acd_remove(struct netif *netif, struct acd *acd):&#160;acd.c']]],
+  ['acd_5fstart_5',['acd_start',['../group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb',1,'acd_start(struct netif *netif, struct acd *acd, ip4_addr_t ipaddr):&#160;acd.c'],['../group__acd.html#ga2ca2e2dbb9713f90515d443dc691b5cb',1,'acd_start(struct netif *netif, struct acd *acd, ip4_addr_t ipaddr):&#160;acd.c']]],
+  ['acd_5fstop_6',['acd_stop',['../group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7',1,'acd_stop(struct acd *acd):&#160;acd.c'],['../group__acd.html#ga36da2b23951a14ca3c92f5e78db2f1b7',1,'acd_stop(struct acd *acd):&#160;acd.c']]],
+  ['acd_5ftmr_7',['acd_tmr',['../acd_8c.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e',1,'acd_tmr(void):&#160;acd.c'],['../acd_8h.html#a8ddf3e1cfa8f5d674d6ce00c2f7d841e',1,'acd_tmr(void):&#160;acd.c']]],
+  ['altcp_5fabort_8',['altcp_abort',['../group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab',1,'altcp_abort(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga7f6fab99fed448385a76b4a5100796ab',1,'altcp_abort(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5faccept_9',['altcp_accept',['../group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9',1,'altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept):&#160;altcp.c'],['../group__altcp.html#ga7c4cd0b1179a53b1a223936ba2270bf9',1,'altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept):&#160;altcp.c']]],
+  ['altcp_5falloc_10',['altcp_alloc',['../altcp_8c.html#aa74c9fc358cffeeb7311b4212b0d6fc7',1,'altcp_alloc(void):&#160;altcp.c'],['../altcp__priv_8h.html#aa74c9fc358cffeeb7311b4212b0d6fc7',1,'altcp_alloc(void):&#160;altcp.c']]],
+  ['altcp_5farg_11',['altcp_arg',['../group__altcp.html#ga197a33af038556a04d8f27c7033d771f',1,'altcp_arg(struct altcp_pcb *conn, void *arg):&#160;altcp.c'],['../group__altcp.html#ga197a33af038556a04d8f27c7033d771f',1,'altcp_arg(struct altcp_pcb *conn, void *arg):&#160;altcp.c']]],
+  ['altcp_5fbind_12',['altcp_bind',['../group__altcp.html#ga485b248680f73b9876d8674029c5157c',1,'altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port):&#160;altcp.c'],['../group__altcp.html#ga485b248680f73b9876d8674029c5157c',1,'altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port):&#160;altcp.c']]],
+  ['altcp_5fclose_13',['altcp_close',['../group__altcp.html#ga4329798afdf3709c789a2ee060ee3993',1,'altcp_close(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga4329798afdf3709c789a2ee060ee3993',1,'altcp_close(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5fconnect_14',['altcp_connect',['../group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492',1,'altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected):&#160;altcp.c'],['../group__altcp.html#gafaf1d533e4e89dc249a3f931afa93492',1,'altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected):&#160;altcp.c']]],
+  ['altcp_5ferr_15',['altcp_err',['../group__altcp.html#gadc76a1f3b2448559dc87da1b33291644',1,'altcp_err(struct altcp_pcb *conn, altcp_err_fn err):&#160;altcp.c'],['../group__altcp.html#gadc76a1f3b2448559dc87da1b33291644',1,'altcp_err(struct altcp_pcb *conn, altcp_err_fn err):&#160;altcp.c']]],
+  ['altcp_5ffree_16',['altcp_free',['../altcp_8c.html#afd7f6b6602e89cff51f8a8ea0315321d',1,'altcp_free(struct altcp_pcb *conn):&#160;altcp.c'],['../altcp__priv_8h.html#afd7f6b6602e89cff51f8a8ea0315321d',1,'altcp_free(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5flisten_5fwith_5fbacklog_5fand_5ferr_17',['altcp_listen_with_backlog_and_err',['../group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c'],['../group__altcp.html#ga6cab905eea9da094e9fea15e610ce36f',1,'altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err):&#160;altcp.c']]],
+  ['altcp_5fmss_18',['altcp_mss',['../group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08',1,'altcp_mss(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#gae7cfc8bd8e45c517a706afd5857fda08',1,'altcp_mss(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5fnew_19',['altcp_new',['../group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#ga6b0fc20cce40364aa821c07dc34cb908',1,'altcp_new(altcp_allocator_t *allocator):&#160;altcp.c']]],
+  ['altcp_5fnew_5fip6_20',['altcp_new_ip6',['../group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c'],['../group__altcp.html#gaffc72b9dc85bb0a9e83d04921d4c7bcd',1,'altcp_new_ip6(altcp_allocator_t *allocator):&#160;altcp.c']]],
+  ['altcp_5fnew_5fip_5ftype_21',['altcp_new_ip_type',['../group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c'],['../group__altcp.html#gaba885062fe43d317e66c25feb9f7f71d',1,'altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type):&#160;altcp.c']]],
+  ['altcp_5foutput_22',['altcp_output',['../group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6',1,'altcp_output(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga5d2370d3b671377d7e2c98ce2dc3cfc6',1,'altcp_output(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5fpoll_23',['altcp_poll',['../group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0',1,'altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval):&#160;altcp.c'],['../group__altcp.html#ga269beeaf7d8264b6ff02333bcc7c7ab0',1,'altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval):&#160;altcp.c']]],
+  ['altcp_5fproxyconnect_5falloc_24',['altcp_proxyconnect_alloc',['../altcp__proxyconnect_8c.html#a371cd4386fcbc5f0a0ff6e2fa0408e68',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a371cd4386fcbc5f0a0ff6e2fa0408e68',1,'altcp_proxyconnect_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fnew_25',['altcp_proxyconnect_new',['../altcp__proxyconnect_8c.html#a389937c9441d4e3f67412603b3d1d236',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#a389937c9441d4e3f67412603b3d1d236',1,'altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5fnew_5ftcp_26',['altcp_proxyconnect_new_tcp',['../altcp__proxyconnect_8c.html#ab0072ee857af8a28b555f14c0f2c9183',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#ab0072ee857af8a28b555f14c0f2c9183',1,'altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5fproxyconnect_5ftls_5falloc_27',['altcp_proxyconnect_tls_alloc',['../altcp__proxyconnect_8c.html#aa807e0476719f0ec41b2344d4a0df2f4',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c'],['../altcp__proxyconnect_8h.html#aa807e0476719f0ec41b2344d4a0df2f4',1,'altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_proxyconnect.c']]],
+  ['altcp_5frecv_28',['altcp_recv',['../group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71',1,'altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv):&#160;altcp.c'],['../group__altcp.html#ga7f89221f9d65036d890b1e5bd9192a71',1,'altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv):&#160;altcp.c']]],
+  ['altcp_5frecved_29',['altcp_recved',['../group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83',1,'altcp_recved(struct altcp_pcb *conn, u16_t len):&#160;altcp.c'],['../group__altcp.html#gac086951cbfedaed0c36c5fb26b44ef83',1,'altcp_recved(struct altcp_pcb *conn, u16_t len):&#160;altcp.c']]],
+  ['altcp_5fsent_30',['altcp_sent',['../group__altcp.html#gab2b228c77c827fb14bfc513171c79f47',1,'altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent):&#160;altcp.c'],['../group__altcp.html#gab2b228c77c827fb14bfc513171c79f47',1,'altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent):&#160;altcp.c']]],
+  ['altcp_5fsetprio_31',['altcp_setprio',['../group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5',1,'altcp_setprio(struct altcp_pcb *conn, u8_t prio):&#160;altcp.c'],['../group__altcp.html#ga5040b0a4646bca718d3611ba7fa558c5',1,'altcp_setprio(struct altcp_pcb *conn, u8_t prio):&#160;altcp.c']]],
+  ['altcp_5fshutdown_32',['altcp_shutdown',['../group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319',1,'altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx):&#160;altcp.c'],['../group__altcp.html#ga0c3172d0bfe452599e242ea2e4692319',1,'altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx):&#160;altcp.c']]],
+  ['altcp_5fsndbuf_33',['altcp_sndbuf',['../group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c',1,'altcp_sndbuf(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#gab295cba0c1ded90fe044a8c37387a12c',1,'altcp_sndbuf(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5fsndqueuelen_34',['altcp_sndqueuelen',['../group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5',1,'altcp_sndqueuelen(struct altcp_pcb *conn):&#160;altcp.c'],['../group__altcp.html#ga516a1bfbf38fc47cfd47852715c505c5',1,'altcp_sndqueuelen(struct altcp_pcb *conn):&#160;altcp.c']]],
+  ['altcp_5ftcp_5falloc_35',['altcp_tcp_alloc',['../altcp__tcp_8c.html#a77582c93bb8a0aa2719e86b8c8505e8a',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c'],['../altcp__tcp_8h.html#a77582c93bb8a0aa2719e86b8c8505e8a',1,'altcp_tcp_alloc(void *arg, u8_t ip_type):&#160;altcp_tcp.c']]],
+  ['altcp_5ftls_5falloc_36',['altcp_tls_alloc',['../group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#gab0bdfd2ede0df4d47b6e12ccac2b14bc',1,'altcp_tls_alloc(void *arg, u8_t ip_type):&#160;altcp_alloc.c']]],
+  ['altcp_5ftls_5fconfig_5fserver_5fadd_5fprivkey_5fcert_37',['altcp_tls_config_server_add_privkey_cert',['../group__altcp__tls.html#gae6f52370b62b0f4ba8d373c5186c9e7e',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fconfigure_5falpn_5fprotocols_38',['altcp_tls_configure_alpn_protocols',['../group__altcp__tls.html#ga1f60b12a6a4440214b7bcf2e3ba43126',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcontext_39',['altcp_tls_context',['../group__altcp__tls.html#ga85d20b4dc321342cf09ad93086309bb7',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fclient_40',['altcp_tls_create_config_client',['../group__altcp__tls.html#ga7b3c11c8a273d68acc332c55e6b38170',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fclient_5f2wayauth_41',['altcp_tls_create_config_client_2wayauth',['../group__altcp__tls.html#ga4dccbd861c03a9c09eae6799da004597',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fserver_42',['altcp_tls_create_config_server',['../group__altcp__tls.html#gaa37649bf24ebea235a8e3e8f50b9831f',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fcreate_5fconfig_5fserver_5fprivkey_5fcert_43',['altcp_tls_create_config_server_privkey_cert',['../group__altcp__tls.html#ga60b4635c80b832a8c3b332fdede69d5e',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5ffree_5fconfig_44',['altcp_tls_free_config',['../group__altcp__tls.html#ga8fb8a92fa3f84170050ddab2888b9145',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5ffree_5fentropy_45',['altcp_tls_free_entropy',['../group__altcp__tls.html#ga75675ccec142d17fc0695b425f3ec1c2',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5ffree_5fsession_46',['altcp_tls_free_session',['../group__altcp__tls.html#ga906eefcef66e9dd2b43c3392704905f5',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fget_5fsession_47',['altcp_tls_get_session',['../group__altcp__tls.html#ga827c76a0bddc4923b9a17c813e13891e',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5finit_5fsession_48',['altcp_tls_init_session',['../group__altcp__tls.html#gae6c3cf72fcd29e6ea4c74181370420c3',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fnew_49',['altcp_tls_new',['../group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c'],['../group__altcp__tls.html#gab6a717446af931949bc3e0daceb090c8',1,'altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type):&#160;altcp_alloc.c']]],
+  ['altcp_5ftls_5fset_5fsession_50',['altcp_tls_set_session',['../group__altcp__tls.html#ga4aed4aa55d0e1b15f4118863cea06d18',1,'altcp_tls.h']]],
+  ['altcp_5ftls_5fwrap_51',['altcp_tls_wrap',['../group__altcp__tls.html#gaa527b756ad6673a19cc78287026c765c',1,'altcp_tls.h']]],
+  ['altcp_5fwrite_52',['altcp_write',['../group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d',1,'altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags):&#160;altcp.c'],['../group__altcp.html#gaad9a38396b127cfd778e253f20a97b8d',1,'altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags):&#160;altcp.c']]],
+  ['autoip_5fnetwork_5fchanged_5flink_5fdown_53',['autoip_network_changed_link_down',['../autoip_8c.html#af93544c49f2c24b95a3981351d023056',1,'autoip_network_changed_link_down(struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#af93544c49f2c24b95a3981351d023056',1,'autoip_network_changed_link_down(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fnetwork_5fchanged_5flink_5fup_54',['autoip_network_changed_link_up',['../autoip_8c.html#af2a36aee96cbdf8f4a8f1e69c91ff425',1,'autoip_network_changed_link_up(struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#af2a36aee96cbdf8f4a8f1e69c91ff425',1,'autoip_network_changed_link_up(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fremove_5fstruct_55',['autoip_remove_struct',['../group__autoip.html#gac0c98035795500ede464aa4af2515f30',1,'autoip_remove_struct(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#gac0c98035795500ede464aa4af2515f30',1,'autoip_remove_struct(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fset_5fstruct_56',['autoip_set_struct',['../group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90',1,'autoip_set_struct(struct netif *netif, struct autoip *autoip):&#160;autoip.c'],['../group__autoip.html#ga2122c0b2518b371559fef5ec1d2aed90',1,'autoip_set_struct(struct netif *netif, struct autoip *autoip):&#160;autoip.c']]],
+  ['autoip_5fstart_57',['autoip_start',['../group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8',1,'autoip_start(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#ga1461f5826ebefc050e0d63013818d1e8',1,'autoip_start(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fstop_58',['autoip_stop',['../group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4',1,'autoip_stop(struct netif *netif):&#160;autoip.c'],['../group__autoip.html#ga58a4dce658dd1263e84eb982f62587d4',1,'autoip_stop(struct netif *netif):&#160;autoip.c']]],
+  ['autoip_5fsupplied_5faddress_59',['autoip_supplied_address',['../autoip_8c.html#a6de97b7dcd98f9039d5c1ad11c257d62',1,'autoip_supplied_address(struct netif *netif):&#160;autoip.c'],['../autoip_8h.html#a6de97b7dcd98f9039d5c1ad11c257d62',1,'autoip_supplied_address(struct netif *netif):&#160;autoip.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_1.js b/doc/doxygen/output/html/search/functions_1.js
index 5857f44..b3386f8 100644
--- a/doc/doxygen/output/html/search/functions_1.js
+++ b/doc/doxygen/output/html/search/functions_1.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['ble_5faddr_5fto_5feui64_0',['ble_addr_to_eui64',['../group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c',1,'ble_addr_to_eui64(uint8_t *dst, const uint8_t *src, int public_addr):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#gaa5b1823c2509b8816ef98dcac67e037c',1,'ble_addr_to_eui64(uint8_t *dst, const uint8_t *src, int public_addr):&#160;lowpan6_ble.c']]],
+  ['ble_5faddr_5fto_5feui64_0',['ble_addr_to_eui64',['../group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f',1,'ble_addr_to_eui64(u8_t *dst, const u8_t *src, int public_addr):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga49e3a1fcedd9371023c776f0c3bb3f0f',1,'ble_addr_to_eui64(u8_t *dst, const u8_t *src, int public_addr):&#160;lowpan6_ble.c']]],
   ['bridgeif_5fadd_5fport_1',['bridgeif_add_port',['../group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77',1,'bridgeif_add_port(struct netif *bridgeif, struct netif *portif):&#160;bridgeif.c'],['../group__bridgeif.html#ga51b7d1af22f7023aabd8502aadf77c77',1,'bridgeif_add_port(struct netif *bridgeif, struct netif *portif):&#160;bridgeif.c']]],
   ['bridgeif_5ffdb_5fadd_2',['bridgeif_fdb_add',['../group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666',1,'bridgeif_fdb_add(struct netif *bridgeif, const struct eth_addr *addr, bridgeif_portmask_t ports):&#160;bridgeif.c'],['../group__bridgeif.html#gad20fea2657431d4a0905be80cb0b4666',1,'bridgeif_fdb_add(struct netif *bridgeif, const struct eth_addr *addr, bridgeif_portmask_t ports):&#160;bridgeif.c']]],
   ['bridgeif_5ffdb_5fget_5fdst_5fports_3',['bridgeif_fdb_get_dst_ports',['../group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750',1,'bridgeif_fdb_get_dst_ports(void *fdb_ptr, struct eth_addr *dst_addr):&#160;bridgeif_fdb.c'],['../group__bridgeif__fdb.html#ga616fb7404be5da79d8092b4a14976750',1,'bridgeif_fdb_get_dst_ports(void *fdb_ptr, struct eth_addr *dst_addr):&#160;bridgeif_fdb.c']]],
diff --git a/doc/doxygen/output/html/search/functions_2.js b/doc/doxygen/output/html/search/functions_2.js
index 2fd7457..f39a698 100644
--- a/doc/doxygen/output/html/search/functions_2.js
+++ b/doc/doxygen/output/html/search/functions_2.js
@@ -7,23 +7,22 @@
   ['dhcp6_5fnd6_5fra_5ftrigger_4',['dhcp6_nd6_ra_trigger',['../dhcp6_8c.html#af0f47aac3c04c84a7143fa6925e9fdba',1,'dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config):&#160;dhcp6.c'],['../dhcp6_8h.html#af0f47aac3c04c84a7143fa6925e9fdba',1,'dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config):&#160;dhcp6.c']]],
   ['dhcp6_5fset_5fstruct_5',['dhcp6_set_struct',['../group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453',1,'dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6):&#160;dhcp6.c'],['../group__dhcp6.html#ga5cdf4082c8a4ee6bf0cb874c0eaa8453',1,'dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6):&#160;dhcp6.c']]],
   ['dhcp6_5ftmr_6',['dhcp6_tmr',['../dhcp6_8c.html#a5289027cb2b166d08bc55b7ed2d4756d',1,'dhcp6_tmr(void):&#160;dhcp6.c'],['../dhcp6_8h.html#a5289027cb2b166d08bc55b7ed2d4756d',1,'dhcp6_tmr(void):&#160;dhcp6.c']]],
-  ['dhcp_5farp_5freply_7',['dhcp_arp_reply',['../dhcp_8c.html#a1fc0a94e0b94f13c5d302018f7ecb535',1,'dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr):&#160;dhcp.c'],['../dhcp_8h.html#a1fc0a94e0b94f13c5d302018f7ecb535',1,'dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr):&#160;dhcp.c']]],
-  ['dhcp_5fcleanup_8',['dhcp_cleanup',['../group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64',1,'dhcp_cleanup(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64',1,'dhcp_cleanup(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fcoarse_5ftmr_9',['dhcp_coarse_tmr',['../dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb',1,'dhcp_coarse_tmr(void):&#160;dhcp.c'],['../dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb',1,'dhcp_coarse_tmr(void):&#160;dhcp.c']]],
-  ['dhcp_5ffine_5ftmr_10',['dhcp_fine_tmr',['../dhcp_8c.html#a601d97faa24fa7289244bb452f052045',1,'dhcp_fine_tmr(void):&#160;dhcp.c'],['../dhcp_8h.html#a601d97faa24fa7289244bb452f052045',1,'dhcp_fine_tmr(void):&#160;dhcp.c']]],
-  ['dhcp_5finform_11',['dhcp_inform',['../group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad',1,'dhcp_inform(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad',1,'dhcp_inform(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fnetwork_5fchanged_12',['dhcp_network_changed',['../dhcp_8c.html#a04f3824720223c439165243527906002',1,'dhcp_network_changed(struct netif *netif):&#160;dhcp.c'],['../dhcp_8h.html#a04f3824720223c439165243527906002',1,'dhcp_network_changed(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5frelease_13',['dhcp_release',['../group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4',1,'dhcp_release(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4',1,'dhcp_release(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5frelease_5fand_5fstop_14',['dhcp_release_and_stop',['../group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece',1,'dhcp_release_and_stop(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece',1,'dhcp_release_and_stop(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5frenew_15',['dhcp_renew',['../group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947',1,'dhcp_renew(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947',1,'dhcp_renew(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fset_5fstruct_16',['dhcp_set_struct',['../group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8',1,'dhcp_set_struct(struct netif *netif, struct dhcp *dhcp):&#160;dhcp.c'],['../group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8',1,'dhcp_set_struct(struct netif *netif, struct dhcp *dhcp):&#160;dhcp.c']]],
-  ['dhcp_5fstart_17',['dhcp_start',['../group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f',1,'dhcp_start(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f',1,'dhcp_start(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fstop_18',['dhcp_stop',['../group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312',1,'dhcp_stop(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312',1,'dhcp_stop(struct netif *netif):&#160;dhcp.c']]],
-  ['dhcp_5fsupplied_5faddress_19',['dhcp_supplied_address',['../dhcp_8c.html#ae24a2529372218327ab9cb6592041c85',1,'dhcp_supplied_address(const struct netif *netif):&#160;dhcp.c'],['../dhcp_8h.html#ae24a2529372218327ab9cb6592041c85',1,'dhcp_supplied_address(const struct netif *netif):&#160;dhcp.c']]],
-  ['dns_5fgethostbyname_20',['dns_gethostbyname',['../group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f',1,'dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *callback_arg):&#160;dns.c'],['../group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f',1,'dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *callback_arg):&#160;dns.c']]],
-  ['dns_5fgethostbyname_5faddrtype_21',['dns_gethostbyname_addrtype',['../group__dns.html#gae84449f60dca6b863142daca8e03ce79',1,'dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *callback_arg, u8_t dns_addrtype):&#160;dns.c'],['../group__dns.html#gae84449f60dca6b863142daca8e03ce79',1,'dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *callback_arg, u8_t dns_addrtype):&#160;dns.c']]],
-  ['dns_5fgetserver_22',['dns_getserver',['../group__dns.html#gac41de226d156384ae8782cfe370284b0',1,'dns_getserver(u8_t numdns):&#160;dns.c'],['../group__dns.html#gac41de226d156384ae8782cfe370284b0',1,'dns_getserver(u8_t numdns):&#160;dns.c']]],
-  ['dns_5finit_23',['dns_init',['../dns_8c.html#adb31c3b6180773bd11f914c327f209cf',1,'dns_init(void):&#160;dns.c'],['../dns_8h.html#adb31c3b6180773bd11f914c327f209cf',1,'dns_init(void):&#160;dns.c']]],
-  ['dns_5fsetserver_24',['dns_setserver',['../group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584',1,'dns_setserver(u8_t numdns, const ip_addr_t *dnsserver):&#160;dns.c'],['../group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584',1,'dns_setserver(u8_t numdns, const ip_addr_t *dnsserver):&#160;dns.c']]],
-  ['dns_5ftmr_25',['dns_tmr',['../dns_8c.html#a9389f374ec66488aa4f42a652583f533',1,'dns_tmr(void):&#160;dns.c'],['../dns_8h.html#a9389f374ec66488aa4f42a652583f533',1,'dns_tmr(void):&#160;dns.c']]]
+  ['dhcp_5fcleanup_7',['dhcp_cleanup',['../group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64',1,'dhcp_cleanup(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga292a1b0c0c288ec508108a3fba473e64',1,'dhcp_cleanup(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fcoarse_5ftmr_8',['dhcp_coarse_tmr',['../dhcp_8c.html#ad7480883d64f3d6f083c8aa933b5e3cb',1,'dhcp_coarse_tmr(void):&#160;dhcp.c'],['../dhcp_8h.html#ad7480883d64f3d6f083c8aa933b5e3cb',1,'dhcp_coarse_tmr(void):&#160;dhcp.c']]],
+  ['dhcp_5ffine_5ftmr_9',['dhcp_fine_tmr',['../dhcp_8c.html#a601d97faa24fa7289244bb452f052045',1,'dhcp_fine_tmr(void):&#160;dhcp.c'],['../dhcp_8h.html#a601d97faa24fa7289244bb452f052045',1,'dhcp_fine_tmr(void):&#160;dhcp.c']]],
+  ['dhcp_5finform_10',['dhcp_inform',['../group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad',1,'dhcp_inform(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gabd7fcc7e0799e313885fc7fd9d4992ad',1,'dhcp_inform(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fnetwork_5fchanged_5flink_5fup_11',['dhcp_network_changed_link_up',['../dhcp_8c.html#a2fd33722859054ea932ff05ff62dedaa',1,'dhcp_network_changed_link_up(struct netif *netif):&#160;dhcp.c'],['../dhcp_8h.html#a2fd33722859054ea932ff05ff62dedaa',1,'dhcp_network_changed_link_up(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5frelease_12',['dhcp_release',['../group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4',1,'dhcp_release(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gaf92f7afb58252f82a749064602974bd4',1,'dhcp_release(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5frelease_5fand_5fstop_13',['dhcp_release_and_stop',['../group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece',1,'dhcp_release_and_stop(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#gaf7cd42b9f220446b6a597d3474da6ece',1,'dhcp_release_and_stop(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5frenew_14',['dhcp_renew',['../group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947',1,'dhcp_renew(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga583eb8d58f5e96b7dea717948578a947',1,'dhcp_renew(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fset_5fstruct_15',['dhcp_set_struct',['../group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8',1,'dhcp_set_struct(struct netif *netif, struct dhcp *dhcp):&#160;dhcp.c'],['../group__dhcp4.html#ga43812097832716a462c660eb59cc1bf8',1,'dhcp_set_struct(struct netif *netif, struct dhcp *dhcp):&#160;dhcp.c']]],
+  ['dhcp_5fstart_16',['dhcp_start',['../group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f',1,'dhcp_start(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga0c50968d9811aa2aa67fadc0885d744f',1,'dhcp_start(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fstop_17',['dhcp_stop',['../group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312',1,'dhcp_stop(struct netif *netif):&#160;dhcp.c'],['../group__dhcp4.html#ga93f6bf21086dc9b10c0bec4676f97312',1,'dhcp_stop(struct netif *netif):&#160;dhcp.c']]],
+  ['dhcp_5fsupplied_5faddress_18',['dhcp_supplied_address',['../dhcp_8c.html#ae24a2529372218327ab9cb6592041c85',1,'dhcp_supplied_address(const struct netif *netif):&#160;dhcp.c'],['../dhcp_8h.html#ae24a2529372218327ab9cb6592041c85',1,'dhcp_supplied_address(const struct netif *netif):&#160;dhcp.c']]],
+  ['dns_5fgethostbyname_19',['dns_gethostbyname',['../group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f',1,'dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *callback_arg):&#160;dns.c'],['../group__dns.html#ga1e040ec38166dc9bfcc3473aab0c799f',1,'dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *callback_arg):&#160;dns.c']]],
+  ['dns_5fgethostbyname_5faddrtype_20',['dns_gethostbyname_addrtype',['../group__dns.html#gae84449f60dca6b863142daca8e03ce79',1,'dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *callback_arg, u8_t dns_addrtype):&#160;dns.c'],['../group__dns.html#gae84449f60dca6b863142daca8e03ce79',1,'dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *callback_arg, u8_t dns_addrtype):&#160;dns.c']]],
+  ['dns_5fgetserver_21',['dns_getserver',['../group__dns.html#gac41de226d156384ae8782cfe370284b0',1,'dns_getserver(u8_t numdns):&#160;dns.c'],['../group__dns.html#gac41de226d156384ae8782cfe370284b0',1,'dns_getserver(u8_t numdns):&#160;dns.c']]],
+  ['dns_5finit_22',['dns_init',['../dns_8c.html#adb31c3b6180773bd11f914c327f209cf',1,'dns_init(void):&#160;dns.c'],['../dns_8h.html#adb31c3b6180773bd11f914c327f209cf',1,'dns_init(void):&#160;dns.c']]],
+  ['dns_5fsetserver_23',['dns_setserver',['../group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584',1,'dns_setserver(u8_t numdns, const ip_addr_t *dnsserver):&#160;dns.c'],['../group__dns.html#gaf66c5d8273f83cdc2cdd8911fb68d584',1,'dns_setserver(u8_t numdns, const ip_addr_t *dnsserver):&#160;dns.c']]],
+  ['dns_5ftmr_24',['dns_tmr',['../dns_8c.html#a9389f374ec66488aa4f42a652583f533',1,'dns_tmr(void):&#160;dns.c'],['../dns_8h.html#a9389f374ec66488aa4f42a652583f533',1,'dns_tmr(void):&#160;dns.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_3.js b/doc/doxygen/output/html/search/functions_3.js
index 96cb9df..a630a0a 100644
--- a/doc/doxygen/output/html/search/functions_3.js
+++ b/doc/doxygen/output/html/search/functions_3.js
@@ -1,15 +1,17 @@
 var searchData=
 [
-  ['etharp_5fcleanup_5fnetif_0',['etharp_cleanup_netif',['../etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05',1,'etharp_cleanup_netif(struct netif *netif):&#160;etharp.c'],['../lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05',1,'etharp_cleanup_netif(struct netif *netif):&#160;etharp.c']]],
-  ['etharp_5ffind_5faddr_1',['etharp_find_addr',['../etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c',1,'etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr **eth_ret, const ip4_addr_t **ip_ret):&#160;etharp.c'],['../lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c',1,'etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr **eth_ret, const ip4_addr_t **ip_ret):&#160;etharp.c']]],
-  ['etharp_5fget_5fentry_2',['etharp_get_entry',['../etharp_8c.html#ab93df7ccb26496100d45137541e863c8',1,'etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret):&#160;etharp.c'],['../lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8',1,'etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret):&#160;etharp.c']]],
-  ['etharp_5finput_3',['etharp_input',['../etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6',1,'etharp_input(struct pbuf *p, struct netif *netif):&#160;etharp.c'],['../lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6',1,'etharp_input(struct pbuf *p, struct netif *netif):&#160;etharp.c']]],
-  ['etharp_5foutput_4',['etharp_output',['../etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d',1,'etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d',1,'etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
-  ['etharp_5fquery_5',['etharp_query',['../etharp_8c.html#ae180772e31346a0afeb707ad172dd19c',1,'etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q):&#160;etharp.c'],['../lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c',1,'etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q):&#160;etharp.c']]],
-  ['etharp_5frequest_6',['etharp_request',['../etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15',1,'etharp_request(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15',1,'etharp_request(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
-  ['etharp_5ftmr_7',['etharp_tmr',['../etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26',1,'etharp_tmr(void):&#160;etharp.c'],['../lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26',1,'etharp_tmr(void):&#160;etharp.c']]],
-  ['ethernet_5finput_8',['ethernet_input',['../group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff',1,'ethernet_input(struct pbuf *p, struct netif *netif):&#160;ethernet.c'],['../group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff',1,'ethernet_input(struct pbuf *p, struct netif *netif):&#160;ethernet.c']]],
-  ['ethernet_5foutput_9',['ethernet_output',['../group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778',1,'ethernet_output(struct netif *netif, struct pbuf *p, const struct eth_addr *src, const struct eth_addr *dst, u16_t eth_type):&#160;ethernet.c'],['../group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778',1,'ethernet_output(struct netif *netif, struct pbuf *p, const struct eth_addr *src, const struct eth_addr *dst, u16_t eth_type):&#160;ethernet.c']]],
-  ['ethip6_5foutput_10',['ethip6_output',['../ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd',1,'ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;ethip6.c'],['../ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd',1,'ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;ethip6.c']]],
-  ['eui64_5fto_5fble_5faddr_11',['eui64_to_ble_addr',['../group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d',1,'eui64_to_ble_addr(uint8_t *dst, const uint8_t *src):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga3e245a85f9edddca93ddd2967209881d',1,'eui64_to_ble_addr(uint8_t *dst, const uint8_t *src):&#160;lowpan6_ble.c']]]
+  ['etharp_5facd_5fannounce_0',['etharp_acd_announce',['../etharp_8c.html#a7c41ba8b145fa4d06f8d6af3df44c4ff',1,'etharp_acd_announce(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a7c41ba8b145fa4d06f8d6af3df44c4ff',1,'etharp_acd_announce(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
+  ['etharp_5facd_5fprobe_1',['etharp_acd_probe',['../etharp_8c.html#aac7d5048a81ef1c63b18d769700f4899',1,'etharp_acd_probe(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#aac7d5048a81ef1c63b18d769700f4899',1,'etharp_acd_probe(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
+  ['etharp_5fcleanup_5fnetif_2',['etharp_cleanup_netif',['../etharp_8c.html#ae94677a2a5f3698276027c7475f6ca05',1,'etharp_cleanup_netif(struct netif *netif):&#160;etharp.c'],['../lwip_2etharp_8h.html#ae94677a2a5f3698276027c7475f6ca05',1,'etharp_cleanup_netif(struct netif *netif):&#160;etharp.c']]],
+  ['etharp_5ffind_5faddr_3',['etharp_find_addr',['../etharp_8c.html#a0f8ca87c5472fa165763c8c38b76174c',1,'etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr **eth_ret, const ip4_addr_t **ip_ret):&#160;etharp.c'],['../lwip_2etharp_8h.html#a0f8ca87c5472fa165763c8c38b76174c',1,'etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr **eth_ret, const ip4_addr_t **ip_ret):&#160;etharp.c']]],
+  ['etharp_5fget_5fentry_4',['etharp_get_entry',['../etharp_8c.html#ab93df7ccb26496100d45137541e863c8',1,'etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret):&#160;etharp.c'],['../lwip_2etharp_8h.html#ab93df7ccb26496100d45137541e863c8',1,'etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret):&#160;etharp.c']]],
+  ['etharp_5finput_5',['etharp_input',['../etharp_8c.html#a540a5506979693ef9ac4496db9bfa7d6',1,'etharp_input(struct pbuf *p, struct netif *netif):&#160;etharp.c'],['../lwip_2etharp_8h.html#a540a5506979693ef9ac4496db9bfa7d6',1,'etharp_input(struct pbuf *p, struct netif *netif):&#160;etharp.c']]],
+  ['etharp_5foutput_6',['etharp_output',['../etharp_8c.html#a19258c75a3778b6ed0c82f63a419502d',1,'etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a19258c75a3778b6ed0c82f63a419502d',1,'etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
+  ['etharp_5fquery_7',['etharp_query',['../etharp_8c.html#ae180772e31346a0afeb707ad172dd19c',1,'etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q):&#160;etharp.c'],['../lwip_2etharp_8h.html#ae180772e31346a0afeb707ad172dd19c',1,'etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q):&#160;etharp.c']]],
+  ['etharp_5frequest_8',['etharp_request',['../etharp_8c.html#a3e56faced96841e615f88dd57d1b2b15',1,'etharp_request(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c'],['../lwip_2etharp_8h.html#a3e56faced96841e615f88dd57d1b2b15',1,'etharp_request(struct netif *netif, const ip4_addr_t *ipaddr):&#160;etharp.c']]],
+  ['etharp_5ftmr_9',['etharp_tmr',['../etharp_8c.html#a654f4dad71f7e2bc4820094648f37a26',1,'etharp_tmr(void):&#160;etharp.c'],['../lwip_2etharp_8h.html#a654f4dad71f7e2bc4820094648f37a26',1,'etharp_tmr(void):&#160;etharp.c']]],
+  ['ethernet_5finput_10',['ethernet_input',['../group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff',1,'ethernet_input(struct pbuf *p, struct netif *netif):&#160;ethernet.c'],['../group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff',1,'ethernet_input(struct pbuf *p, struct netif *netif):&#160;ethernet.c']]],
+  ['ethernet_5foutput_11',['ethernet_output',['../group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778',1,'ethernet_output(struct netif *netif, struct pbuf *p, const struct eth_addr *src, const struct eth_addr *dst, u16_t eth_type):&#160;ethernet.c'],['../group__ethernet.html#gac9cad5802bfa3d885f13d2ba0f40b778',1,'ethernet_output(struct netif *netif, struct pbuf *p, const struct eth_addr *src, const struct eth_addr *dst, u16_t eth_type):&#160;ethernet.c']]],
+  ['ethip6_5foutput_12',['ethip6_output',['../ethip6_8c.html#ab5326546d33174f91f1fb0cc6d398bfd',1,'ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;ethip6.c'],['../ethip6_8h.html#ab5326546d33174f91f1fb0cc6d398bfd',1,'ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;ethip6.c']]],
+  ['eui64_5fto_5fble_5faddr_13',['eui64_to_ble_addr',['../group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4',1,'eui64_to_ble_addr(u8_t *dst, const u8_t *src):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga57d33f6024e419e8cbc32dfb783e39a4',1,'eui64_to_ble_addr(u8_t *dst, const u8_t *src):&#160;lowpan6_ble.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_4.js b/doc/doxygen/output/html/search/functions_4.js
index 13daa30..ed50d07 100644
--- a/doc/doxygen/output/html/search/functions_4.js
+++ b/doc/doxygen/output/html/search/functions_4.js
@@ -1,13 +1,4 @@
 var searchData=
 [
-  ['http_5fset_5fcgi_5fhandlers_0',['http_set_cgi_handlers',['../group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897',1,'http_set_cgi_handlers(const tCGI *cgis, int num_handlers):&#160;httpd.c'],['../group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897',1,'http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers):&#160;httpd.c']]],
-  ['http_5fset_5fssi_5fhandler_1',['http_set_ssi_handler',['../group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c',1,'http_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags):&#160;httpd.c'],['../group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c',1,'http_set_ssi_handler(tSSIHandler pfnSSIHandler, const char **ppcTags, int iNumTags):&#160;httpd.c']]],
-  ['httpc_5fget_5ffile_2',['httpc_get_file',['../group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b',1,'httpc_get_file(const ip_addr_t *server_addr, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c'],['../group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b',1,'httpc_get_file(const ip_addr_t *server_addr, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c']]],
-  ['httpc_5fget_5ffile_5fdns_3',['httpc_get_file_dns',['../group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6',1,'httpc_get_file_dns(const char *server_name, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c'],['../group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6',1,'httpc_get_file_dns(const char *server_name, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c']]],
-  ['httpd_5finit_4',['httpd_init',['../group__httpd.html#gac364305cee969a0be43c071722b136e6',1,'httpd_init(void):&#160;httpd.c'],['../group__httpd.html#gac364305cee969a0be43c071722b136e6',1,'httpd_init(void):&#160;httpd.c']]],
-  ['httpd_5finits_5',['httpd_inits',['../group__httpd.html#gafaedb1911a83854b1e9835132db64409',1,'httpd_inits(struct altcp_tls_config *conf):&#160;httpd.c'],['../group__httpd.html#gafaedb1911a83854b1e9835132db64409',1,'httpd_inits(struct altcp_tls_config *conf):&#160;httpd.c']]],
-  ['httpd_5fpost_5fbegin_6',['httpd_post_begin',['../group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582',1,'httpd.h']]],
-  ['httpd_5fpost_5fdata_5frecved_7',['httpd_post_data_recved',['../group__httpd.html#gaca4357acf5c988b28123bc6f23540380',1,'httpd_post_data_recved(void *connection, u16_t recved_len):&#160;httpd.c'],['../group__httpd.html#gaca4357acf5c988b28123bc6f23540380',1,'httpd_post_data_recved(void *connection, u16_t recved_len):&#160;httpd.c']]],
-  ['httpd_5fpost_5ffinished_8',['httpd_post_finished',['../group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5',1,'httpd.h']]],
-  ['httpd_5fpost_5freceive_5fdata_9',['httpd_post_receive_data',['../group__httpd.html#ga461409c8813c2a82ba63fde987c0e537',1,'httpd.h']]]
+  ['get_5fmdns_5fpcb_0',['get_mdns_pcb',['../mdns_8c.html#aa31b798a5fb96b6ef0dde5d4f32371af',1,'get_mdns_pcb(void):&#160;mdns.c'],['../mdns__priv_8h.html#aa31b798a5fb96b6ef0dde5d4f32371af',1,'get_mdns_pcb(void):&#160;mdns.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_5.js b/doc/doxygen/output/html/search/functions_5.js
index ae08cb3..13daa30 100644
--- a/doc/doxygen/output/html/search/functions_5.js
+++ b/doc/doxygen/output/html/search/functions_5.js
@@ -1,60 +1,13 @@
 var searchData=
 [
-  ['icmp6_5fdest_5funreach_0',['icmp6_dest_unreach',['../icmp6_8c.html#ab480867394952904b5607d62315bdbac',1,'icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c):&#160;icmp6.c'],['../icmp6_8h.html#ab480867394952904b5607d62315bdbac',1,'icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c):&#160;icmp6.c']]],
-  ['icmp6_5finput_1',['icmp6_input',['../icmp6_8c.html#a94bec819e11f51c8088ca338f2e36c3d',1,'icmp6_input(struct pbuf *p, struct netif *inp):&#160;icmp6.c'],['../icmp6_8h.html#a94bec819e11f51c8088ca338f2e36c3d',1,'icmp6_input(struct pbuf *p, struct netif *inp):&#160;icmp6.c']]],
-  ['icmp6_5fpacket_5ftoo_5fbig_2',['icmp6_packet_too_big',['../icmp6_8c.html#a3c0a84e0944263d92c9dc3ad094ffcb0',1,'icmp6_packet_too_big(struct pbuf *p, u32_t mtu):&#160;icmp6.c'],['../icmp6_8h.html#a3c0a84e0944263d92c9dc3ad094ffcb0',1,'icmp6_packet_too_big(struct pbuf *p, u32_t mtu):&#160;icmp6.c']]],
-  ['icmp6_5fparam_5fproblem_3',['icmp6_param_problem',['../icmp6_8c.html#a6094fa333b2cbf1b1b062e72313ef146',1,'icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, const void *pointer):&#160;icmp6.c'],['../icmp6_8h.html#a6094fa333b2cbf1b1b062e72313ef146',1,'icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, const void *pointer):&#160;icmp6.c']]],
-  ['icmp6_5ftime_5fexceeded_4',['icmp6_time_exceeded',['../icmp6_8c.html#a358abb6555f6ca6b2b2b1412c9117bec',1,'icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c):&#160;icmp6.c'],['../icmp6_8h.html#a358abb6555f6ca6b2b2b1412c9117bec',1,'icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c):&#160;icmp6.c']]],
-  ['icmp6_5ftime_5fexceeded_5fwith_5faddrs_5',['icmp6_time_exceeded_with_addrs',['../icmp6_8c.html#ad01e5bc4690a2c6aeb534237a5a9b593',1,'icmp6_time_exceeded_with_addrs(struct pbuf *p, enum icmp6_te_code c, const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr):&#160;icmp6.c'],['../icmp6_8h.html#ad01e5bc4690a2c6aeb534237a5a9b593',1,'icmp6_time_exceeded_with_addrs(struct pbuf *p, enum icmp6_te_code c, const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr):&#160;icmp6.c']]],
-  ['icmp_5fdest_5funreach_6',['icmp_dest_unreach',['../icmp_8c.html#ae26c59eab4ce553964a0c9d43f534d06',1,'icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t):&#160;icmp.c'],['../icmp_8h.html#ae26c59eab4ce553964a0c9d43f534d06',1,'icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t):&#160;icmp.c']]],
-  ['icmp_5finput_7',['icmp_input',['../icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1',1,'icmp_input(struct pbuf *p, struct netif *inp):&#160;icmp.c'],['../icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1',1,'icmp_input(struct pbuf *p, struct netif *inp):&#160;icmp.c']]],
-  ['icmp_5ftime_5fexceeded_8',['icmp_time_exceeded',['../icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119',1,'icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t):&#160;icmp.c'],['../icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119',1,'icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t):&#160;icmp.c']]],
-  ['igmp_5finit_9',['igmp_init',['../igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8',1,'igmp_init(void):&#160;igmp.c'],['../igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8',1,'igmp_init(void):&#160;igmp.c']]],
-  ['igmp_5finput_10',['igmp_input',['../igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a',1,'igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest):&#160;igmp.c'],['../igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a',1,'igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest):&#160;igmp.c']]],
-  ['igmp_5fjoingroup_11',['igmp_joingroup',['../group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6',1,'igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6',1,'igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
-  ['igmp_5fjoingroup_5fnetif_12',['igmp_joingroup_netif',['../group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6',1,'igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6',1,'igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
-  ['igmp_5fleavegroup_13',['igmp_leavegroup',['../group__igmp.html#ga21c572ba7481ca41eb873923a5346544',1,'igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga21c572ba7481ca41eb873923a5346544',1,'igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
-  ['igmp_5fleavegroup_5fnetif_14',['igmp_leavegroup_netif',['../group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201',1,'igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201',1,'igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
-  ['igmp_5flookfor_5fgroup_15',['igmp_lookfor_group',['../igmp_8c.html#a695bd07cc4997aedb871b83456e18890',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c'],['../igmp_8h.html#a695bd07cc4997aedb871b83456e18890',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c']]],
-  ['igmp_5freport_5fgroups_16',['igmp_report_groups',['../igmp_8c.html#af06eeba0e984aab4a67a836eab577726',1,'igmp_report_groups(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#af06eeba0e984aab4a67a836eab577726',1,'igmp_report_groups(struct netif *netif):&#160;igmp.c']]],
-  ['igmp_5fstart_17',['igmp_start',['../igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6',1,'igmp_start(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6',1,'igmp_start(struct netif *netif):&#160;igmp.c']]],
-  ['igmp_5fstop_18',['igmp_stop',['../igmp_8c.html#afc19bd532855a64c021be08172065f84',1,'igmp_stop(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#afc19bd532855a64c021be08172065f84',1,'igmp_stop(struct netif *netif):&#160;igmp.c']]],
-  ['igmp_5ftmr_19',['igmp_tmr',['../igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1',1,'igmp_tmr(void):&#160;igmp.c'],['../igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1',1,'igmp_tmr(void):&#160;igmp.c']]],
-  ['inet_5fchksum_5fpbuf_20',['inet_chksum_pbuf',['../inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865',1,'inet_chksum_pbuf(struct pbuf *p):&#160;inet_chksum.c'],['../inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865',1,'inet_chksum_pbuf(struct pbuf *p):&#160;inet_chksum.c']]],
-  ['ip4_5faddr_5fisbroadcast_5fu32_21',['ip4_addr_isbroadcast_u32',['../ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421',1,'ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif):&#160;ip4_addr.c'],['../ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421',1,'ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif):&#160;ip4_addr.c']]],
-  ['ip4_5faddr_5fnetmask_5fvalid_22',['ip4_addr_netmask_valid',['../ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071',1,'ip4_addr_netmask_valid(u32_t netmask):&#160;ip4_addr.c'],['../ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071',1,'ip4_addr_netmask_valid(u32_t netmask):&#160;ip4_addr.c']]],
-  ['ip4_5ffrag_23',['ip4_frag',['../ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c',1,'ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest):&#160;ip4_frag.c'],['../ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c',1,'ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest):&#160;ip4_frag.c']]],
-  ['ip4_5finput_24',['ip4_input',['../ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b',1,'ip4_input(struct pbuf *p, struct netif *inp):&#160;ip4.c'],['../ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b',1,'ip4_input(struct pbuf *p, struct netif *inp):&#160;ip4.c']]],
-  ['ip4_5foutput_25',['ip4_output',['../ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8',1,'ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto):&#160;ip4.c'],['../ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8',1,'ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto):&#160;ip4.c']]],
-  ['ip4_5foutput_5fif_26',['ip4_output_if',['../ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917',1,'ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c'],['../ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917',1,'ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c']]],
-  ['ip4_5foutput_5fif_5fopt_27',['ip4_output_if_opt',['../ip4_8c.html#a0d912e400875396792a12ea443ecc1cf',1,'ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c'],['../ip4_8h.html#a0d912e400875396792a12ea443ecc1cf',1,'ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c']]],
-  ['ip4_5foutput_5fif_5fopt_5fsrc_28',['ip4_output_if_opt_src',['../ip4_8c.html#accd56b095730de4ad56728bfcb349940',1,'ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c'],['../ip4_8h.html#accd56b095730de4ad56728bfcb349940',1,'ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c']]],
-  ['ip4_5foutput_5fif_5fsrc_29',['ip4_output_if_src',['../ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7',1,'ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c'],['../ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7',1,'ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c']]],
-  ['ip4_5freass_30',['ip4_reass',['../ip4__frag_8c.html#aa73b0bc1e6e38c47548319af47f51052',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c'],['../ip4__frag_8h.html#aa73b0bc1e6e38c47548319af47f51052',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c']]],
-  ['ip4_5froute_31',['ip4_route',['../ip4_8c.html#a5bbbec93cef9133ed07d8c2cd9bc80f3',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#a5bbbec93cef9133ed07d8c2cd9bc80f3',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c']]],
-  ['ip4_5froute_5fsrc_32',['ip4_route_src',['../ip4_8c.html#ac04e6e67e8f0aff18dd4cf8a2439f56e',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#ac04e6e67e8f0aff18dd4cf8a2439f56e',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c']]],
-  ['ip4_5fset_5fdefault_5fmulticast_5fnetif_33',['ip4_set_default_multicast_netif',['../group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420',1,'ip4_set_default_multicast_netif(struct netif *default_multicast_netif):&#160;ip4.c'],['../group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420',1,'ip4_set_default_multicast_netif(struct netif *default_multicast_netif):&#160;ip4.c']]],
-  ['ip4addr_5faton_34',['ip4addr_aton',['../ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a',1,'ip4addr_aton(const char *cp, ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a',1,'ip4addr_aton(const char *cp, ip4_addr_t *addr):&#160;ip4_addr.c']]],
-  ['ip4addr_5fntoa_35',['ip4addr_ntoa',['../ip4__addr_8c.html#af01e406c5f44a325d779c4b4282a1744',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#af01e406c5f44a325d779c4b4282a1744',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c']]],
-  ['ip4addr_5fntoa_5fr_36',['ip4addr_ntoa_r',['../ip4__addr_8c.html#a3abcfd31a756ccc91ceef5e59216f2d4',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a3abcfd31a756ccc91ceef5e59216f2d4',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c']]],
-  ['ip6_5fchksum_5fpseudo_37',['ip6_chksum_pseudo',['../inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88',1,'ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c'],['../inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88',1,'ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c']]],
-  ['ip6_5fchksum_5fpseudo_5fpartial_38',['ip6_chksum_pseudo_partial',['../inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b',1,'ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c'],['../inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b',1,'ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c']]],
-  ['ip6_5ffrag_39',['ip6_frag',['../ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37',1,'ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest):&#160;ip6_frag.c'],['../ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37',1,'ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest):&#160;ip6_frag.c']]],
-  ['ip6_5finput_40',['ip6_input',['../ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094',1,'ip6_input(struct pbuf *p, struct netif *inp):&#160;ip6.c'],['../ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094',1,'ip6_input(struct pbuf *p, struct netif *inp):&#160;ip6.c']]],
-  ['ip6_5foptions_5fadd_5fhbh_5fra_41',['ip6_options_add_hbh_ra',['../ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e',1,'ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value):&#160;ip6.c'],['../ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e',1,'ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value):&#160;ip6.c']]],
-  ['ip6_5foutput_42',['ip6_output',['../ip6_8c.html#aec695e64536ac744e616c997deb84cda',1,'ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth):&#160;ip6.c'],['../ip6_8h.html#aec695e64536ac744e616c997deb84cda',1,'ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth):&#160;ip6.c']]],
-  ['ip6_5foutput_5fif_43',['ip6_output_if',['../ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4',1,'ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c'],['../ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4',1,'ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c']]],
-  ['ip6_5foutput_5fif_5fsrc_44',['ip6_output_if_src',['../ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56',1,'ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c'],['../ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56',1,'ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c']]],
-  ['ip6_5freass_45',['ip6_reass',['../ip6__frag_8c.html#aa29dd0a8b5622216643581f243cd423a',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c'],['../ip6__frag_8h.html#aa29dd0a8b5622216643581f243cd423a',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c']]],
-  ['ip6_5froute_46',['ip6_route',['../ip6_8c.html#a519686a2c3beb689bf1d3380c4e5efb1',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c'],['../ip6_8h.html#a519686a2c3beb689bf1d3380c4e5efb1',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c']]],
-  ['ip6_5fselect_5fsource_5faddress_47',['ip6_select_source_address',['../group__ip6.html#ga1224b474149331702ae5aec24dd14caa',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c'],['../group__ip6.html#ga1224b474149331702ae5aec24dd14caa',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c']]],
-  ['ip6addr_5faton_48',['ip6addr_aton',['../ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e',1,'ip6addr_aton(const char *cp, ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e',1,'ip6addr_aton(const char *cp, ip6_addr_t *addr):&#160;ip6_addr.c']]],
-  ['ip6addr_5fntoa_49',['ip6addr_ntoa',['../ip6__addr_8c.html#ab153e5b58a5674e5e1bacdbbc0934c44',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#ab153e5b58a5674e5e1bacdbbc0934c44',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c']]],
-  ['ip6addr_5fntoa_5fr_50',['ip6addr_ntoa_r',['../ip6__addr_8c.html#ac0470fb6b6fdbf986a20e523870e6f2e',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c'],['../ip6__addr_8h.html#ac0470fb6b6fdbf986a20e523870e6f2e',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c']]],
-  ['ip_5finput_51',['ip_input',['../group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26',1,'ip_input(struct pbuf *p, struct netif *inp):&#160;ip.c'],['../group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26',1,'ip_input(struct pbuf *p, struct netif *inp):&#160;ip.c']]],
-  ['ip_5freass_5ftmr_52',['ip_reass_tmr',['../ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88',1,'ip_reass_tmr(void):&#160;ip4_frag.c'],['../ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88',1,'ip_reass_tmr(void):&#160;ip4_frag.c']]],
-  ['ipaddr_5faddr_53',['ipaddr_addr',['../ip4__addr_8c.html#a2c05f9138da41115978409e547df9670',1,'ipaddr_addr(const char *cp):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a2c05f9138da41115978409e547df9670',1,'ipaddr_addr(const char *cp):&#160;ip4_addr.c']]],
-  ['ipaddr_5faton_54',['ipaddr_aton',['../group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151',1,'ipaddr_aton(const char *cp, ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151',1,'ipaddr_aton(const char *cp, ip_addr_t *addr):&#160;ip.c']]],
-  ['ipaddr_5fntoa_55',['ipaddr_ntoa',['../group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c']]],
-  ['ipaddr_5fntoa_5fr_56',['ipaddr_ntoa_r',['../group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c'],['../group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c']]]
+  ['http_5fset_5fcgi_5fhandlers_0',['http_set_cgi_handlers',['../group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897',1,'http_set_cgi_handlers(const tCGI *cgis, int num_handlers):&#160;httpd.c'],['../group__httpd.html#gae1ec09532ff7fc622e1860727bf2c897',1,'http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers):&#160;httpd.c']]],
+  ['http_5fset_5fssi_5fhandler_1',['http_set_ssi_handler',['../group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c',1,'http_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags):&#160;httpd.c'],['../group__httpd.html#ga8834ecb16d9a7d6c128bdf9514b7879c',1,'http_set_ssi_handler(tSSIHandler pfnSSIHandler, const char **ppcTags, int iNumTags):&#160;httpd.c']]],
+  ['httpc_5fget_5ffile_2',['httpc_get_file',['../group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b',1,'httpc_get_file(const ip_addr_t *server_addr, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c'],['../group__httpc.html#ga6c961e52cec2d25b4b82b6910ebcfa1b',1,'httpc_get_file(const ip_addr_t *server_addr, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c']]],
+  ['httpc_5fget_5ffile_5fdns_3',['httpc_get_file_dns',['../group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6',1,'httpc_get_file_dns(const char *server_name, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c'],['../group__httpc.html#gabd4ef2259885a93090733235cc0fa8d6',1,'httpc_get_file_dns(const char *server_name, u16_t port, const char *uri, const httpc_connection_t *settings, altcp_recv_fn recv_fn, void *callback_arg, httpc_state_t **connection):&#160;http_client.c']]],
+  ['httpd_5finit_4',['httpd_init',['../group__httpd.html#gac364305cee969a0be43c071722b136e6',1,'httpd_init(void):&#160;httpd.c'],['../group__httpd.html#gac364305cee969a0be43c071722b136e6',1,'httpd_init(void):&#160;httpd.c']]],
+  ['httpd_5finits_5',['httpd_inits',['../group__httpd.html#gafaedb1911a83854b1e9835132db64409',1,'httpd_inits(struct altcp_tls_config *conf):&#160;httpd.c'],['../group__httpd.html#gafaedb1911a83854b1e9835132db64409',1,'httpd_inits(struct altcp_tls_config *conf):&#160;httpd.c']]],
+  ['httpd_5fpost_5fbegin_6',['httpd_post_begin',['../group__httpd.html#ga6cb33693ee8f0c054be82a968ceff582',1,'httpd.h']]],
+  ['httpd_5fpost_5fdata_5frecved_7',['httpd_post_data_recved',['../group__httpd.html#gaca4357acf5c988b28123bc6f23540380',1,'httpd_post_data_recved(void *connection, u16_t recved_len):&#160;httpd.c'],['../group__httpd.html#gaca4357acf5c988b28123bc6f23540380',1,'httpd_post_data_recved(void *connection, u16_t recved_len):&#160;httpd.c']]],
+  ['httpd_5fpost_5ffinished_8',['httpd_post_finished',['../group__httpd.html#ga477473f7ead250fec71f1f8b9926fec5',1,'httpd.h']]],
+  ['httpd_5fpost_5freceive_5fdata_9',['httpd_post_receive_data',['../group__httpd.html#ga461409c8813c2a82ba63fde987c0e537',1,'httpd.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_6.js b/doc/doxygen/output/html/search/functions_6.js
index 7210817..ae08cb3 100644
--- a/doc/doxygen/output/html/search/functions_6.js
+++ b/doc/doxygen/output/html/search/functions_6.js
@@ -1,49 +1,60 @@
 var searchData=
 [
-  ['lowpan6_5fcalc_5fcrc_0',['lowpan6_calc_crc',['../lowpan6_8h.html#ab33dc87f30aeda871845854511de9931',1,'lowpan6_calc_crc(const void *buf, u16_t len):&#160;lowpan6.c'],['../lowpan6_8c.html#ab33dc87f30aeda871845854511de9931',1,'lowpan6_calc_crc(const void *buf, u16_t len):&#160;lowpan6.c']]],
-  ['lowpan6_5finput_1',['lowpan6_input',['../group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7',1,'lowpan6_input(struct pbuf *p, struct netif *netif):&#160;lowpan6.c'],['../group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7',1,'lowpan6_input(struct pbuf *p, struct netif *netif):&#160;lowpan6.c']]],
-  ['lowpan6_5foutput_2',['lowpan6_output',['../group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b',1,'lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6.c'],['../group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b',1,'lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6.c']]],
-  ['lowpan6_5fset_5fcontext_3',['lowpan6_set_context',['../group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94',1,'lowpan6_set_context(u8_t idx, const ip6_addr_t *context):&#160;lowpan6.c'],['../group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94',1,'lowpan6_set_context(u8_t idx, const ip6_addr_t *context):&#160;lowpan6.c']]],
-  ['lowpan6_5fset_5fpan_5fid_4',['lowpan6_set_pan_id',['../group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3',1,'lowpan6_set_pan_id(u16_t pan_id):&#160;lowpan6.c'],['../group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3',1,'lowpan6_set_pan_id(u16_t pan_id):&#160;lowpan6.c']]],
-  ['lowpan6_5fset_5fshort_5faddr_5',['lowpan6_set_short_addr',['../group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625',1,'lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low):&#160;lowpan6.c'],['../group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625',1,'lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low):&#160;lowpan6.c']]],
-  ['lowpan6_5ftmr_6',['lowpan6_tmr',['../lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7',1,'lowpan6_tmr(void):&#160;lowpan6.c'],['../lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7',1,'lowpan6_tmr(void):&#160;lowpan6.c']]],
-  ['lwip_5ffcntl_7',['lwip_fcntl',['../sockets_8c.html#ae84296093574ec746f8f88321356388f',1,'lwip_fcntl(int s, int cmd, int val):&#160;sockets.c'],['../sockets_8h.html#ae84296093574ec746f8f88321356388f',1,'lwip_fcntl(int s, int cmd, int val):&#160;sockets.c']]],
-  ['lwip_5ffreeaddrinfo_8',['lwip_freeaddrinfo',['../netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5',1,'lwip_freeaddrinfo(struct addrinfo *ai):&#160;netdb.c'],['../lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5',1,'lwip_freeaddrinfo(struct addrinfo *ai):&#160;netdb.c']]],
-  ['lwip_5fgetaddrinfo_9',['lwip_getaddrinfo',['../netdb_8c.html#af356989c172a51187e22b557f22d4165',1,'lwip_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res):&#160;netdb.c'],['../lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165',1,'lwip_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res):&#160;netdb.c']]],
-  ['lwip_5fgethostbyname_10',['lwip_gethostbyname',['../netdb_8c.html#abe6a6a103a2f6fa4e13098e455ac7bb3',1,'lwip_gethostbyname(const char *name):&#160;netdb.c'],['../lwip_2netdb_8h.html#abe6a6a103a2f6fa4e13098e455ac7bb3',1,'lwip_gethostbyname(const char *name):&#160;netdb.c']]],
-  ['lwip_5fgethostbyname_5fr_11',['lwip_gethostbyname_r',['../netdb_8c.html#afa229e90916f6c8d6308828f45351d2d',1,'lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop):&#160;netdb.c'],['../lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d',1,'lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop):&#160;netdb.c']]],
-  ['lwip_5fhtonl_12',['lwip_htonl',['../def_8c.html#a14f94347a5b9b9e3602705b75b7ae524',1,'lwip_htonl(u32_t n):&#160;def.c'],['../def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37',1,'lwip_htonl(u32_t x):&#160;def.c']]],
-  ['lwip_5fhtons_13',['lwip_htons',['../def_8c.html#ad637280639de4066392e6b5614fa3e56',1,'lwip_htons(u16_t n):&#160;def.c'],['../def_8h.html#ac49eb25570806fb51c329d4f86302cc2',1,'lwip_htons(u16_t x):&#160;def.c']]],
-  ['lwip_5fif_5findextoname_14',['lwip_if_indextoname',['../group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c'],['../group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c']]],
-  ['lwip_5fif_5fnametoindex_15',['lwip_if_nametoindex',['../group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be',1,'lwip_if_nametoindex(const char *ifname):&#160;if_api.c'],['../group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be',1,'lwip_if_nametoindex(const char *ifname):&#160;if_api.c']]],
-  ['lwip_5finit_16',['lwip_init',['../group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9',1,'lwip_init(void):&#160;init.c'],['../group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9',1,'lwip_init(void):&#160;init.c']]],
-  ['lwip_5fitoa_17',['lwip_itoa',['../group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284',1,'lwip_itoa(char *result, size_t bufsize, int number):&#160;def.c'],['../group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284',1,'lwip_itoa(char *result, size_t bufsize, int number):&#160;def.c']]],
-  ['lwip_5flisten_18',['lwip_listen',['../sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b',1,'lwip_listen(int s, int backlog):&#160;sockets.c'],['../sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b',1,'lwip_listen(int s, int backlog):&#160;sockets.c']]],
-  ['lwip_5fnetconn_5fdo_5faccepted_19',['lwip_netconn_do_accepted',['../api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5',1,'lwip_netconn_do_accepted(void *m):&#160;api_msg.c'],['../api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5',1,'lwip_netconn_do_accepted(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fbind_20',['lwip_netconn_do_bind',['../api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768',1,'lwip_netconn_do_bind(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768',1,'lwip_netconn_do_bind(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fbind_5fif_21',['lwip_netconn_do_bind_if',['../api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605',1,'lwip_netconn_do_bind_if(void *m):&#160;api_msg.c'],['../api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605',1,'lwip_netconn_do_bind_if(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fclose_22',['lwip_netconn_do_close',['../api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d',1,'lwip_netconn_do_close(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d',1,'lwip_netconn_do_close(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fconnect_23',['lwip_netconn_do_connect',['../api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902',1,'lwip_netconn_do_connect(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902',1,'lwip_netconn_do_connect(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fdelconn_24',['lwip_netconn_do_delconn',['../api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59',1,'lwip_netconn_do_delconn(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59',1,'lwip_netconn_do_delconn(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fdisconnect_25',['lwip_netconn_do_disconnect',['../api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a',1,'lwip_netconn_do_disconnect(void *m):&#160;api_msg.c'],['../api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a',1,'lwip_netconn_do_disconnect(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fgetaddr_26',['lwip_netconn_do_getaddr',['../api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163',1,'lwip_netconn_do_getaddr(void *m):&#160;api_msg.c'],['../api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163',1,'lwip_netconn_do_getaddr(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fgethostbyname_27',['lwip_netconn_do_gethostbyname',['../api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61',1,'lwip_netconn_do_gethostbyname(void *arg):&#160;api_msg.c'],['../api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61',1,'lwip_netconn_do_gethostbyname(void *arg):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fjoin_5fleave_5fgroup_28',['lwip_netconn_do_join_leave_group',['../api__msg_8c.html#a7402b52416828906a5679828cce37546',1,'lwip_netconn_do_join_leave_group(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a7402b52416828906a5679828cce37546',1,'lwip_netconn_do_join_leave_group(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fjoin_5fleave_5fgroup_5fnetif_29',['lwip_netconn_do_join_leave_group_netif',['../api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722',1,'lwip_netconn_do_join_leave_group_netif(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722',1,'lwip_netconn_do_join_leave_group_netif(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5flisten_30',['lwip_netconn_do_listen',['../api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f',1,'lwip_netconn_do_listen(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f',1,'lwip_netconn_do_listen(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fnewconn_31',['lwip_netconn_do_newconn',['../api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236',1,'lwip_netconn_do_newconn(void *m):&#160;api_msg.c'],['../api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236',1,'lwip_netconn_do_newconn(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5frecv_32',['lwip_netconn_do_recv',['../api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f',1,'lwip_netconn_do_recv(void *m):&#160;api_msg.c'],['../api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f',1,'lwip_netconn_do_recv(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fsend_33',['lwip_netconn_do_send',['../api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c',1,'lwip_netconn_do_send(void *m):&#160;api_msg.c'],['../api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c',1,'lwip_netconn_do_send(void *m):&#160;api_msg.c']]],
-  ['lwip_5fnetconn_5fdo_5fwrite_34',['lwip_netconn_do_write',['../api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c',1,'lwip_netconn_do_write(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c',1,'lwip_netconn_do_write(void *m):&#160;api_msg.c']]],
-  ['lwip_5fshutdown_35',['lwip_shutdown',['../sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1',1,'lwip_shutdown(int s, int how):&#160;sockets.c'],['../sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1',1,'lwip_shutdown(int s, int how):&#160;sockets.c']]],
-  ['lwip_5fsocket_5fthread_5fcleanup_36',['lwip_socket_thread_cleanup',['../sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7',1,'lwip_socket_thread_cleanup(void):&#160;sockets.c'],['../sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7',1,'lwip_socket_thread_cleanup(void):&#160;sockets.c']]],
-  ['lwip_5fsocket_5fthread_5finit_37',['lwip_socket_thread_init',['../sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0',1,'lwip_socket_thread_init(void):&#160;sockets.c'],['../sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0',1,'lwip_socket_thread_init(void):&#160;sockets.c']]],
-  ['lwip_5fstricmp_38',['lwip_stricmp',['../group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a',1,'lwip_stricmp(const char *str1, const char *str2):&#160;def.c'],['../group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a',1,'lwip_stricmp(const char *str1, const char *str2):&#160;def.c']]],
-  ['lwip_5fstrnicmp_39',['lwip_strnicmp',['../group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a',1,'lwip_strnicmp(const char *str1, const char *str2, size_t len):&#160;def.c'],['../group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a',1,'lwip_strnicmp(const char *str1, const char *str2, size_t len):&#160;def.c']]],
-  ['lwip_5fstrnstr_40',['lwip_strnstr',['../group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c'],['../group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c']]],
-  ['lwiperf_5fabort_41',['lwiperf_abort',['../group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004',1,'lwiperf_abort(void *lwiperf_session):&#160;lwiperf.c'],['../group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004',1,'lwiperf_abort(void *lwiperf_session):&#160;lwiperf.c']]],
-  ['lwiperf_5fstart_5ftcp_5fclient_42',['lwiperf_start_tcp_client',['../group__iperf.html#ga1088722d967f0f465d45fd3b15dde445',1,'lwiperf_start_tcp_client(const ip_addr_t *remote_addr, u16_t remote_port, enum lwiperf_client_type type, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga1088722d967f0f465d45fd3b15dde445',1,'lwiperf_start_tcp_client(const ip_addr_t *remote_addr, u16_t remote_port, enum lwiperf_client_type type, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
-  ['lwiperf_5fstart_5ftcp_5fclient_5fdefault_43',['lwiperf_start_tcp_client_default',['../group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456',1,'lwiperf_start_tcp_client_default(const ip_addr_t *remote_addr, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456',1,'lwiperf_start_tcp_client_default(const ip_addr_t *remote_addr, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
-  ['lwiperf_5fstart_5ftcp_5fserver_44',['lwiperf_start_tcp_server',['../group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec',1,'lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec',1,'lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
-  ['lwiperf_5fstart_5ftcp_5fserver_5fdefault_45',['lwiperf_start_tcp_server_default',['../group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]]
+  ['icmp6_5fdest_5funreach_0',['icmp6_dest_unreach',['../icmp6_8c.html#ab480867394952904b5607d62315bdbac',1,'icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c):&#160;icmp6.c'],['../icmp6_8h.html#ab480867394952904b5607d62315bdbac',1,'icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c):&#160;icmp6.c']]],
+  ['icmp6_5finput_1',['icmp6_input',['../icmp6_8c.html#a94bec819e11f51c8088ca338f2e36c3d',1,'icmp6_input(struct pbuf *p, struct netif *inp):&#160;icmp6.c'],['../icmp6_8h.html#a94bec819e11f51c8088ca338f2e36c3d',1,'icmp6_input(struct pbuf *p, struct netif *inp):&#160;icmp6.c']]],
+  ['icmp6_5fpacket_5ftoo_5fbig_2',['icmp6_packet_too_big',['../icmp6_8c.html#a3c0a84e0944263d92c9dc3ad094ffcb0',1,'icmp6_packet_too_big(struct pbuf *p, u32_t mtu):&#160;icmp6.c'],['../icmp6_8h.html#a3c0a84e0944263d92c9dc3ad094ffcb0',1,'icmp6_packet_too_big(struct pbuf *p, u32_t mtu):&#160;icmp6.c']]],
+  ['icmp6_5fparam_5fproblem_3',['icmp6_param_problem',['../icmp6_8c.html#a6094fa333b2cbf1b1b062e72313ef146',1,'icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, const void *pointer):&#160;icmp6.c'],['../icmp6_8h.html#a6094fa333b2cbf1b1b062e72313ef146',1,'icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, const void *pointer):&#160;icmp6.c']]],
+  ['icmp6_5ftime_5fexceeded_4',['icmp6_time_exceeded',['../icmp6_8c.html#a358abb6555f6ca6b2b2b1412c9117bec',1,'icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c):&#160;icmp6.c'],['../icmp6_8h.html#a358abb6555f6ca6b2b2b1412c9117bec',1,'icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c):&#160;icmp6.c']]],
+  ['icmp6_5ftime_5fexceeded_5fwith_5faddrs_5',['icmp6_time_exceeded_with_addrs',['../icmp6_8c.html#ad01e5bc4690a2c6aeb534237a5a9b593',1,'icmp6_time_exceeded_with_addrs(struct pbuf *p, enum icmp6_te_code c, const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr):&#160;icmp6.c'],['../icmp6_8h.html#ad01e5bc4690a2c6aeb534237a5a9b593',1,'icmp6_time_exceeded_with_addrs(struct pbuf *p, enum icmp6_te_code c, const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr):&#160;icmp6.c']]],
+  ['icmp_5fdest_5funreach_6',['icmp_dest_unreach',['../icmp_8c.html#ae26c59eab4ce553964a0c9d43f534d06',1,'icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t):&#160;icmp.c'],['../icmp_8h.html#ae26c59eab4ce553964a0c9d43f534d06',1,'icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t):&#160;icmp.c']]],
+  ['icmp_5finput_7',['icmp_input',['../icmp_8c.html#ac929e48a1dddf98050b73a2633fcaef1',1,'icmp_input(struct pbuf *p, struct netif *inp):&#160;icmp.c'],['../icmp_8h.html#ac929e48a1dddf98050b73a2633fcaef1',1,'icmp_input(struct pbuf *p, struct netif *inp):&#160;icmp.c']]],
+  ['icmp_5ftime_5fexceeded_8',['icmp_time_exceeded',['../icmp_8c.html#a49723e5e11c4bbc86197e58fdca7c119',1,'icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t):&#160;icmp.c'],['../icmp_8h.html#a49723e5e11c4bbc86197e58fdca7c119',1,'icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t):&#160;icmp.c']]],
+  ['igmp_5finit_9',['igmp_init',['../igmp_8c.html#aeb8103aa3091e35c966f0894fb54a2c8',1,'igmp_init(void):&#160;igmp.c'],['../igmp_8h.html#aeb8103aa3091e35c966f0894fb54a2c8',1,'igmp_init(void):&#160;igmp.c']]],
+  ['igmp_5finput_10',['igmp_input',['../igmp_8c.html#a065685cc25f2cc50f0d9659f4b086e1a',1,'igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest):&#160;igmp.c'],['../igmp_8h.html#a065685cc25f2cc50f0d9659f4b086e1a',1,'igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest):&#160;igmp.c']]],
+  ['igmp_5fjoingroup_11',['igmp_joingroup',['../group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6',1,'igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#gac989949e9cf84dbd08ab071854bd1ba6',1,'igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
+  ['igmp_5fjoingroup_5fnetif_12',['igmp_joingroup_netif',['../group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6',1,'igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga7a6d36dd7b4c8a8c2790c0eac53b49d6',1,'igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
+  ['igmp_5fleavegroup_13',['igmp_leavegroup',['../group__igmp.html#ga21c572ba7481ca41eb873923a5346544',1,'igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga21c572ba7481ca41eb873923a5346544',1,'igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
+  ['igmp_5fleavegroup_5fnetif_14',['igmp_leavegroup_netif',['../group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201',1,'igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c'],['../group__igmp.html#ga651bec2a5f3a24766c52aa86a5d88201',1,'igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr):&#160;igmp.c']]],
+  ['igmp_5flookfor_5fgroup_15',['igmp_lookfor_group',['../igmp_8c.html#a695bd07cc4997aedb871b83456e18890',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c'],['../igmp_8h.html#a695bd07cc4997aedb871b83456e18890',1,'igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr):&#160;igmp.c']]],
+  ['igmp_5freport_5fgroups_16',['igmp_report_groups',['../igmp_8c.html#af06eeba0e984aab4a67a836eab577726',1,'igmp_report_groups(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#af06eeba0e984aab4a67a836eab577726',1,'igmp_report_groups(struct netif *netif):&#160;igmp.c']]],
+  ['igmp_5fstart_17',['igmp_start',['../igmp_8c.html#aac0fe91a589ba90b3f76e69cebf264f6',1,'igmp_start(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#aac0fe91a589ba90b3f76e69cebf264f6',1,'igmp_start(struct netif *netif):&#160;igmp.c']]],
+  ['igmp_5fstop_18',['igmp_stop',['../igmp_8c.html#afc19bd532855a64c021be08172065f84',1,'igmp_stop(struct netif *netif):&#160;igmp.c'],['../igmp_8h.html#afc19bd532855a64c021be08172065f84',1,'igmp_stop(struct netif *netif):&#160;igmp.c']]],
+  ['igmp_5ftmr_19',['igmp_tmr',['../igmp_8c.html#a4418a22d37098f05d0c2fcfe288d0ca1',1,'igmp_tmr(void):&#160;igmp.c'],['../igmp_8h.html#a4418a22d37098f05d0c2fcfe288d0ca1',1,'igmp_tmr(void):&#160;igmp.c']]],
+  ['inet_5fchksum_5fpbuf_20',['inet_chksum_pbuf',['../inet__chksum_8c.html#ab35967a50418358e194e8f80fdc3c865',1,'inet_chksum_pbuf(struct pbuf *p):&#160;inet_chksum.c'],['../inet__chksum_8h.html#ab35967a50418358e194e8f80fdc3c865',1,'inet_chksum_pbuf(struct pbuf *p):&#160;inet_chksum.c']]],
+  ['ip4_5faddr_5fisbroadcast_5fu32_21',['ip4_addr_isbroadcast_u32',['../ip4__addr_8c.html#ab3cd7e7fba28c29d35f3c17461071421',1,'ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif):&#160;ip4_addr.c'],['../ip4__addr_8h.html#ab3cd7e7fba28c29d35f3c17461071421',1,'ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif):&#160;ip4_addr.c']]],
+  ['ip4_5faddr_5fnetmask_5fvalid_22',['ip4_addr_netmask_valid',['../ip4__addr_8c.html#ab5810d404b0ad1b89ef1323ea1e78071',1,'ip4_addr_netmask_valid(u32_t netmask):&#160;ip4_addr.c'],['../ip4__addr_8h.html#ab5810d404b0ad1b89ef1323ea1e78071',1,'ip4_addr_netmask_valid(u32_t netmask):&#160;ip4_addr.c']]],
+  ['ip4_5ffrag_23',['ip4_frag',['../ip4__frag_8c.html#a70872fd4c7aefec6b4eef0707e1a371c',1,'ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest):&#160;ip4_frag.c'],['../ip4__frag_8h.html#a70872fd4c7aefec6b4eef0707e1a371c',1,'ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest):&#160;ip4_frag.c']]],
+  ['ip4_5finput_24',['ip4_input',['../ip4_8c.html#aff1f784c9f05f3d79cc1a921d840501b',1,'ip4_input(struct pbuf *p, struct netif *inp):&#160;ip4.c'],['../ip4_8h.html#aff1f784c9f05f3d79cc1a921d840501b',1,'ip4_input(struct pbuf *p, struct netif *inp):&#160;ip4.c']]],
+  ['ip4_5foutput_25',['ip4_output',['../ip4_8c.html#ac87d296205eb5ac04058e609672d4ba8',1,'ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto):&#160;ip4.c'],['../ip4_8h.html#ac87d296205eb5ac04058e609672d4ba8',1,'ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto):&#160;ip4.c']]],
+  ['ip4_5foutput_5fif_26',['ip4_output_if',['../ip4_8c.html#ab220bc4ce4f48bdbba447358b3594917',1,'ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c'],['../ip4_8h.html#ab220bc4ce4f48bdbba447358b3594917',1,'ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c']]],
+  ['ip4_5foutput_5fif_5fopt_27',['ip4_output_if_opt',['../ip4_8c.html#a0d912e400875396792a12ea443ecc1cf',1,'ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c'],['../ip4_8h.html#a0d912e400875396792a12ea443ecc1cf',1,'ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c']]],
+  ['ip4_5foutput_5fif_5fopt_5fsrc_28',['ip4_output_if_opt_src',['../ip4_8c.html#accd56b095730de4ad56728bfcb349940',1,'ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c'],['../ip4_8h.html#accd56b095730de4ad56728bfcb349940',1,'ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, u16_t optlen):&#160;ip4.c']]],
+  ['ip4_5foutput_5fif_5fsrc_29',['ip4_output_if_src',['../ip4_8c.html#a2943d118873e9eb1d8296e04a6740db7',1,'ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c'],['../ip4_8h.html#a2943d118873e9eb1d8296e04a6740db7',1,'ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif):&#160;ip4.c']]],
+  ['ip4_5freass_30',['ip4_reass',['../ip4__frag_8c.html#aa73b0bc1e6e38c47548319af47f51052',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c'],['../ip4__frag_8h.html#aa73b0bc1e6e38c47548319af47f51052',1,'ip4_reass(struct pbuf *p):&#160;ip4_frag.c']]],
+  ['ip4_5froute_31',['ip4_route',['../ip4_8c.html#a5bbbec93cef9133ed07d8c2cd9bc80f3',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#a5bbbec93cef9133ed07d8c2cd9bc80f3',1,'ip4_route(const ip4_addr_t *dest):&#160;ip4.c']]],
+  ['ip4_5froute_5fsrc_32',['ip4_route_src',['../ip4_8c.html#ac04e6e67e8f0aff18dd4cf8a2439f56e',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c'],['../ip4_8h.html#ac04e6e67e8f0aff18dd4cf8a2439f56e',1,'ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest):&#160;ip4.c']]],
+  ['ip4_5fset_5fdefault_5fmulticast_5fnetif_33',['ip4_set_default_multicast_netif',['../group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420',1,'ip4_set_default_multicast_netif(struct netif *default_multicast_netif):&#160;ip4.c'],['../group__ip4.html#ga6ae67c86aa82dccac5df81d93de00420',1,'ip4_set_default_multicast_netif(struct netif *default_multicast_netif):&#160;ip4.c']]],
+  ['ip4addr_5faton_34',['ip4addr_aton',['../ip4__addr_8c.html#af66de98501e92c66714d58119b6d9e1a',1,'ip4addr_aton(const char *cp, ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#af66de98501e92c66714d58119b6d9e1a',1,'ip4addr_aton(const char *cp, ip4_addr_t *addr):&#160;ip4_addr.c']]],
+  ['ip4addr_5fntoa_35',['ip4addr_ntoa',['../ip4__addr_8c.html#af01e406c5f44a325d779c4b4282a1744',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c'],['../ip4__addr_8h.html#af01e406c5f44a325d779c4b4282a1744',1,'ip4addr_ntoa(const ip4_addr_t *addr):&#160;ip4_addr.c']]],
+  ['ip4addr_5fntoa_5fr_36',['ip4addr_ntoa_r',['../ip4__addr_8c.html#a3abcfd31a756ccc91ceef5e59216f2d4',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a3abcfd31a756ccc91ceef5e59216f2d4',1,'ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen):&#160;ip4_addr.c']]],
+  ['ip6_5fchksum_5fpseudo_37',['ip6_chksum_pseudo',['../inet__chksum_8c.html#a102544bca5912c78649e25a45a7d0a88',1,'ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c'],['../inet__chksum_8h.html#a102544bca5912c78649e25a45a7d0a88',1,'ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c']]],
+  ['ip6_5fchksum_5fpseudo_5fpartial_38',['ip6_chksum_pseudo_partial',['../inet__chksum_8c.html#ae4218e08510fd92c9a699c4e5d9fc17b',1,'ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c'],['../inet__chksum_8h.html#ae4218e08510fd92c9a699c4e5d9fc17b',1,'ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest):&#160;inet_chksum.c']]],
+  ['ip6_5ffrag_39',['ip6_frag',['../ip6__frag_8c.html#a3ef87acbc615d5eb015104f83bbe7d37',1,'ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest):&#160;ip6_frag.c'],['../ip6__frag_8h.html#a3ef87acbc615d5eb015104f83bbe7d37',1,'ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest):&#160;ip6_frag.c']]],
+  ['ip6_5finput_40',['ip6_input',['../ip6_8c.html#a6bbbae5ea37a82c746dba2feb1abd094',1,'ip6_input(struct pbuf *p, struct netif *inp):&#160;ip6.c'],['../ip6_8h.html#a6bbbae5ea37a82c746dba2feb1abd094',1,'ip6_input(struct pbuf *p, struct netif *inp):&#160;ip6.c']]],
+  ['ip6_5foptions_5fadd_5fhbh_5fra_41',['ip6_options_add_hbh_ra',['../ip6_8c.html#a7a8d47200bb6ccbec329be8f0979853e',1,'ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value):&#160;ip6.c'],['../ip6_8h.html#a7a8d47200bb6ccbec329be8f0979853e',1,'ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value):&#160;ip6.c']]],
+  ['ip6_5foutput_42',['ip6_output',['../ip6_8c.html#aec695e64536ac744e616c997deb84cda',1,'ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth):&#160;ip6.c'],['../ip6_8h.html#aec695e64536ac744e616c997deb84cda',1,'ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth):&#160;ip6.c']]],
+  ['ip6_5foutput_5fif_43',['ip6_output_if',['../ip6_8c.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4',1,'ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c'],['../ip6_8h.html#aeb1c9967e7ae7d7ba71b68256ff6fdb4',1,'ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c']]],
+  ['ip6_5foutput_5fif_5fsrc_44',['ip6_output_if_src',['../ip6_8c.html#a58bd3c9ce332731fac82b89c77be4f56',1,'ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c'],['../ip6_8h.html#a58bd3c9ce332731fac82b89c77be4f56',1,'ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif):&#160;ip6.c']]],
+  ['ip6_5freass_45',['ip6_reass',['../ip6__frag_8c.html#aa29dd0a8b5622216643581f243cd423a',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c'],['../ip6__frag_8h.html#aa29dd0a8b5622216643581f243cd423a',1,'ip6_reass(struct pbuf *p):&#160;ip6_frag.c']]],
+  ['ip6_5froute_46',['ip6_route',['../ip6_8c.html#a519686a2c3beb689bf1d3380c4e5efb1',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c'],['../ip6_8h.html#a519686a2c3beb689bf1d3380c4e5efb1',1,'ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest):&#160;ip6.c']]],
+  ['ip6_5fselect_5fsource_5faddress_47',['ip6_select_source_address',['../group__ip6.html#ga1224b474149331702ae5aec24dd14caa',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c'],['../group__ip6.html#ga1224b474149331702ae5aec24dd14caa',1,'ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest):&#160;ip6.c']]],
+  ['ip6addr_5faton_48',['ip6addr_aton',['../ip6__addr_8c.html#a3f555ae302eb056f28f6cb266a27036e',1,'ip6addr_aton(const char *cp, ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#a3f555ae302eb056f28f6cb266a27036e',1,'ip6addr_aton(const char *cp, ip6_addr_t *addr):&#160;ip6_addr.c']]],
+  ['ip6addr_5fntoa_49',['ip6addr_ntoa',['../ip6__addr_8c.html#ab153e5b58a5674e5e1bacdbbc0934c44',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c'],['../ip6__addr_8h.html#ab153e5b58a5674e5e1bacdbbc0934c44',1,'ip6addr_ntoa(const ip6_addr_t *addr):&#160;ip6_addr.c']]],
+  ['ip6addr_5fntoa_5fr_50',['ip6addr_ntoa_r',['../ip6__addr_8c.html#ac0470fb6b6fdbf986a20e523870e6f2e',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c'],['../ip6__addr_8h.html#ac0470fb6b6fdbf986a20e523870e6f2e',1,'ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen):&#160;ip6_addr.c']]],
+  ['ip_5finput_51',['ip_input',['../group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26',1,'ip_input(struct pbuf *p, struct netif *inp):&#160;ip.c'],['../group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26',1,'ip_input(struct pbuf *p, struct netif *inp):&#160;ip.c']]],
+  ['ip_5freass_5ftmr_52',['ip_reass_tmr',['../ip4__frag_8c.html#abc7017eb20983f372e81de7376ebec88',1,'ip_reass_tmr(void):&#160;ip4_frag.c'],['../ip4__frag_8h.html#abc7017eb20983f372e81de7376ebec88',1,'ip_reass_tmr(void):&#160;ip4_frag.c']]],
+  ['ipaddr_5faddr_53',['ipaddr_addr',['../ip4__addr_8c.html#a2c05f9138da41115978409e547df9670',1,'ipaddr_addr(const char *cp):&#160;ip4_addr.c'],['../ip4__addr_8h.html#a2c05f9138da41115978409e547df9670',1,'ipaddr_addr(const char *cp):&#160;ip4_addr.c']]],
+  ['ipaddr_5faton_54',['ipaddr_aton',['../group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151',1,'ipaddr_aton(const char *cp, ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#ga4de70fdd7fd36c5b6eaed8b855d5f151',1,'ipaddr_aton(const char *cp, ip_addr_t *addr):&#160;ip.c']]],
+  ['ipaddr_5fntoa_55',['ipaddr_ntoa',['../group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c'],['../group__ipaddr.html#gaac2dcc0e35eb5cf6df9c47ba3c3cdeef',1,'ipaddr_ntoa(const ip_addr_t *addr):&#160;ip.c']]],
+  ['ipaddr_5fntoa_5fr_56',['ipaddr_ntoa_r',['../group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c'],['../group__ipaddr.html#ga1c8c13cc2feeb04ccf7ab1d592c47b04',1,'ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen):&#160;ip.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_7.js b/doc/doxygen/output/html/search/functions_7.js
index cd381bc..d851755 100644
--- a/doc/doxygen/output/html/search/functions_7.js
+++ b/doc/doxygen/output/html/search/functions_7.js
@@ -1,47 +1,50 @@
 var searchData=
 [
-  ['mdns_5fcompress_5fdomain_0',['mdns_compress_domain',['../mdns_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e',1,'mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain):&#160;mdns.c'],['../mdns__priv_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e',1,'mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain):&#160;mdns.c']]],
-  ['mdns_5fdomain_5fadd_5flabel_1',['mdns_domain_add_label',['../mdns_8c.html#a17db69fa887515374452b945e959bbf9',1,'mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len):&#160;mdns.c'],['../mdns__priv_8h.html#a17db69fa887515374452b945e959bbf9',1,'mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len):&#160;mdns.c']]],
-  ['mdns_5fdomain_5feq_2',['mdns_domain_eq',['../mdns_8c.html#a52d8f70432ae998814f16b18431213cd',1,'mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b):&#160;mdns.c'],['../mdns__priv_8h.html#a52d8f70432ae998814f16b18431213cd',1,'mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b):&#160;mdns.c']]],
-  ['mdns_5freadname_3',['mdns_readname',['../mdns_8c.html#ab5f49d9356a76879e0e6a14eb0643b23',1,'mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain):&#160;mdns.c'],['../mdns__priv_8h.html#ab5f49d9356a76879e0e6a14eb0643b23',1,'mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain):&#160;mdns.c']]],
-  ['mdns_5fresp_5fadd_5fnetif_4',['mdns_resp_add_netif',['../group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb',1,'mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl):&#160;mdns.c'],['../group__mdns.html#gaa619ac8f46a4b4021195720f0355cbeb',1,'mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl):&#160;mdns.c']]],
-  ['mdns_5fresp_5fadd_5fservice_5',['mdns_resp_add_service',['../group__mdns.html#ga824e992e94be216c8e059f48f49a59ce',1,'mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_data):&#160;mdns.c'],['../group__mdns.html#ga824e992e94be216c8e059f48f49a59ce',1,'mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_userdata):&#160;mdns.c']]],
-  ['mdns_5fresp_5fadd_5fservice_5ftxtitem_6',['mdns_resp_add_service_txtitem',['../group__mdns.html#ga01c85202f4b85edc8b571f2f419db576',1,'mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len):&#160;mdns.c'],['../group__mdns.html#ga01c85202f4b85edc8b571f2f419db576',1,'mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len):&#160;mdns.c']]],
-  ['mdns_5fresp_5fannounce_7',['mdns_resp_announce',['../group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85',1,'mdns_resp_announce(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85',1,'mdns_resp_announce(struct netif *netif):&#160;mdns.c']]],
-  ['mdns_5fresp_5fdel_5fservice_8',['mdns_resp_del_service',['../group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad',1,'mdns_resp_del_service(struct netif *netif, s8_t slot):&#160;mdns.c'],['../group__mdns.html#ga3df2ae751cdfdffb0a567390940eb8ad',1,'mdns_resp_del_service(struct netif *netif, s8_t slot):&#160;mdns.c']]],
-  ['mdns_5fresp_5finit_9',['mdns_resp_init',['../group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3',1,'mdns_resp_init(void):&#160;mdns.c'],['../group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3',1,'mdns_resp_init(void):&#160;mdns.c']]],
-  ['mdns_5fresp_5fregister_5fname_5fresult_5fcb_10',['mdns_resp_register_name_result_cb',['../mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1',1,'mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb):&#160;mdns.c'],['../mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1',1,'mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb):&#160;mdns.c']]],
-  ['mdns_5fresp_5fremove_5fnetif_11',['mdns_resp_remove_netif',['../group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c',1,'mdns_resp_remove_netif(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c',1,'mdns_resp_remove_netif(struct netif *netif):&#160;mdns.c']]],
-  ['mdns_5fresp_5frename_5fnetif_12',['mdns_resp_rename_netif',['../group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e',1,'mdns_resp_rename_netif(struct netif *netif, const char *hostname):&#160;mdns.c'],['../group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e',1,'mdns_resp_rename_netif(struct netif *netif, const char *hostname):&#160;mdns.c']]],
-  ['mdns_5fresp_5frename_5fservice_13',['mdns_resp_rename_service',['../group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9',1,'mdns_resp_rename_service(struct netif *netif, s8_t slot, const char *name):&#160;mdns.c'],['../group__mdns.html#gaf273897059f1bbddc74cfcb820777dd9',1,'mdns_resp_rename_service(struct netif *netif, s8_t slot, const char *name):&#160;mdns.c']]],
-  ['mdns_5fresp_5frestart_14',['mdns_resp_restart',['../group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a',1,'mdns_resp_restart(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a',1,'mdns_resp_restart(struct netif *netif):&#160;mdns.c']]],
-  ['mem_5fcalloc_15',['mem_calloc',['../mem_8c.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c'],['../mem_8h.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c']]],
-  ['mem_5ffree_16',['mem_free',['../mem_8c.html#a65169147c44e9db60d997819af9b455c',1,'mem_free(void *rmem):&#160;mem.c'],['../mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a',1,'mem_free(void *mem):&#160;mem.c']]],
-  ['mem_5ffree_5fcallback_17',['mem_free_callback',['../tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c',1,'mem_free_callback(void *m):&#160;tcpip.c'],['../tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c',1,'mem_free_callback(void *m):&#160;tcpip.c']]],
-  ['mem_5finit_18',['mem_init',['../mem_8c.html#a44a136e3b70c36abb6f8dc060c778113',1,'mem_init(void):&#160;mem.c'],['../mem_8h.html#a44a136e3b70c36abb6f8dc060c778113',1,'mem_init(void):&#160;mem.c']]],
-  ['mem_5fmalloc_19',['mem_malloc',['../mem_8c.html#ae2190f95ae9c46bb99ec0be4f4e4e5e4',1,'mem_malloc(mem_size_t size_in):&#160;mem.c'],['../mem_8h.html#a52ce222aebe4b7dce7f25cd536b6e650',1,'mem_malloc(mem_size_t size):&#160;mem.c']]],
-  ['mem_5ftrim_20',['mem_trim',['../mem_8c.html#ab0915b39bd096766771ef4cf719bfb40',1,'mem_trim(void *rmem, mem_size_t new_size):&#160;mem.c'],['../mem_8h.html#a2ba2d1e6fc284b1850eedb673eba96b0',1,'mem_trim(void *mem, mem_size_t size):&#160;mem.c']]],
-  ['memp_5ffree_21',['memp_free',['../memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f',1,'memp_free(memp_t type, void *mem):&#160;memp.c'],['../memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f',1,'memp_free(memp_t type, void *mem):&#160;memp.c']]],
-  ['memp_5ffree_5fpool_22',['memp_free_pool',['../memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5',1,'memp_free_pool(const struct memp_desc *desc, void *mem):&#160;memp.c'],['../memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5',1,'memp_free_pool(const struct memp_desc *desc, void *mem):&#160;memp.c']]],
-  ['memp_5finit_23',['memp_init',['../memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2',1,'memp_init(void):&#160;memp.c'],['../memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2',1,'memp_init(void):&#160;memp.c']]],
-  ['memp_5finit_5fpool_24',['memp_init_pool',['../memp_8c.html#a6416303426d05526bed33f241fa6ecd7',1,'memp_init_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7',1,'memp_init_pool(const struct memp_desc *desc):&#160;memp.c']]],
-  ['memp_5fmalloc_25',['memp_malloc',['../memp_8c.html#ac49689457203bfb872adf5428f96a3e7',1,'memp_malloc(memp_t type):&#160;memp.c'],['../memp_8h.html#ac49689457203bfb872adf5428f96a3e7',1,'memp_malloc(memp_t type):&#160;memp.c']]],
-  ['memp_5fmalloc_5fpool_26',['memp_malloc_pool',['../memp_8c.html#ab6bfb9562c3a77e329a888e59ef0ace3',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#ab6bfb9562c3a77e329a888e59ef0ace3',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c']]],
-  ['mld6_5finput_27',['mld6_input',['../mld6_8c.html#a7c190ca25432d466b28f607c3574a841',1,'mld6_input(struct pbuf *p, struct netif *inp):&#160;mld6.c'],['../mld6_8h.html#a7c190ca25432d466b28f607c3574a841',1,'mld6_input(struct pbuf *p, struct netif *inp):&#160;mld6.c']]],
-  ['mld6_5fjoingroup_28',['mld6_joingroup',['../group__mld6.html#ga53560ab6e47163e4888070830bf912a8',1,'mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga53560ab6e47163e4888070830bf912a8',1,'mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
-  ['mld6_5fjoingroup_5fnetif_29',['mld6_joingroup_netif',['../group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940',1,'mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940',1,'mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
-  ['mld6_5fleavegroup_30',['mld6_leavegroup',['../group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5',1,'mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5',1,'mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
-  ['mld6_5fleavegroup_5fnetif_31',['mld6_leavegroup_netif',['../group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22',1,'mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22',1,'mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
-  ['mld6_5flookfor_5fgroup_32',['mld6_lookfor_group',['../mld6_8c.html#a496197eef3f8b4c2a0fd49734aee07d6',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c'],['../mld6_8h.html#a496197eef3f8b4c2a0fd49734aee07d6',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c']]],
-  ['mld6_5freport_5fgroups_33',['mld6_report_groups',['../mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686',1,'mld6_report_groups(struct netif *netif):&#160;mld6.c'],['../mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686',1,'mld6_report_groups(struct netif *netif):&#160;mld6.c']]],
-  ['mld6_5fstop_34',['mld6_stop',['../mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198',1,'mld6_stop(struct netif *netif):&#160;mld6.c'],['../mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198',1,'mld6_stop(struct netif *netif):&#160;mld6.c']]],
-  ['mld6_5ftmr_35',['mld6_tmr',['../mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274',1,'mld6_tmr(void):&#160;mld6.c'],['../mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274',1,'mld6_tmr(void):&#160;mld6.c']]],
-  ['mqtt_5fclient_5fconnect_36',['mqtt_client_connect',['../group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0',1,'mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, mqtt_connection_cb_t cb, void *arg, const struct mqtt_connect_client_info_t *client_info):&#160;mqtt.c'],['../group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0',1,'mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ipaddr, u16_t port, mqtt_connection_cb_t cb, void *arg, const struct mqtt_connect_client_info_t *client_info):&#160;mqtt.c']]],
-  ['mqtt_5fclient_5ffree_37',['mqtt_client_free',['../group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882',1,'mqtt_client_free(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882',1,'mqtt_client_free(mqtt_client_t *client):&#160;mqtt.c']]],
-  ['mqtt_5fclient_5fis_5fconnected_38',['mqtt_client_is_connected',['../group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5',1,'mqtt_client_is_connected(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5',1,'mqtt_client_is_connected(mqtt_client_t *client):&#160;mqtt.c']]],
-  ['mqtt_5fclient_5fnew_39',['mqtt_client_new',['../group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7',1,'mqtt_client_new(void):&#160;mqtt.c'],['../group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7',1,'mqtt_client_new(void):&#160;mqtt.c']]],
-  ['mqtt_5fdisconnect_40',['mqtt_disconnect',['../group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6',1,'mqtt_disconnect(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6',1,'mqtt_disconnect(mqtt_client_t *client):&#160;mqtt.c']]],
-  ['mqtt_5fpublish_41',['mqtt_publish',['../group__mqtt.html#gade9850d716e81fde572cb012be795d2f',1,'mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, mqtt_request_cb_t cb, void *arg):&#160;mqtt.c'],['../group__mqtt.html#gade9850d716e81fde572cb012be795d2f',1,'mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, mqtt_request_cb_t cb, void *arg):&#160;mqtt.c']]],
-  ['mqtt_5fset_5finpub_5fcallback_42',['mqtt_set_inpub_callback',['../group__mqtt.html#gafdfa0e65b217e92835d35858924565cf',1,'mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb, mqtt_incoming_data_cb_t data_cb, void *arg):&#160;mqtt.c'],['../group__mqtt.html#gafdfa0e65b217e92835d35858924565cf',1,'mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t, mqtt_incoming_data_cb_t data_cb, void *arg):&#160;mqtt.c']]],
-  ['mqtt_5fsub_5funsub_43',['mqtt_sub_unsub',['../group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103',1,'mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub):&#160;mqtt.c'],['../group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103',1,'mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub):&#160;mqtt.c']]]
+  ['lowpan6_5fcalc_5fcrc_0',['lowpan6_calc_crc',['../lowpan6_8h.html#ab33dc87f30aeda871845854511de9931',1,'lowpan6_calc_crc(const void *buf, u16_t len):&#160;lowpan6.c'],['../lowpan6_8c.html#ab33dc87f30aeda871845854511de9931',1,'lowpan6_calc_crc(const void *buf, u16_t len):&#160;lowpan6.c']]],
+  ['lowpan6_5finput_1',['lowpan6_input',['../group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7',1,'lowpan6_input(struct pbuf *p, struct netif *netif):&#160;lowpan6.c'],['../group__sixlowpan.html#ga3c943da6f9d3f1096bdcebe3e19d38b7',1,'lowpan6_input(struct pbuf *p, struct netif *netif):&#160;lowpan6.c']]],
+  ['lowpan6_5foutput_2',['lowpan6_output',['../group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b',1,'lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6.c'],['../group__sixlowpan.html#ga9e650551777ededccf035ef9aaee247b',1,'lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6.c']]],
+  ['lowpan6_5fset_5fcontext_3',['lowpan6_set_context',['../group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94',1,'lowpan6_set_context(u8_t idx, const ip6_addr_t *context):&#160;lowpan6.c'],['../group__sixlowpan.html#ga94c6d289bc25a14fd0fee9230ae3af94',1,'lowpan6_set_context(u8_t idx, const ip6_addr_t *context):&#160;lowpan6.c']]],
+  ['lowpan6_5fset_5fpan_5fid_4',['lowpan6_set_pan_id',['../group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3',1,'lowpan6_set_pan_id(u16_t pan_id):&#160;lowpan6.c'],['../group__sixlowpan.html#gade00524e85d37a3521ea85359f801df3',1,'lowpan6_set_pan_id(u16_t pan_id):&#160;lowpan6.c']]],
+  ['lowpan6_5fset_5fshort_5faddr_5',['lowpan6_set_short_addr',['../group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625',1,'lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low):&#160;lowpan6.c'],['../group__sixlowpan.html#gafee5495843dfb36cb77ba2f16ea6a625',1,'lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low):&#160;lowpan6.c']]],
+  ['lowpan6_5ftmr_6',['lowpan6_tmr',['../lowpan6_8h.html#ac8c3a4612aeb23f65e55c18faf5ad7d7',1,'lowpan6_tmr(void):&#160;lowpan6.c'],['../lowpan6_8c.html#ac8c3a4612aeb23f65e55c18faf5ad7d7',1,'lowpan6_tmr(void):&#160;lowpan6.c']]],
+  ['lwip_5ffcntl_7',['lwip_fcntl',['../sockets_8c.html#ae84296093574ec746f8f88321356388f',1,'lwip_fcntl(int s, int cmd, int val):&#160;sockets.c'],['../sockets_8h.html#ae84296093574ec746f8f88321356388f',1,'lwip_fcntl(int s, int cmd, int val):&#160;sockets.c']]],
+  ['lwip_5ffreeaddrinfo_8',['lwip_freeaddrinfo',['../netdb_8c.html#a7f65ff5982a0743849a644ef2cd15ef5',1,'lwip_freeaddrinfo(struct addrinfo *ai):&#160;netdb.c'],['../lwip_2netdb_8h.html#a7f65ff5982a0743849a644ef2cd15ef5',1,'lwip_freeaddrinfo(struct addrinfo *ai):&#160;netdb.c']]],
+  ['lwip_5fgetaddrinfo_9',['lwip_getaddrinfo',['../netdb_8c.html#af356989c172a51187e22b557f22d4165',1,'lwip_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res):&#160;netdb.c'],['../lwip_2netdb_8h.html#af356989c172a51187e22b557f22d4165',1,'lwip_getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res):&#160;netdb.c']]],
+  ['lwip_5fgethostbyname_10',['lwip_gethostbyname',['../netdb_8c.html#abe6a6a103a2f6fa4e13098e455ac7bb3',1,'lwip_gethostbyname(const char *name):&#160;netdb.c'],['../lwip_2netdb_8h.html#abe6a6a103a2f6fa4e13098e455ac7bb3',1,'lwip_gethostbyname(const char *name):&#160;netdb.c']]],
+  ['lwip_5fgethostbyname_5fr_11',['lwip_gethostbyname_r',['../netdb_8c.html#afa229e90916f6c8d6308828f45351d2d',1,'lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop):&#160;netdb.c'],['../lwip_2netdb_8h.html#afa229e90916f6c8d6308828f45351d2d',1,'lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop):&#160;netdb.c']]],
+  ['lwip_5fhtonl_12',['lwip_htonl',['../def_8c.html#a14f94347a5b9b9e3602705b75b7ae524',1,'lwip_htonl(u32_t n):&#160;def.c'],['../def_8h.html#a95e391e860b519b4f4f5c4979c9c9a37',1,'lwip_htonl(u32_t x):&#160;def.c']]],
+  ['lwip_5fhtons_13',['lwip_htons',['../def_8c.html#ad637280639de4066392e6b5614fa3e56',1,'lwip_htons(u16_t n):&#160;def.c'],['../def_8h.html#ac49eb25570806fb51c329d4f86302cc2',1,'lwip_htons(u16_t x):&#160;def.c']]],
+  ['lwip_5fif_5findextoname_14',['lwip_if_indextoname',['../group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c'],['../group__if__api.html#gac65ca8c0f6c6f1e3be79b4935d5fe33d',1,'lwip_if_indextoname(unsigned int ifindex, char *ifname):&#160;if_api.c']]],
+  ['lwip_5fif_5fnametoindex_15',['lwip_if_nametoindex',['../group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be',1,'lwip_if_nametoindex(const char *ifname):&#160;if_api.c'],['../group__if__api.html#ga76d07962b9d19c3c6f578de780e2c3be',1,'lwip_if_nametoindex(const char *ifname):&#160;if_api.c']]],
+  ['lwip_5finit_16',['lwip_init',['../group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9',1,'lwip_init(void):&#160;init.c'],['../group__lwip__nosys.html#ga0c1a18439524d2f4a5e51d25c0ca2ce9',1,'lwip_init(void):&#160;init.c']]],
+  ['lwip_5fitoa_17',['lwip_itoa',['../group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284',1,'lwip_itoa(char *result, size_t bufsize, int number):&#160;def.c'],['../group__sys__nonstandard.html#gaf15b4fbaaae5bb7f6da4301f3f979284',1,'lwip_itoa(char *result, size_t bufsize, int number):&#160;def.c']]],
+  ['lwip_5flisten_18',['lwip_listen',['../sockets_8c.html#abee6ee286147cf334a1ba19f19b2e08b',1,'lwip_listen(int s, int backlog):&#160;sockets.c'],['../sockets_8h.html#abee6ee286147cf334a1ba19f19b2e08b',1,'lwip_listen(int s, int backlog):&#160;sockets.c']]],
+  ['lwip_5fnetconn_5fdo_5faccepted_19',['lwip_netconn_do_accepted',['../api__msg_8c.html#afc455a5f63fa3bc85022e34861a2fea5',1,'lwip_netconn_do_accepted(void *m):&#160;api_msg.c'],['../api__msg_8h.html#afc455a5f63fa3bc85022e34861a2fea5',1,'lwip_netconn_do_accepted(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fbind_20',['lwip_netconn_do_bind',['../api__msg_8c.html#aa8e265922cda9f7fd54bf39e4ecf3768',1,'lwip_netconn_do_bind(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aa8e265922cda9f7fd54bf39e4ecf3768',1,'lwip_netconn_do_bind(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fbind_5fif_21',['lwip_netconn_do_bind_if',['../api__msg_8c.html#af4fed475f06818552ffefc8a1eda6605',1,'lwip_netconn_do_bind_if(void *m):&#160;api_msg.c'],['../api__msg_8h.html#af4fed475f06818552ffefc8a1eda6605',1,'lwip_netconn_do_bind_if(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fclose_22',['lwip_netconn_do_close',['../api__msg_8c.html#aff73e0fcdc13c7cb97a4bfbd71a4347d',1,'lwip_netconn_do_close(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aff73e0fcdc13c7cb97a4bfbd71a4347d',1,'lwip_netconn_do_close(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fconnect_23',['lwip_netconn_do_connect',['../api__msg_8c.html#a6f18f57eeda7b0596110930e696f9902',1,'lwip_netconn_do_connect(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a6f18f57eeda7b0596110930e696f9902',1,'lwip_netconn_do_connect(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fdelconn_24',['lwip_netconn_do_delconn',['../api__msg_8c.html#a9e77da8492e93d570bc1ec37f3c91d59',1,'lwip_netconn_do_delconn(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a9e77da8492e93d570bc1ec37f3c91d59',1,'lwip_netconn_do_delconn(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fdisconnect_25',['lwip_netconn_do_disconnect',['../api__msg_8c.html#adec8a5ddbcbdacba099c630c8310d34a',1,'lwip_netconn_do_disconnect(void *m):&#160;api_msg.c'],['../api__msg_8h.html#adec8a5ddbcbdacba099c630c8310d34a',1,'lwip_netconn_do_disconnect(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fgetaddr_26',['lwip_netconn_do_getaddr',['../api__msg_8c.html#af33f432db6e3f111d4ee5876089e4163',1,'lwip_netconn_do_getaddr(void *m):&#160;api_msg.c'],['../api__msg_8h.html#af33f432db6e3f111d4ee5876089e4163',1,'lwip_netconn_do_getaddr(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fgethostbyname_27',['lwip_netconn_do_gethostbyname',['../api__msg_8c.html#afd3802b2f12e27928ccc0f759b887d61',1,'lwip_netconn_do_gethostbyname(void *arg):&#160;api_msg.c'],['../api__msg_8h.html#afd3802b2f12e27928ccc0f759b887d61',1,'lwip_netconn_do_gethostbyname(void *arg):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fjoin_5fleave_5fgroup_28',['lwip_netconn_do_join_leave_group',['../api__msg_8c.html#a7402b52416828906a5679828cce37546',1,'lwip_netconn_do_join_leave_group(void *m):&#160;api_msg.c'],['../api__msg_8h.html#a7402b52416828906a5679828cce37546',1,'lwip_netconn_do_join_leave_group(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fjoin_5fleave_5fgroup_5fnetif_29',['lwip_netconn_do_join_leave_group_netif',['../api__msg_8c.html#aacc47257c0a5aa5eb107da0cfc699722',1,'lwip_netconn_do_join_leave_group_netif(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aacc47257c0a5aa5eb107da0cfc699722',1,'lwip_netconn_do_join_leave_group_netif(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5flisten_30',['lwip_netconn_do_listen',['../api__msg_8c.html#aa7d753d86818bfd77c1d73dab8dc943f',1,'lwip_netconn_do_listen(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aa7d753d86818bfd77c1d73dab8dc943f',1,'lwip_netconn_do_listen(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fnewconn_31',['lwip_netconn_do_newconn',['../api__msg_8c.html#abc6e1a4f8dd4640ab00eae4bbfdb7236',1,'lwip_netconn_do_newconn(void *m):&#160;api_msg.c'],['../api__msg_8h.html#abc6e1a4f8dd4640ab00eae4bbfdb7236',1,'lwip_netconn_do_newconn(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5frecv_32',['lwip_netconn_do_recv',['../api__msg_8c.html#ab6ae6036baf5c8fef22228ceb5e3ff9f',1,'lwip_netconn_do_recv(void *m):&#160;api_msg.c'],['../api__msg_8h.html#ab6ae6036baf5c8fef22228ceb5e3ff9f',1,'lwip_netconn_do_recv(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fsend_33',['lwip_netconn_do_send',['../api__msg_8c.html#ac714bdd3d57e34f0a6517a469d80df6c',1,'lwip_netconn_do_send(void *m):&#160;api_msg.c'],['../api__msg_8h.html#ac714bdd3d57e34f0a6517a469d80df6c',1,'lwip_netconn_do_send(void *m):&#160;api_msg.c']]],
+  ['lwip_5fnetconn_5fdo_5fwrite_34',['lwip_netconn_do_write',['../api__msg_8c.html#aca4545a471ead1bc673ea93fe85f7e5c',1,'lwip_netconn_do_write(void *m):&#160;api_msg.c'],['../api__msg_8h.html#aca4545a471ead1bc673ea93fe85f7e5c',1,'lwip_netconn_do_write(void *m):&#160;api_msg.c']]],
+  ['lwip_5fshutdown_35',['lwip_shutdown',['../sockets_8c.html#ade85c68b6673296c8fb67127b93fa4c1',1,'lwip_shutdown(int s, int how):&#160;sockets.c'],['../sockets_8h.html#ade85c68b6673296c8fb67127b93fa4c1',1,'lwip_shutdown(int s, int how):&#160;sockets.c']]],
+  ['lwip_5fsocket_5fthread_5fcleanup_36',['lwip_socket_thread_cleanup',['../sockets_8c.html#ab8cd92b10dbe3fb33da03faed1ea98a7',1,'lwip_socket_thread_cleanup(void):&#160;sockets.c'],['../sockets_8h.html#ab8cd92b10dbe3fb33da03faed1ea98a7',1,'lwip_socket_thread_cleanup(void):&#160;sockets.c']]],
+  ['lwip_5fsocket_5fthread_5finit_37',['lwip_socket_thread_init',['../sockets_8c.html#a0a250b3b4d1827e3a3661327f5e80ae0',1,'lwip_socket_thread_init(void):&#160;sockets.c'],['../sockets_8h.html#a0a250b3b4d1827e3a3661327f5e80ae0',1,'lwip_socket_thread_init(void):&#160;sockets.c']]],
+  ['lwip_5fstricmp_38',['lwip_stricmp',['../group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a',1,'lwip_stricmp(const char *str1, const char *str2):&#160;def.c'],['../group__sys__nonstandard.html#ga263cbafcb697eff964139a9998a6668a',1,'lwip_stricmp(const char *str1, const char *str2):&#160;def.c']]],
+  ['lwip_5fstrnicmp_39',['lwip_strnicmp',['../group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a',1,'lwip_strnicmp(const char *str1, const char *str2, size_t len):&#160;def.c'],['../group__sys__nonstandard.html#ga997dcc49451121d4ed755b33bc7bd26a',1,'lwip_strnicmp(const char *str1, const char *str2, size_t len):&#160;def.c']]],
+  ['lwip_5fstrnistr_40',['lwip_strnistr',['../group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa',1,'lwip_strnistr(const char *buffer, const char *token, size_t n):&#160;def.c'],['../group__sys__nonstandard.html#gac0cd63b4a1a44f5081858199e68f46aa',1,'lwip_strnistr(const char *buffer, const char *token, size_t n):&#160;def.c']]],
+  ['lwip_5fstrnstr_41',['lwip_strnstr',['../group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c'],['../group__sys__nonstandard.html#gaa2ba4b4e2dd7e1c856fedc6a6069813e',1,'lwip_strnstr(const char *buffer, const char *token, size_t n):&#160;def.c']]],
+  ['lwiperf_5fabort_42',['lwiperf_abort',['../group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004',1,'lwiperf_abort(void *lwiperf_session):&#160;lwiperf.c'],['../group__iperf.html#gac51c9c44a38bfa1140bd44b793a0a004',1,'lwiperf_abort(void *lwiperf_session):&#160;lwiperf.c']]],
+  ['lwiperf_5fstart_5ftcp_5fclient_43',['lwiperf_start_tcp_client',['../group__iperf.html#ga1088722d967f0f465d45fd3b15dde445',1,'lwiperf_start_tcp_client(const ip_addr_t *remote_addr, u16_t remote_port, enum lwiperf_client_type type, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga1088722d967f0f465d45fd3b15dde445',1,'lwiperf_start_tcp_client(const ip_addr_t *remote_addr, u16_t remote_port, enum lwiperf_client_type type, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
+  ['lwiperf_5fstart_5ftcp_5fclient_5fdefault_44',['lwiperf_start_tcp_client_default',['../group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456',1,'lwiperf_start_tcp_client_default(const ip_addr_t *remote_addr, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga8106ed0805f2dc2b1d92e2f5b420f456',1,'lwiperf_start_tcp_client_default(const ip_addr_t *remote_addr, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
+  ['lwiperf_5fstart_5ftcp_5fserver_45',['lwiperf_start_tcp_server',['../group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec',1,'lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#ga6932fe36fa6fbc7081ad317b71d87bec',1,'lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]],
+  ['lwiperf_5fstart_5ftcp_5fserver_5fdefault_46',['lwiperf_start_tcp_server_default',['../group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c'],['../group__iperf.html#gad4c93f3e77140ef2966a291e564d67c5',1,'lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg):&#160;lwiperf.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_8.js b/doc/doxygen/output/html/search/functions_8.js
index adb22ff..75ae3b8 100644
--- a/doc/doxygen/output/html/search/functions_8.js
+++ b/doc/doxygen/output/html/search/functions_8.js
@@ -1,90 +1,79 @@
 var searchData=
 [
-  ['nd6_5fadjust_5fmld_5fmembership_0',['nd6_adjust_mld_membership',['../nd6_8c.html#a27224542b8ffab81c2ed9f47752bb51e',1,'nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state):&#160;nd6.c'],['../nd6_8h.html#a27224542b8ffab81c2ed9f47752bb51e',1,'nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state):&#160;nd6.c']]],
-  ['nd6_5fcleanup_5fnetif_1',['nd6_cleanup_netif',['../nd6_8c.html#a84f9f52cab7ae37b4dd343536156dc73',1,'nd6_cleanup_netif(struct netif *netif):&#160;nd6.c'],['../nd6_8h.html#a84f9f52cab7ae37b4dd343536156dc73',1,'nd6_cleanup_netif(struct netif *netif):&#160;nd6.c']]],
-  ['nd6_5fclear_5fdestination_5fcache_2',['nd6_clear_destination_cache',['../nd6_8c.html#a64d7956cf2b0d45025b02661f3f62377',1,'nd6_clear_destination_cache(void):&#160;nd6.c'],['../nd6_8h.html#a64d7956cf2b0d45025b02661f3f62377',1,'nd6_clear_destination_cache(void):&#160;nd6.c']]],
-  ['nd6_5ffind_5froute_3',['nd6_find_route',['../nd6_8c.html#af4a71e18bb01efb89f9181676784efa7',1,'nd6_find_route(const ip6_addr_t *ip6addr):&#160;nd6.c'],['../nd6_8h.html#af4a71e18bb01efb89f9181676784efa7',1,'nd6_find_route(const ip6_addr_t *ip6addr):&#160;nd6.c']]],
-  ['nd6_5fget_5fdestination_5fmtu_4',['nd6_get_destination_mtu',['../nd6_8c.html#af226438f4f9b4aa7c3a2bbdf3c1e948c',1,'nd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif):&#160;nd6.c'],['../nd6_8h.html#af226438f4f9b4aa7c3a2bbdf3c1e948c',1,'nd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif):&#160;nd6.c']]],
-  ['nd6_5fget_5fnext_5fhop_5faddr_5for_5fqueue_5',['nd6_get_next_hop_addr_or_queue',['../nd6_8c.html#ae447c204ebbf71e6ebbc5ed727a73eb9',1,'nd6_get_next_hop_addr_or_queue(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr, const u8_t **hwaddrp):&#160;nd6.c'],['../nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9',1,'nd6_get_next_hop_addr_or_queue(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr, const u8_t **hwaddrp):&#160;nd6.c']]],
-  ['nd6_5finput_6',['nd6_input',['../nd6_8c.html#abbb92837e715be0e7d99513a84995831',1,'nd6_input(struct pbuf *p, struct netif *inp):&#160;nd6.c'],['../nd6_8h.html#abbb92837e715be0e7d99513a84995831',1,'nd6_input(struct pbuf *p, struct netif *inp):&#160;nd6.c']]],
-  ['nd6_5freachability_5fhint_7',['nd6_reachability_hint',['../nd6_8c.html#a4959990cae26a3996f638ec996f046df',1,'nd6_reachability_hint(const ip6_addr_t *ip6addr):&#160;nd6.c'],['../nd6_8h.html#a4959990cae26a3996f638ec996f046df',1,'nd6_reachability_hint(const ip6_addr_t *ip6addr):&#160;nd6.c']]],
-  ['nd6_5frestart_5fnetif_8',['nd6_restart_netif',['../nd6_8c.html#a73d3192204da20be193e3c00c4a0cb54',1,'nd6_restart_netif(struct netif *netif):&#160;nd6.c'],['../nd6_8h.html#a73d3192204da20be193e3c00c4a0cb54',1,'nd6_restart_netif(struct netif *netif):&#160;nd6.c']]],
-  ['nd6_5ftmr_9',['nd6_tmr',['../nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe',1,'nd6_tmr(void):&#160;nd6.c'],['../nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe',1,'nd6_tmr(void):&#160;nd6.c']]],
-  ['netbiosns_5finit_10',['netbiosns_init',['../group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b',1,'netbiosns_init(void):&#160;netbiosns.c'],['../group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b',1,'netbiosns_init(void):&#160;netbiosns.c']]],
-  ['netbiosns_5fstop_11',['netbiosns_stop',['../group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806',1,'netbiosns_stop(void):&#160;netbiosns.c'],['../group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806',1,'netbiosns_stop(void):&#160;netbiosns.c']]],
-  ['netbuf_5falloc_12',['netbuf_alloc',['../group__netbuf.html#ga1525001cbea926fdae88b0ac40bd6525',1,'netbuf_alloc(struct netbuf *buf, u16_t size):&#160;netbuf.c'],['../group__netbuf.html#ga1525001cbea926fdae88b0ac40bd6525',1,'netbuf_alloc(struct netbuf *buf, u16_t size):&#160;netbuf.c']]],
-  ['netbuf_5fchain_13',['netbuf_chain',['../group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602',1,'netbuf_chain(struct netbuf *head, struct netbuf *tail):&#160;netbuf.c'],['../group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602',1,'netbuf_chain(struct netbuf *head, struct netbuf *tail):&#160;netbuf.c']]],
-  ['netbuf_5fdata_14',['netbuf_data',['../group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01',1,'netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len):&#160;netbuf.c'],['../group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01',1,'netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len):&#160;netbuf.c']]],
-  ['netbuf_5fdelete_15',['netbuf_delete',['../group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d',1,'netbuf_delete(struct netbuf *buf):&#160;netbuf.c'],['../group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d',1,'netbuf_delete(struct netbuf *buf):&#160;netbuf.c']]],
-  ['netbuf_5ffirst_16',['netbuf_first',['../group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51',1,'netbuf_first(struct netbuf *buf):&#160;netbuf.c'],['../group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51',1,'netbuf_first(struct netbuf *buf):&#160;netbuf.c']]],
-  ['netbuf_5ffree_17',['netbuf_free',['../group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b',1,'netbuf_free(struct netbuf *buf):&#160;netbuf.c'],['../group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b',1,'netbuf_free(struct netbuf *buf):&#160;netbuf.c']]],
-  ['netbuf_5fnew_18',['netbuf_new',['../group__netbuf.html#gade8afe4d5b849cec3784708d691be711',1,'netbuf_new(void):&#160;netbuf.c'],['../group__netbuf.html#gade8afe4d5b849cec3784708d691be711',1,'netbuf_new(void):&#160;netbuf.c']]],
-  ['netbuf_5fnext_19',['netbuf_next',['../group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715',1,'netbuf_next(struct netbuf *buf):&#160;netbuf.c'],['../group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715',1,'netbuf_next(struct netbuf *buf):&#160;netbuf.c']]],
-  ['netbuf_5fref_20',['netbuf_ref',['../group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2',1,'netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size):&#160;netbuf.c'],['../group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2',1,'netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size):&#160;netbuf.c']]],
-  ['netconn_5faccept_21',['netconn_accept',['../group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69',1,'netconn_accept(struct netconn *conn, struct netconn **new_conn):&#160;api_lib.c'],['../group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69',1,'netconn_accept(struct netconn *conn, struct netconn **new_conn):&#160;api_lib.c']]],
-  ['netconn_5falloc_22',['netconn_alloc',['../api__msg_8c.html#a126d82a17c302d883f4131379abd1430',1,'netconn_alloc(enum netconn_type t, netconn_callback callback):&#160;api_msg.c'],['../api__msg_8h.html#a126d82a17c302d883f4131379abd1430',1,'netconn_alloc(enum netconn_type t, netconn_callback callback):&#160;api_msg.c']]],
-  ['netconn_5fbind_23',['netconn_bind',['../group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230',1,'netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port):&#160;api_lib.c'],['../group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230',1,'netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port):&#160;api_lib.c']]],
-  ['netconn_5fbind_5fif_24',['netconn_bind_if',['../group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5',1,'netconn_bind_if(struct netconn *conn, u8_t if_idx):&#160;api_lib.c'],['../group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5',1,'netconn_bind_if(struct netconn *conn, u8_t if_idx):&#160;api_lib.c']]],
-  ['netconn_5fclose_25',['netconn_close',['../group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624',1,'netconn_close(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624',1,'netconn_close(struct netconn *conn):&#160;api_lib.c']]],
-  ['netconn_5fconnect_26',['netconn_connect',['../group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77',1,'netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port):&#160;api_lib.c'],['../group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77',1,'netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port):&#160;api_lib.c']]],
-  ['netconn_5fdelete_27',['netconn_delete',['../group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403',1,'netconn_delete(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403',1,'netconn_delete(struct netconn *conn):&#160;api_lib.c']]],
-  ['netconn_5fdisconnect_28',['netconn_disconnect',['../group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402',1,'netconn_disconnect(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402',1,'netconn_disconnect(struct netconn *conn):&#160;api_lib.c']]],
-  ['netconn_5ferr_29',['netconn_err',['../group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4',1,'netconn_err(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4',1,'netconn_err(struct netconn *conn):&#160;api_lib.c']]],
-  ['netconn_5ffree_30',['netconn_free',['../api__msg_8c.html#a875b82ad129bdec1c6f2c21cbeedc48b',1,'netconn_free(struct netconn *conn):&#160;api_msg.c'],['../api__msg_8h.html#a875b82ad129bdec1c6f2c21cbeedc48b',1,'netconn_free(struct netconn *conn):&#160;api_msg.c']]],
-  ['netconn_5fgetaddr_31',['netconn_getaddr',['../api__lib_8c.html#a28430d1d86733f1bf98dc31305c42104',1,'netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local):&#160;api_lib.c'],['../api_8h.html#a28430d1d86733f1bf98dc31305c42104',1,'netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local):&#160;api_lib.c']]],
-  ['netconn_5fgethostbyname_5faddrtype_32',['netconn_gethostbyname_addrtype',['../group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5',1,'netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype):&#160;api_lib.c'],['../group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5',1,'netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype):&#160;api_lib.c']]],
-  ['netconn_5fjoin_5fleave_5fgroup_33',['netconn_join_leave_group',['../group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed',1,'netconn_join_leave_group(struct netconn *conn, const ip_addr_t *multiaddr, const ip_addr_t *netif_addr, enum netconn_igmp join_or_leave):&#160;api_lib.c'],['../group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed',1,'netconn_join_leave_group(struct netconn *conn, const ip_addr_t *multiaddr, const ip_addr_t *netif_addr, enum netconn_igmp join_or_leave):&#160;api_lib.c']]],
-  ['netconn_5fjoin_5fleave_5fgroup_5fnetif_34',['netconn_join_leave_group_netif',['../group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b',1,'netconn_join_leave_group_netif(struct netconn *conn, const ip_addr_t *multiaddr, u8_t if_idx, enum netconn_igmp join_or_leave):&#160;api_lib.c'],['../group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b',1,'netconn_join_leave_group_netif(struct netconn *conn, const ip_addr_t *multiaddr, u8_t if_idx, enum netconn_igmp join_or_leave):&#160;api_lib.c']]],
-  ['netconn_5flisten_5fwith_5fbacklog_35',['netconn_listen_with_backlog',['../group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d',1,'netconn_listen_with_backlog(struct netconn *conn, u8_t backlog):&#160;api_lib.c'],['../group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d',1,'netconn_listen_with_backlog(struct netconn *conn, u8_t backlog):&#160;api_lib.c']]],
-  ['netconn_5fnew_5fwith_5fproto_5fand_5fcallback_36',['netconn_new_with_proto_and_callback',['../api__lib_8c.html#a42711660e5030bc0dff779f3cea4178e',1,'netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback):&#160;api_lib.c'],['../api_8h.html#a42711660e5030bc0dff779f3cea4178e',1,'netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback):&#160;api_lib.c']]],
-  ['netconn_5fprepare_5fdelete_37',['netconn_prepare_delete',['../group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0',1,'netconn_prepare_delete(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0',1,'netconn_prepare_delete(struct netconn *conn):&#160;api_lib.c']]],
-  ['netconn_5frecv_38',['netconn_recv',['../group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf',1,'netconn_recv(struct netconn *conn, struct netbuf **new_buf):&#160;api_lib.c'],['../group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf',1,'netconn_recv(struct netconn *conn, struct netbuf **new_buf):&#160;api_lib.c']]],
-  ['netconn_5frecv_5ftcp_5fpbuf_39',['netconn_recv_tcp_pbuf',['../group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490',1,'netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf):&#160;api_lib.c'],['../group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490',1,'netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf):&#160;api_lib.c']]],
-  ['netconn_5frecv_5ftcp_5fpbuf_5fflags_40',['netconn_recv_tcp_pbuf_flags',['../group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294',1,'netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags):&#160;api_lib.c'],['../group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294',1,'netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags):&#160;api_lib.c']]],
-  ['netconn_5frecv_5fudp_5fraw_5fnetbuf_41',['netconn_recv_udp_raw_netbuf',['../api__lib_8c.html#a805a90b546c5a149f04782351633979b',1,'netconn_recv_udp_raw_netbuf(struct netconn *conn, struct netbuf **new_buf):&#160;api_lib.c'],['../api_8h.html#a805a90b546c5a149f04782351633979b',1,'netconn_recv_udp_raw_netbuf(struct netconn *conn, struct netbuf **new_buf):&#160;api_lib.c']]],
-  ['netconn_5frecv_5fudp_5fraw_5fnetbuf_5fflags_42',['netconn_recv_udp_raw_netbuf_flags',['../api__lib_8c.html#a505c3b8e400babf9681e09c945b7f421',1,'netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags):&#160;api_lib.c'],['../api_8h.html#a505c3b8e400babf9681e09c945b7f421',1,'netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags):&#160;api_lib.c']]],
-  ['netconn_5fsend_43',['netconn_send',['../group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238',1,'netconn_send(struct netconn *conn, struct netbuf *buf):&#160;api_lib.c'],['../group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238',1,'netconn_send(struct netconn *conn, struct netbuf *buf):&#160;api_lib.c']]],
-  ['netconn_5fsendto_44',['netconn_sendto',['../group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c',1,'netconn_sendto(struct netconn *conn, struct netbuf *buf, const ip_addr_t *addr, u16_t port):&#160;api_lib.c'],['../group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c',1,'netconn_sendto(struct netconn *conn, struct netbuf *buf, const ip_addr_t *addr, u16_t port):&#160;api_lib.c']]],
-  ['netconn_5fshutdown_45',['netconn_shutdown',['../group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63',1,'netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx):&#160;api_lib.c'],['../group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63',1,'netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx):&#160;api_lib.c']]],
-  ['netconn_5fwrite_5fpartly_46',['netconn_write_partly',['../group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf',1,'netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, u8_t apiflags, size_t *bytes_written):&#160;api_lib.c'],['../group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf',1,'netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, u8_t apiflags, size_t *bytes_written):&#160;api_lib.c']]],
-  ['netconn_5fwrite_5fvectors_5fpartly_47',['netconn_write_vectors_partly',['../api__lib_8c.html#a992b4fe8a855fd94861738f7260d0a32',1,'netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt, u8_t apiflags, size_t *bytes_written):&#160;api_lib.c'],['../api_8h.html#a992b4fe8a855fd94861738f7260d0a32',1,'netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt, u8_t apiflags, size_t *bytes_written):&#160;api_lib.c']]],
-  ['netif_5fadd_48',['netif_add',['../group__netif.html#ga22055759a25f5d6cea7e7deab0a07434',1,'netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c'],['../group__netif.html#ga22055759a25f5d6cea7e7deab0a07434',1,'netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c']]],
-  ['netif_5fadd_5fext_5fcallback_49',['netif_add_ext_callback',['../group__netif.html#ga3efc2b72f75936d50708247420c9d1d9',1,'netif_add_ext_callback(netif_ext_callback_t *callback, netif_ext_callback_fn fn):&#160;netif.c'],['../group__netif.html#ga3efc2b72f75936d50708247420c9d1d9',1,'netif_add_ext_callback(netif_ext_callback_t *callback, netif_ext_callback_fn fn):&#160;netif.c']]],
-  ['netif_5fadd_5fip6_5faddress_50',['netif_add_ip6_address',['../group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327',1,'netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx):&#160;netif.c'],['../group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327',1,'netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx):&#160;netif.c']]],
-  ['netif_5fadd_5fnoaddr_51',['netif_add_noaddr',['../group__netif.html#gafcb3925fb117375739abf97f3a856bcd',1,'netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c'],['../group__netif.html#gafcb3925fb117375739abf97f3a856bcd',1,'netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c']]],
-  ['netif_5falloc_5fclient_5fdata_5fid_52',['netif_alloc_client_data_id',['../group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978',1,'netif_alloc_client_data_id(void):&#160;netif.c'],['../group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978',1,'netif_alloc_client_data_id(void):&#160;netif.c']]],
-  ['netif_5fcreate_5fip6_5flinklocal_5faddress_53',['netif_create_ip6_linklocal_address',['../group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9',1,'netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit):&#160;netif.c'],['../group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9',1,'netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit):&#160;netif.c']]],
-  ['netif_5ffind_54',['netif_find',['../group__netif.html#ga3c82d1c742338828b2f4349a75bb84de',1,'netif_find(const char *name):&#160;netif.c'],['../group__netif.html#ga3c82d1c742338828b2f4349a75bb84de',1,'netif_find(const char *name):&#160;netif.c']]],
-  ['netif_5fget_5fby_5findex_55',['netif_get_by_index',['../group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a',1,'netif_get_by_index(u8_t idx):&#160;netif.c'],['../group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a',1,'netif_get_by_index(u8_t idx):&#160;netif.c']]],
-  ['netif_5fget_5fip6_5faddr_5fmatch_56',['netif_get_ip6_addr_match',['../netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc',1,'netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr):&#160;netif.c'],['../netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc',1,'netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr):&#160;netif.c']]],
-  ['netif_5findex_5fto_5fname_57',['netif_index_to_name',['../group__netif.html#ga0e755cb6624d3365551eeed5430fa226',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c'],['../group__netif.html#ga0e755cb6624d3365551eeed5430fa226',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c']]],
-  ['netif_5finput_58',['netif_input',['../group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385',1,'netif_input(struct pbuf *p, struct netif *inp):&#160;netif.c'],['../group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385',1,'netif_input(struct pbuf *p, struct netif *inp):&#160;netif.c']]],
-  ['netif_5finvoke_5fext_5fcallback_59',['netif_invoke_ext_callback',['../netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c',1,'netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args):&#160;netif.c'],['../netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c',1,'netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args):&#160;netif.c']]],
-  ['netif_5fip6_5faddr_5fset_60',['netif_ip6_addr_set',['../group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb',1,'netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6):&#160;netif.c'],['../group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb',1,'netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6):&#160;netif.c']]],
-  ['netif_5fip6_5faddr_5fset_5fstate_61',['netif_ip6_addr_set_state',['../group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f',1,'netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state):&#160;netif.c'],['../group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f',1,'netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state):&#160;netif.c']]],
-  ['netif_5floop_5foutput_62',['netif_loop_output',['../group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2',1,'netif_loop_output(struct netif *netif, struct pbuf *p):&#160;netif.c'],['../group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2',1,'netif_loop_output(struct netif *netif, struct pbuf *p):&#160;netif.c']]],
-  ['netif_5fname_5fto_5findex_63',['netif_name_to_index',['../group__netif.html#gac763a1f647fb9e8af4254418e813a6ae',1,'netif_name_to_index(const char *name):&#160;netif.c'],['../group__netif.html#gac763a1f647fb9e8af4254418e813a6ae',1,'netif_name_to_index(const char *name):&#160;netif.c']]],
-  ['netif_5fpoll_64',['netif_poll',['../netif_8c.html#a0fbaed78253d21e1b54e65651da3e327',1,'netif_poll(struct netif *netif):&#160;netif.c'],['../netif_8h.html#a0fbaed78253d21e1b54e65651da3e327',1,'netif_poll(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fremove_65',['netif_remove',['../group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979',1,'netif_remove(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979',1,'netif_remove(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fremove_5fext_5fcallback_66',['netif_remove_ext_callback',['../group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716',1,'netif_remove_ext_callback(netif_ext_callback_t *callback):&#160;netif.c'],['../group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716',1,'netif_remove_ext_callback(netif_ext_callback_t *callback):&#160;netif.c']]],
-  ['netif_5fset_5faddr_67',['netif_set_addr',['../group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1',1,'netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netif.c'],['../group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1',1,'netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netif.c']]],
-  ['netif_5fset_5fdefault_68',['netif_set_default',['../group__netif.html#gac90f290edd005238d62aa94c4ac9dea3',1,'netif_set_default(struct netif *netif):&#160;netif.c'],['../group__netif.html#gac90f290edd005238d62aa94c4ac9dea3',1,'netif_set_default(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fset_5fdown_69',['netif_set_down',['../group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf',1,'netif_set_down(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf',1,'netif_set_down(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fset_5fgw_70',['netif_set_gw',['../group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520',1,'netif_set_gw(struct netif *netif, const ip4_addr_t *gw):&#160;netif.c'],['../group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520',1,'netif_set_gw(struct netif *netif, const ip4_addr_t *gw):&#160;netif.c']]],
-  ['netif_5fset_5fipaddr_71',['netif_set_ipaddr',['../group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca',1,'netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr):&#160;netif.c'],['../group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca',1,'netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr):&#160;netif.c']]],
-  ['netif_5fset_5flink_5fcallback_72',['netif_set_link_callback',['../group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4',1,'netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback):&#160;netif.c'],['../group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4',1,'netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback):&#160;netif.c']]],
-  ['netif_5fset_5flink_5fdown_73',['netif_set_link_down',['../group__netif.html#ga34e37a1e8e358760dc1c43887922c7db',1,'netif_set_link_down(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga34e37a1e8e358760dc1c43887922c7db',1,'netif_set_link_down(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fset_5flink_5fup_74',['netif_set_link_up',['../group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea',1,'netif_set_link_up(struct netif *netif):&#160;netif.c'],['../group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea',1,'netif_set_link_up(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fset_5fnetmask_75',['netif_set_netmask',['../group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53',1,'netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask):&#160;netif.c'],['../group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53',1,'netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask):&#160;netif.c']]],
-  ['netif_5fset_5fremove_5fcallback_76',['netif_set_remove_callback',['../group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce',1,'netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback):&#160;netif.c'],['../group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce',1,'netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback):&#160;netif.c']]],
-  ['netif_5fset_5fstatus_5fcallback_77',['netif_set_status_callback',['../group__netif.html#gadc8787b23ac0ee023979cbadf87813d4',1,'netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback):&#160;netif.c'],['../group__netif.html#gadc8787b23ac0ee023979cbadf87813d4',1,'netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback):&#160;netif.c']]],
-  ['netif_5fset_5fup_78',['netif_set_up',['../group__netif.html#gaf19693be401a265a52d2a56c65753121',1,'netif_set_up(struct netif *netif):&#160;netif.c'],['../group__netif.html#gaf19693be401a265a52d2a56c65753121',1,'netif_set_up(struct netif *netif):&#160;netif.c']]],
-  ['netif_5fto_5fnum_79',['netif_to_num',['../snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de',1,'netif_to_num(const struct netif *netif):&#160;snmp_core.c'],['../snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de',1,'netif_to_num(const struct netif *netif):&#160;snmp_core.c']]],
-  ['netifapi_5farp_5fadd_80',['netifapi_arp_add',['../netifapi_8c.html#a62b0bdbb3783eb27aa73485081306119',1,'netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type):&#160;netifapi.c'],['../netifapi_8h.html#a62b0bdbb3783eb27aa73485081306119',1,'netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type):&#160;netifapi.c']]],
-  ['netifapi_5farp_5fremove_81',['netifapi_arp_remove',['../netifapi_8c.html#a037c3d05c19b4d467b6ce06eb4639ee8',1,'netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type):&#160;netifapi.c'],['../netifapi_8h.html#a037c3d05c19b4d467b6ce06eb4639ee8',1,'netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type):&#160;netifapi.c']]],
-  ['netifapi_5fnetif_5fadd_82',['netifapi_netif_add',['../group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519',1,'netifapi_netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netifapi.c'],['../group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519',1,'netifapi_netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netifapi.c']]],
-  ['netifapi_5fnetif_5fcommon_83',['netifapi_netif_common',['../netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7',1,'netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc):&#160;netifapi.c'],['../netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7',1,'netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc):&#160;netifapi.c']]],
-  ['netifapi_5fnetif_5findex_5fto_5fname_84',['netifapi_netif_index_to_name',['../group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6',1,'netifapi.c']]],
-  ['netifapi_5fnetif_5fname_5fto_5findex_85',['netifapi_netif_name_to_index',['../group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089',1,'netifapi.c']]],
-  ['netifapi_5fnetif_5fset_5faddr_86',['netifapi_netif_set_addr',['../group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973',1,'netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netifapi.c'],['../group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973',1,'netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netifapi.c']]]
+  ['mdns_5fbuild_5fdnssd_5fdomain_0',['mdns_build_dnssd_domain',['../mdns__domain_8c.html#a7485d75976b73354668a5a54bc8658ed',1,'mdns_build_dnssd_domain(struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a7485d75976b73354668a5a54bc8658ed',1,'mdns_build_dnssd_domain(struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5fhost_5fdomain_1',['mdns_build_host_domain',['../mdns__domain_8c.html#a191d9b70a66083f40aaa022c2ed88b12',1,'mdns_build_host_domain(struct mdns_domain *domain, struct mdns_host *mdns):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a191d9b70a66083f40aaa022c2ed88b12',1,'mdns_build_host_domain(struct mdns_domain *domain, struct mdns_host *mdns):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5frequest_5fdomain_2',['mdns_build_request_domain',['../mdns__domain_8c.html#a7221cb1a83ed6dcfb3a2b1365154b43d',1,'mdns_build_request_domain(struct mdns_domain *domain, struct mdns_request *request, int include_name):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a7221cb1a83ed6dcfb3a2b1365154b43d',1,'mdns_build_request_domain(struct mdns_domain *domain, struct mdns_request *request, int include_name):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5freverse_5fv4_5fdomain_3',['mdns_build_reverse_v4_domain',['../mdns__domain_8c.html#ac2d8951e2435f93fdc889f6a71e0c8a6',1,'mdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr):&#160;mdns_domain.c'],['../mdns__domain_8h.html#ac2d8951e2435f93fdc889f6a71e0c8a6',1,'mdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5freverse_5fv6_5fdomain_4',['mdns_build_reverse_v6_domain',['../mdns__domain_8c.html#a9cde39039e0e1e21b4851d840d733926',1,'mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a9cde39039e0e1e21b4851d840d733926',1,'mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr):&#160;mdns_domain.c']]],
+  ['mdns_5fbuild_5fservice_5fdomain_5',['mdns_build_service_domain',['../mdns__domain_8c.html#a29ddb0a6ba0edcf34104ec1f6322968b',1,'mdns_build_service_domain(struct mdns_domain *domain, struct mdns_service *service, int include_name):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a29ddb0a6ba0edcf34104ec1f6322968b',1,'mdns_build_service_domain(struct mdns_domain *domain, struct mdns_service *service, int include_name):&#160;mdns_domain.c']]],
+  ['mdns_5fcompress_5fdomain_6',['mdns_compress_domain',['../mdns__domain_8c.html#ab72e48cf076afd1e3a08030d1d0bff9e',1,'mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#ab72e48cf076afd1e3a08030d1d0bff9e',1,'mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['mdns_5fcreate_5foutpacket_7',['mdns_create_outpacket',['../mdns__out_8c.html#a5a051eb81d6bd37365973d1215af23ba',1,'mdns_create_outpacket(struct netif *netif, struct mdns_outmsg *msg, struct mdns_outpacket *outpkt):&#160;mdns_out.c'],['../mdns__out_8h.html#a5a051eb81d6bd37365973d1215af23ba',1,'mdns_create_outpacket(struct netif *netif, struct mdns_outmsg *msg, struct mdns_outpacket *outpkt):&#160;mdns_out.c']]],
+  ['mdns_5fdomain_5fadd_5fdomain_8',['mdns_domain_add_domain',['../mdns__domain_8c.html#a642449cbf0074f1a2504e72158e75859',1,'mdns_domain_add_domain(struct mdns_domain *domain, struct mdns_domain *source):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a642449cbf0074f1a2504e72158e75859',1,'mdns_domain_add_domain(struct mdns_domain *domain, struct mdns_domain *source):&#160;mdns_domain.c']]],
+  ['mdns_5fdomain_5fadd_5flabel_9',['mdns_domain_add_label',['../mdns__domain_8c.html#a17db69fa887515374452b945e959bbf9',1,'mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a17db69fa887515374452b945e959bbf9',1,'mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len):&#160;mdns_domain.c']]],
+  ['mdns_5fdomain_5fadd_5fstring_10',['mdns_domain_add_string',['../mdns__domain_8c.html#af228d1cf8d779c714a016702db095db6',1,'mdns_domain_add_string(struct mdns_domain *domain, const char *source):&#160;mdns_domain.c'],['../mdns__domain_8h.html#af228d1cf8d779c714a016702db095db6',1,'mdns_domain_add_string(struct mdns_domain *domain, const char *source):&#160;mdns_domain.c']]],
+  ['mdns_5fdomain_5fdebug_5fprint_11',['mdns_domain_debug_print',['../mdns__domain_8c.html#a0aff096695eebacb2668d2762722860c',1,'mdns_domain_debug_print(struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a0aff096695eebacb2668d2762722860c',1,'mdns_domain_debug_print(struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['mdns_5fdomain_5feq_12',['mdns_domain_eq',['../mdns__domain_8c.html#a52d8f70432ae998814f16b18431213cd',1,'mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a52d8f70432ae998814f16b18431213cd',1,'mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b):&#160;mdns_domain.c']]],
+  ['mdns_5fget_5fservice_5ftxt_5fuserdata_13',['mdns_get_service_txt_userdata',['../group__mdns.html#gaee5b489b77b74511517d41f7609ccd49',1,'mdns_get_service_txt_userdata(struct netif *netif, s8_t slot):&#160;mdns.c'],['../group__mdns.html#gaee5b489b77b74511517d41f7609ccd49',1,'mdns_get_service_txt_userdata(struct netif *netif, s8_t slot):&#160;mdns.c']]],
+  ['mdns_5fmulticast_5fprobe_5ftimeout_5freset_5fipv4_14',['mdns_multicast_probe_timeout_reset_ipv4',['../mdns__out_8c.html#add64c83f753842f2ceb40079217c66a1',1,'mdns_multicast_probe_timeout_reset_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#add64c83f753842f2ceb40079217c66a1',1,'mdns_multicast_probe_timeout_reset_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5fprobe_5ftimeout_5freset_5fipv6_15',['mdns_multicast_probe_timeout_reset_ipv6',['../mdns__out_8c.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f',1,'mdns_multicast_probe_timeout_reset_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a4e0aa6f6e3ba90c88e1bf1b83d05cd2f',1,'mdns_multicast_probe_timeout_reset_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5ftimeout_5f25ttl_5freset_5fipv4_16',['mdns_multicast_timeout_25ttl_reset_ipv4',['../mdns__out_8c.html#ae4a0ae6a039210f60f666999f9b807f7',1,'mdns_multicast_timeout_25ttl_reset_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#ae4a0ae6a039210f60f666999f9b807f7',1,'mdns_multicast_timeout_25ttl_reset_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5ftimeout_5f25ttl_5freset_5fipv6_17',['mdns_multicast_timeout_25ttl_reset_ipv6',['../mdns__out_8c.html#a5de741fd85c3675e3d2161727dd9a220',1,'mdns_multicast_timeout_25ttl_reset_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a5de741fd85c3675e3d2161727dd9a220',1,'mdns_multicast_timeout_25ttl_reset_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5ftimeout_5freset_5fipv4_18',['mdns_multicast_timeout_reset_ipv4',['../mdns__out_8c.html#a7b637b6f41976f35f7b48e7f2904829b',1,'mdns_multicast_timeout_reset_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a7b637b6f41976f35f7b48e7f2904829b',1,'mdns_multicast_timeout_reset_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fmulticast_5ftimeout_5freset_5fipv6_19',['mdns_multicast_timeout_reset_ipv6',['../mdns__out_8c.html#a790ea0aba2d252f96c23748ea0c033a7',1,'mdns_multicast_timeout_reset_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a790ea0aba2d252f96c23748ea0c033a7',1,'mdns_multicast_timeout_reset_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fprepare_5ftxtdata_20',['mdns_prepare_txtdata',['../mdns__out_8c.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f',1,'mdns_prepare_txtdata(struct mdns_service *service):&#160;mdns_out.c'],['../mdns__out_8h.html#ab8a8e5d5ba8cfbb18e7ff2588792ce5f',1,'mdns_prepare_txtdata(struct mdns_service *service):&#160;mdns_out.c']]],
+  ['mdns_5freadname_21',['mdns_readname',['../mdns__domain_8c.html#ab5f49d9356a76879e0e6a14eb0643b23',1,'mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#ab5f49d9356a76879e0e6a14eb0643b23',1,'mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['mdns_5fresp_5fadd_5fnetif_22',['mdns_resp_add_netif',['../group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e',1,'mdns_resp_add_netif(struct netif *netif, const char *hostname):&#160;mdns.c'],['../group__mdns.html#ga67f842c27f37c03b48d10e4ce6856b8e',1,'mdns_resp_add_netif(struct netif *netif, const char *hostname):&#160;mdns.c']]],
+  ['mdns_5fresp_5fadd_5fservice_23',['mdns_resp_add_service',['../group__mdns.html#ga2130111662d044b32970ce9c763bd409',1,'mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, service_get_txt_fn_t txt_fn, void *txt_data):&#160;mdns.c'],['../group__mdns.html#ga2130111662d044b32970ce9c763bd409',1,'mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, service_get_txt_fn_t txt_fn, void *txt_userdata):&#160;mdns.c']]],
+  ['mdns_5fresp_5fadd_5fservice_5ftxtitem_24',['mdns_resp_add_service_txtitem',['../group__mdns.html#ga01c85202f4b85edc8b571f2f419db576',1,'mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len):&#160;mdns.c'],['../group__mdns.html#ga01c85202f4b85edc8b571f2f419db576',1,'mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len):&#160;mdns.c']]],
+  ['mdns_5fresp_5fannounce_25',['mdns_resp_announce',['../group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85',1,'mdns_resp_announce(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga0f462fb91a9d0323bb4636bd725f0e85',1,'mdns_resp_announce(struct netif *netif):&#160;mdns.c']]],
+  ['mdns_5fresp_5fdel_5fservice_26',['mdns_resp_del_service',['../group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a',1,'mdns_resp_del_service(struct netif *netif, u8_t slot):&#160;mdns.c'],['../group__mdns.html#ga55f3fd46cfe1375452210688fc05bf9a',1,'mdns_resp_del_service(struct netif *netif, u8_t slot):&#160;mdns.c']]],
+  ['mdns_5fresp_5finit_27',['mdns_resp_init',['../group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3',1,'mdns_resp_init(void):&#160;mdns.c'],['../group__mdns.html#ga5fa15978a398dae1a8d7620ae169bdd3',1,'mdns_resp_init(void):&#160;mdns.c']]],
+  ['mdns_5fresp_5fnetif_5factive_28',['mdns_resp_netif_active',['../group__mdns.html#ga09b7a259f497648d8ef734b080f997c1',1,'mdns_resp_netif_active(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga09b7a259f497648d8ef734b080f997c1',1,'mdns_resp_netif_active(struct netif *netif):&#160;mdns.c']]],
+  ['mdns_5fresp_5fregister_5fname_5fresult_5fcb_29',['mdns_resp_register_name_result_cb',['../mdns_8c.html#a01f8850b9c2d2cd40ed77a1438c85bf1',1,'mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb):&#160;mdns.c'],['../mdns_8h.html#a01f8850b9c2d2cd40ed77a1438c85bf1',1,'mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb):&#160;mdns.c']]],
+  ['mdns_5fresp_5fremove_5fnetif_30',['mdns_resp_remove_netif',['../group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c',1,'mdns_resp_remove_netif(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#gaa8144e3c77a92c4043e6214ff6b6010c',1,'mdns_resp_remove_netif(struct netif *netif):&#160;mdns.c']]],
+  ['mdns_5fresp_5frename_5fnetif_31',['mdns_resp_rename_netif',['../group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e',1,'mdns_resp_rename_netif(struct netif *netif, const char *hostname):&#160;mdns.c'],['../group__mdns.html#ga7b1473e595eb0c185bab293f3ec2e50e',1,'mdns_resp_rename_netif(struct netif *netif, const char *hostname):&#160;mdns.c']]],
+  ['mdns_5fresp_5frename_5fservice_32',['mdns_resp_rename_service',['../group__mdns.html#gab1e989a4c7305d754377c76052474beb',1,'mdns_resp_rename_service(struct netif *netif, u8_t slot, const char *name):&#160;mdns.c'],['../group__mdns.html#gab1e989a4c7305d754377c76052474beb',1,'mdns_resp_rename_service(struct netif *netif, u8_t slot, const char *name):&#160;mdns.c']]],
+  ['mdns_5fresp_5frestart_33',['mdns_resp_restart',['../group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a',1,'mdns_resp_restart(struct netif *netif):&#160;mdns.c'],['../group__mdns.html#ga93eccdc0d9afff0f24160d31c70e2c9a',1,'mdns_resp_restart(struct netif *netif):&#160;mdns.c']]],
+  ['mdns_5fresp_5frestart_5fdelay_34',['mdns_resp_restart_delay',['../group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737',1,'mdns_resp_restart_delay(struct netif *netif, uint32_t delay):&#160;mdns.c'],['../group__mdns.html#ga367ac89ddae6cbec3e0a9c55e9c46737',1,'mdns_resp_restart_delay(struct netif *netif, uint32_t delay):&#160;mdns.c']]],
+  ['mdns_5fsearch_5fservice_35',['mdns_search_service',['../group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725',1,'mdns_search_service(const char *name, const char *service, enum mdns_sd_proto proto, struct netif *netif, search_result_fn_t result_fn, void *arg, u8_t *request_id):&#160;mdns.c'],['../group__mdns.html#gac388b2eab379a23dd1f46f2ac8d63725',1,'mdns_search_service(const char *name, const char *service, enum mdns_sd_proto proto, struct netif *netif, search_result_fn_t result_fn, void *arg, u8_t *request_id):&#160;mdns.c']]],
+  ['mdns_5fsearch_5fstop_36',['mdns_search_stop',['../group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac',1,'mdns_search_stop(u8_t request_id):&#160;mdns.c'],['../group__mdns.html#ga0c5617b4d021353bbd0fb24ddcb8b3ac',1,'mdns_search_stop(u8_t request_id):&#160;mdns.c']]],
+  ['mdns_5fsend_5fmulticast_5fmsg_5fdelayed_5fipv4_37',['mdns_send_multicast_msg_delayed_ipv4',['../mdns__out_8c.html#acbf59dca94f241c1b58c7df1ec4b85e1',1,'mdns_send_multicast_msg_delayed_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#acbf59dca94f241c1b58c7df1ec4b85e1',1,'mdns_send_multicast_msg_delayed_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5fmulticast_5fmsg_5fdelayed_5fipv6_38',['mdns_send_multicast_msg_delayed_ipv6',['../mdns__out_8c.html#af3e118eb80760a958265f6a4c59b2e49',1,'mdns_send_multicast_msg_delayed_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#af3e118eb80760a958265f6a4c59b2e49',1,'mdns_send_multicast_msg_delayed_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5foutpacket_39',['mdns_send_outpacket',['../mdns__out_8c.html#ae8c9d2bd89d6ca7e8668ba708925d2e8',1,'mdns_send_outpacket(struct mdns_outmsg *msg, struct netif *netif):&#160;mdns_out.c'],['../mdns__out_8h.html#ae8c9d2bd89d6ca7e8668ba708925d2e8',1,'mdns_send_outpacket(struct mdns_outmsg *msg, struct netif *netif):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5frequest_40',['mdns_send_request',['../mdns__out_8c.html#a1f7dc9536f124263573518e6e8e1a162',1,'mdns_send_request(struct mdns_request *req, struct netif *netif, const ip_addr_t *destination):&#160;mdns_out.c'],['../mdns__out_8h.html#a1f7dc9536f124263573518e6e8e1a162',1,'mdns_send_request(struct mdns_request *req, struct netif *netif, const ip_addr_t *destination):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5funicast_5fmsg_5fdelayed_5fipv4_41',['mdns_send_unicast_msg_delayed_ipv4',['../mdns__out_8c.html#a2b7a721b19fa33813133bc97f503c199',1,'mdns_send_unicast_msg_delayed_ipv4(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a2b7a721b19fa33813133bc97f503c199',1,'mdns_send_unicast_msg_delayed_ipv4(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fsend_5funicast_5fmsg_5fdelayed_5fipv6_42',['mdns_send_unicast_msg_delayed_ipv6',['../mdns__out_8c.html#a2713348b1b314d5e880442f2c130e1dc',1,'mdns_send_unicast_msg_delayed_ipv6(void *arg):&#160;mdns_out.c'],['../mdns__out_8h.html#a2713348b1b314d5e880442f2c130e1dc',1,'mdns_send_unicast_msg_delayed_ipv6(void *arg):&#160;mdns_out.c']]],
+  ['mdns_5fset_5ftimeout_43',['mdns_set_timeout',['../mdns__out_8c.html#a6195808be1840daa8a100b5954a30cfe',1,'mdns_set_timeout(struct netif *netif, u32_t msecs, sys_timeout_handler handler, u8_t *busy_flag):&#160;mdns_out.c'],['../mdns__out_8h.html#a6195808be1840daa8a100b5954a30cfe',1,'mdns_set_timeout(struct netif *netif, u32_t msecs, sys_timeout_handler handler, u8_t *busy_flag):&#160;mdns_out.c']]],
+  ['mdns_5fstart_5fmulticast_5ftimeouts_5fipv4_44',['mdns_start_multicast_timeouts_ipv4',['../mdns__out_8c.html#a2dd35cb1e1fae888c05c2b7f8bd717cc',1,'mdns_start_multicast_timeouts_ipv4(struct netif *netif):&#160;mdns_out.c'],['../mdns__out_8h.html#a2dd35cb1e1fae888c05c2b7f8bd717cc',1,'mdns_start_multicast_timeouts_ipv4(struct netif *netif):&#160;mdns_out.c']]],
+  ['mdns_5fstart_5fmulticast_5ftimeouts_5fipv6_45',['mdns_start_multicast_timeouts_ipv6',['../mdns__out_8c.html#a10f6f22640ac837a233bf43334dfb02a',1,'mdns_start_multicast_timeouts_ipv6(struct netif *netif):&#160;mdns_out.c'],['../mdns__out_8h.html#a10f6f22640ac837a233bf43334dfb02a',1,'mdns_start_multicast_timeouts_ipv6(struct netif *netif):&#160;mdns_out.c']]],
+  ['mdns_5fwrite_5fdomain_46',['mdns_write_domain',['../mdns__domain_8c.html#a92de54d2f384a4e4ffa85e529cc05411',1,'mdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain):&#160;mdns_domain.c'],['../mdns__domain_8h.html#a92de54d2f384a4e4ffa85e529cc05411',1,'mdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain):&#160;mdns_domain.c']]],
+  ['mem_5fcalloc_47',['mem_calloc',['../mem_8c.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c'],['../mem_8h.html#a06b2fb3a6f6a6c56a84f769e0bd4c8e7',1,'mem_calloc(mem_size_t count, mem_size_t size):&#160;mem.c']]],
+  ['mem_5ffree_48',['mem_free',['../mem_8c.html#a65169147c44e9db60d997819af9b455c',1,'mem_free(void *rmem):&#160;mem.c'],['../mem_8h.html#a2fd7aa1adf6e394d3be7c7734e7df41a',1,'mem_free(void *mem):&#160;mem.c']]],
+  ['mem_5ffree_5fcallback_49',['mem_free_callback',['../tcpip_8c.html#a55b4de3765c6a37b3f2b26a11603771c',1,'mem_free_callback(void *m):&#160;tcpip.c'],['../tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c',1,'mem_free_callback(void *m):&#160;tcpip.c']]],
+  ['mem_5finit_50',['mem_init',['../mem_8c.html#a44a136e3b70c36abb6f8dc060c778113',1,'mem_init(void):&#160;mem.c'],['../mem_8h.html#a44a136e3b70c36abb6f8dc060c778113',1,'mem_init(void):&#160;mem.c']]],
+  ['mem_5fmalloc_51',['mem_malloc',['../mem_8c.html#ae2190f95ae9c46bb99ec0be4f4e4e5e4',1,'mem_malloc(mem_size_t size_in):&#160;mem.c'],['../mem_8h.html#a52ce222aebe4b7dce7f25cd536b6e650',1,'mem_malloc(mem_size_t size):&#160;mem.c']]],
+  ['mem_5ftrim_52',['mem_trim',['../mem_8c.html#ab0915b39bd096766771ef4cf719bfb40',1,'mem_trim(void *rmem, mem_size_t new_size):&#160;mem.c'],['../mem_8h.html#a2ba2d1e6fc284b1850eedb673eba96b0',1,'mem_trim(void *mem, mem_size_t size):&#160;mem.c']]],
+  ['memp_5ffree_53',['memp_free',['../memp_8c.html#aecd94926b7c2a0e23ae195f4ae97581f',1,'memp_free(memp_t type, void *mem):&#160;memp.c'],['../memp_8h.html#aecd94926b7c2a0e23ae195f4ae97581f',1,'memp_free(memp_t type, void *mem):&#160;memp.c']]],
+  ['memp_5ffree_5fpool_54',['memp_free_pool',['../memp_8c.html#a62f8c3c907743e34eee3cdac7fa1eaa5',1,'memp_free_pool(const struct memp_desc *desc, void *mem):&#160;memp.c'],['../memp__priv_8h.html#a62f8c3c907743e34eee3cdac7fa1eaa5',1,'memp_free_pool(const struct memp_desc *desc, void *mem):&#160;memp.c']]],
+  ['memp_5finit_55',['memp_init',['../memp_8c.html#a9693e5b1ac2c6b9c0e7870522d45efa2',1,'memp_init(void):&#160;memp.c'],['../memp_8h.html#a9693e5b1ac2c6b9c0e7870522d45efa2',1,'memp_init(void):&#160;memp.c']]],
+  ['memp_5finit_5fpool_56',['memp_init_pool',['../memp_8c.html#a6416303426d05526bed33f241fa6ecd7',1,'memp_init_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#a6416303426d05526bed33f241fa6ecd7',1,'memp_init_pool(const struct memp_desc *desc):&#160;memp.c']]],
+  ['memp_5fmalloc_57',['memp_malloc',['../memp_8c.html#ac49689457203bfb872adf5428f96a3e7',1,'memp_malloc(memp_t type):&#160;memp.c'],['../memp_8h.html#ac49689457203bfb872adf5428f96a3e7',1,'memp_malloc(memp_t type):&#160;memp.c']]],
+  ['memp_5fmalloc_5fpool_58',['memp_malloc_pool',['../memp_8c.html#ab6bfb9562c3a77e329a888e59ef0ace3',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c'],['../memp__priv_8h.html#ab6bfb9562c3a77e329a888e59ef0ace3',1,'memp_malloc_pool(const struct memp_desc *desc):&#160;memp.c']]],
+  ['mld6_5finput_59',['mld6_input',['../mld6_8c.html#a7c190ca25432d466b28f607c3574a841',1,'mld6_input(struct pbuf *p, struct netif *inp):&#160;mld6.c'],['../mld6_8h.html#a7c190ca25432d466b28f607c3574a841',1,'mld6_input(struct pbuf *p, struct netif *inp):&#160;mld6.c']]],
+  ['mld6_5fjoingroup_60',['mld6_joingroup',['../group__mld6.html#ga53560ab6e47163e4888070830bf912a8',1,'mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga53560ab6e47163e4888070830bf912a8',1,'mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
+  ['mld6_5fjoingroup_5fnetif_61',['mld6_joingroup_netif',['../group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940',1,'mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga2ba41d575a56d27c0af0a08fb8724940',1,'mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
+  ['mld6_5fleavegroup_62',['mld6_leavegroup',['../group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5',1,'mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#ga946b830efc6fd795b07a0964dc7940e5',1,'mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
+  ['mld6_5fleavegroup_5fnetif_63',['mld6_leavegroup_netif',['../group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22',1,'mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c'],['../group__mld6.html#gab664062a15a3ae3e05282eacf4dc0a22',1,'mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr):&#160;mld6.c']]],
+  ['mld6_5flookfor_5fgroup_64',['mld6_lookfor_group',['../mld6_8c.html#a496197eef3f8b4c2a0fd49734aee07d6',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c'],['../mld6_8h.html#a496197eef3f8b4c2a0fd49734aee07d6',1,'mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr):&#160;mld6.c']]],
+  ['mld6_5freport_5fgroups_65',['mld6_report_groups',['../mld6_8c.html#a2a08b95a7b3c82da05df1a3b50629686',1,'mld6_report_groups(struct netif *netif):&#160;mld6.c'],['../mld6_8h.html#a2a08b95a7b3c82da05df1a3b50629686',1,'mld6_report_groups(struct netif *netif):&#160;mld6.c']]],
+  ['mld6_5fstop_66',['mld6_stop',['../mld6_8c.html#ab7197d123f21a8863b56cc3871fd5198',1,'mld6_stop(struct netif *netif):&#160;mld6.c'],['../mld6_8h.html#ab7197d123f21a8863b56cc3871fd5198',1,'mld6_stop(struct netif *netif):&#160;mld6.c']]],
+  ['mld6_5ftmr_67',['mld6_tmr',['../mld6_8c.html#a4ddb496d0a6a466df5665dbed8bd6274',1,'mld6_tmr(void):&#160;mld6.c'],['../mld6_8h.html#a4ddb496d0a6a466df5665dbed8bd6274',1,'mld6_tmr(void):&#160;mld6.c']]],
+  ['mqtt_5fclient_5fconnect_68',['mqtt_client_connect',['../group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0',1,'mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, mqtt_connection_cb_t cb, void *arg, const struct mqtt_connect_client_info_t *client_info):&#160;mqtt.c'],['../group__mqtt.html#gadf4d2a3f1b12fb6cbc020b126f3125f0',1,'mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ipaddr, u16_t port, mqtt_connection_cb_t cb, void *arg, const struct mqtt_connect_client_info_t *client_info):&#160;mqtt.c']]],
+  ['mqtt_5fclient_5ffree_69',['mqtt_client_free',['../group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882',1,'mqtt_client_free(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#gaa0fa1d985c322a9c91a51322db254882',1,'mqtt_client_free(mqtt_client_t *client):&#160;mqtt.c']]],
+  ['mqtt_5fclient_5fis_5fconnected_70',['mqtt_client_is_connected',['../group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5',1,'mqtt_client_is_connected(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#ga98f0fd168112b8b7db59bcd7a325a5c5',1,'mqtt_client_is_connected(mqtt_client_t *client):&#160;mqtt.c']]],
+  ['mqtt_5fclient_5fnew_71',['mqtt_client_new',['../group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7',1,'mqtt_client_new(void):&#160;mqtt.c'],['../group__mqtt.html#gac4bbe55b05232776d15b9a3b41cf43e7',1,'mqtt_client_new(void):&#160;mqtt.c']]],
+  ['mqtt_5fdisconnect_72',['mqtt_disconnect',['../group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6',1,'mqtt_disconnect(mqtt_client_t *client):&#160;mqtt.c'],['../group__mqtt.html#ga73d8dd718bce09bfaab452770b4f76e6',1,'mqtt_disconnect(mqtt_client_t *client):&#160;mqtt.c']]],
+  ['mqtt_5fpublish_73',['mqtt_publish',['../group__mqtt.html#gade9850d716e81fde572cb012be795d2f',1,'mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, mqtt_request_cb_t cb, void *arg):&#160;mqtt.c'],['../group__mqtt.html#gade9850d716e81fde572cb012be795d2f',1,'mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, mqtt_request_cb_t cb, void *arg):&#160;mqtt.c']]],
+  ['mqtt_5fset_5finpub_5fcallback_74',['mqtt_set_inpub_callback',['../group__mqtt.html#gafdfa0e65b217e92835d35858924565cf',1,'mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb, mqtt_incoming_data_cb_t data_cb, void *arg):&#160;mqtt.c'],['../group__mqtt.html#gafdfa0e65b217e92835d35858924565cf',1,'mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb, mqtt_incoming_data_cb_t data_cb, void *arg):&#160;mqtt.c']]],
+  ['mqtt_5fsub_5funsub_75',['mqtt_sub_unsub',['../group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103',1,'mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub):&#160;mqtt.c'],['../group__mqtt.html#gafdb39d4a9758f98c02451aaa9a9b3103',1,'mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub):&#160;mqtt.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_9.js b/doc/doxygen/output/html/search/functions_9.js
index 582f57a..eae082e 100644
--- a/doc/doxygen/output/html/search/functions_9.js
+++ b/doc/doxygen/output/html/search/functions_9.js
@@ -1,35 +1,91 @@
 var searchData=
 [
-  ['pbuf_5fadd_5fheader_0',['pbuf_add_header',['../pbuf_8c.html#a32dc14bd88dcafa25e627ab18e801815',1,'pbuf_add_header(struct pbuf *p, size_t header_size_increment):&#160;pbuf.c'],['../pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815',1,'pbuf_add_header(struct pbuf *p, size_t header_size_increment):&#160;pbuf.c']]],
-  ['pbuf_5fadd_5fheader_5fforce_1',['pbuf_add_header_force',['../pbuf_8c.html#ad4ef8c5fbbd1447db04f8f73923e7dee',1,'pbuf_add_header_force(struct pbuf *p, size_t header_size_increment):&#160;pbuf.c'],['../pbuf_8h.html#ad4ef8c5fbbd1447db04f8f73923e7dee',1,'pbuf_add_header_force(struct pbuf *p, size_t header_size_increment):&#160;pbuf.c']]],
-  ['pbuf_5falloc_2',['pbuf_alloc',['../group__pbuf.html#ga8bb9c5d54a06995b1c67ce695ead9969',1,'pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type):&#160;pbuf.c'],['../group__pbuf.html#ga8bb9c5d54a06995b1c67ce695ead9969',1,'pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type):&#160;pbuf.c']]],
-  ['pbuf_5falloc_5freference_3',['pbuf_alloc_reference',['../group__pbuf.html#ga6cff29c18a60a7f2828457fa61e3accb',1,'pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type):&#160;pbuf.c'],['../group__pbuf.html#ga6cff29c18a60a7f2828457fa61e3accb',1,'pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type):&#160;pbuf.c']]],
-  ['pbuf_5falloced_5fcustom_4',['pbuf_alloced_custom',['../group__pbuf.html#ga5bcdac7b3aef4d60460ee05dec51db5f',1,'pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, void *payload_mem, u16_t payload_mem_len):&#160;pbuf.c'],['../group__pbuf.html#ga5bcdac7b3aef4d60460ee05dec51db5f',1,'pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, void *payload_mem, u16_t payload_mem_len):&#160;pbuf.c']]],
-  ['pbuf_5fcat_5',['pbuf_cat',['../group__pbuf.html#ga82429084fe29015509c9b4a072707cd4',1,'pbuf_cat(struct pbuf *h, struct pbuf *t):&#160;pbuf.c'],['../group__pbuf.html#ga82429084fe29015509c9b4a072707cd4',1,'pbuf_cat(struct pbuf *head, struct pbuf *tail):&#160;pbuf.c']]],
-  ['pbuf_5fchain_6',['pbuf_chain',['../group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891',1,'pbuf_chain(struct pbuf *h, struct pbuf *t):&#160;pbuf.c'],['../group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891',1,'pbuf_chain(struct pbuf *head, struct pbuf *tail):&#160;pbuf.c']]],
-  ['pbuf_5fclen_7',['pbuf_clen',['../pbuf_8c.html#a5df7ac5ae59012fe9aeddba375a72190',1,'pbuf_clen(const struct pbuf *p):&#160;pbuf.c'],['../pbuf_8h.html#a5df7ac5ae59012fe9aeddba375a72190',1,'pbuf_clen(const struct pbuf *p):&#160;pbuf.c']]],
-  ['pbuf_5fclone_8',['pbuf_clone',['../group__pbuf.html#gac6842a5d8268606f9608bae15d652a22',1,'pbuf_clone(pbuf_layer layer, pbuf_type type, struct pbuf *p):&#160;pbuf.c'],['../group__pbuf.html#gac6842a5d8268606f9608bae15d652a22',1,'pbuf_clone(pbuf_layer l, pbuf_type type, struct pbuf *p):&#160;pbuf.c']]],
-  ['pbuf_5fcoalesce_9',['pbuf_coalesce',['../group__pbuf.html#ga031469589fa95ece3bf1c136d1509eac',1,'pbuf_coalesce(struct pbuf *p, pbuf_layer layer):&#160;pbuf.c'],['../group__pbuf.html#ga031469589fa95ece3bf1c136d1509eac',1,'pbuf_coalesce(struct pbuf *p, pbuf_layer layer):&#160;pbuf.c']]],
-  ['pbuf_5fcopy_10',['pbuf_copy',['../group__pbuf.html#gaba88511dee3df4b631fde691f421320d',1,'pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from):&#160;pbuf.c'],['../group__pbuf.html#gaba88511dee3df4b631fde691f421320d',1,'pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from):&#160;pbuf.c']]],
-  ['pbuf_5fcopy_5fpartial_11',['pbuf_copy_partial',['../group__pbuf.html#gac2f1f58fd36042e82af46f5015720899',1,'pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#gac2f1f58fd36042e82af46f5015720899',1,'pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset):&#160;pbuf.c']]],
-  ['pbuf_5fcopy_5fpartial_5fpbuf_12',['pbuf_copy_partial_pbuf',['../group__pbuf.html#gadded8d23ed42840f2eb7fef7244dde95',1,'pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#gadded8d23ed42840f2eb7fef7244dde95',1,'pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset):&#160;pbuf.c']]],
-  ['pbuf_5fdechain_13',['pbuf_dechain',['../pbuf_8c.html#ace8aac12c3ebe16262c2202bd5eb02ab',1,'pbuf_dechain(struct pbuf *p):&#160;pbuf.c'],['../pbuf_8h.html#ace8aac12c3ebe16262c2202bd5eb02ab',1,'pbuf_dechain(struct pbuf *p):&#160;pbuf.c']]],
-  ['pbuf_5ffree_14',['pbuf_free',['../group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b',1,'pbuf_free(struct pbuf *p):&#160;pbuf.c'],['../group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b',1,'pbuf_free(struct pbuf *p):&#160;pbuf.c']]],
-  ['pbuf_5ffree_5fcallback_15',['pbuf_free_callback',['../tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c',1,'pbuf_free_callback(struct pbuf *p):&#160;tcpip.c'],['../tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c',1,'pbuf_free_callback(struct pbuf *p):&#160;tcpip.c']]],
-  ['pbuf_5ffree_5fheader_16',['pbuf_free_header',['../pbuf_8c.html#ab0a834127db093fcb6ffc48d966de318',1,'pbuf_free_header(struct pbuf *q, u16_t size):&#160;pbuf.c'],['../pbuf_8h.html#ab0a834127db093fcb6ffc48d966de318',1,'pbuf_free_header(struct pbuf *q, u16_t size):&#160;pbuf.c']]],
-  ['pbuf_5fget_5fat_17',['pbuf_get_at',['../group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6',1,'pbuf_get_at(const struct pbuf *p, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6',1,'pbuf_get_at(const struct pbuf *p, u16_t offset):&#160;pbuf.c']]],
-  ['pbuf_5fget_5fcontiguous_18',['pbuf_get_contiguous',['../group__pbuf.html#ga6da6c83929df1b736b107e89faa8a8a2',1,'pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#ga6da6c83929df1b736b107e89faa8a8a2',1,'pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset):&#160;pbuf.c']]],
-  ['pbuf_5fheader_19',['pbuf_header',['../pbuf_8c.html#a0f81deff4a0e6e8e0ff161a7b9871449',1,'pbuf_header(struct pbuf *p, s16_t header_size_increment):&#160;pbuf.c'],['../pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00',1,'pbuf_header(struct pbuf *p, s16_t header_size):&#160;pbuf.c']]],
-  ['pbuf_5fheader_5fforce_20',['pbuf_header_force',['../pbuf_8c.html#ad0e64d6fbc423593461063da97da9ce6',1,'pbuf_header_force(struct pbuf *p, s16_t header_size_increment):&#160;pbuf.c'],['../pbuf_8h.html#a27480c41c34021d4417691d327163626',1,'pbuf_header_force(struct pbuf *p, s16_t header_size):&#160;pbuf.c']]],
-  ['pbuf_5fmemcmp_21',['pbuf_memcmp',['../group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974',1,'pbuf_memcmp(const struct pbuf *p, u16_t offset, const void *s2, u16_t n):&#160;pbuf.c'],['../group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974',1,'pbuf_memcmp(const struct pbuf *p, u16_t offset, const void *s2, u16_t n):&#160;pbuf.c']]],
-  ['pbuf_5fmemfind_22',['pbuf_memfind',['../group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448',1,'pbuf_memfind(const struct pbuf *p, const void *mem, u16_t mem_len, u16_t start_offset):&#160;pbuf.c'],['../group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448',1,'pbuf_memfind(const struct pbuf *p, const void *mem, u16_t mem_len, u16_t start_offset):&#160;pbuf.c']]],
-  ['pbuf_5fput_5fat_23',['pbuf_put_at',['../group__pbuf.html#gaf76863707dc02993eae116574b1ea03f',1,'pbuf_put_at(struct pbuf *p, u16_t offset, u8_t data):&#160;pbuf.c'],['../group__pbuf.html#gaf76863707dc02993eae116574b1ea03f',1,'pbuf_put_at(struct pbuf *p, u16_t offset, u8_t data):&#160;pbuf.c']]],
-  ['pbuf_5frealloc_24',['pbuf_realloc',['../group__pbuf.html#ga50abfe830a33a1a47a562febee66015d',1,'pbuf_realloc(struct pbuf *p, u16_t new_len):&#160;pbuf.c'],['../group__pbuf.html#ga50abfe830a33a1a47a562febee66015d',1,'pbuf_realloc(struct pbuf *p, u16_t size):&#160;pbuf.c']]],
-  ['pbuf_5fref_25',['pbuf_ref',['../group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e',1,'pbuf_ref(struct pbuf *p):&#160;pbuf.c'],['../group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e',1,'pbuf_ref(struct pbuf *p):&#160;pbuf.c']]],
-  ['pbuf_5fremove_5fheader_26',['pbuf_remove_header',['../pbuf_8c.html#aca0cd8b3f08fbb5e35bc91a663083cc1',1,'pbuf_remove_header(struct pbuf *p, size_t header_size_decrement):&#160;pbuf.c'],['../pbuf_8h.html#ab65da7cd8f7449b3b2e57d7fa1a74ef4',1,'pbuf_remove_header(struct pbuf *p, size_t header_size):&#160;pbuf.c']]],
-  ['pbuf_5fskip_27',['pbuf_skip',['../group__pbuf.html#gabe4dfb2409c87a7c52c9a22a779f92e9',1,'pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset):&#160;pbuf.c'],['../group__pbuf.html#gabe4dfb2409c87a7c52c9a22a779f92e9',1,'pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset):&#160;pbuf.c']]],
-  ['pbuf_5fstrstr_28',['pbuf_strstr',['../pbuf_8c.html#a9ba3f7b705309ceadb147692fd5a1c7d',1,'pbuf_strstr(const struct pbuf *p, const char *substr):&#160;pbuf.c'],['../pbuf_8h.html#a9ba3f7b705309ceadb147692fd5a1c7d',1,'pbuf_strstr(const struct pbuf *p, const char *substr):&#160;pbuf.c']]],
-  ['pbuf_5ftake_29',['pbuf_take',['../group__pbuf.html#gad1e31e370271335b197272af2724ca85',1,'pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len):&#160;pbuf.c'],['../group__pbuf.html#gad1e31e370271335b197272af2724ca85',1,'pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len):&#160;pbuf.c']]],
-  ['pbuf_5ftake_5fat_30',['pbuf_take_at',['../group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44',1,'pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44',1,'pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset):&#160;pbuf.c']]],
-  ['pbuf_5ftry_5fget_5fat_31',['pbuf_try_get_at',['../group__pbuf.html#ga839f342803b0cf89049744124c5a98ad',1,'pbuf_try_get_at(const struct pbuf *p, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#ga839f342803b0cf89049744124c5a98ad',1,'pbuf_try_get_at(const struct pbuf *p, u16_t offset):&#160;pbuf.c']]]
+  ['nd6_5fadjust_5fmld_5fmembership_0',['nd6_adjust_mld_membership',['../nd6_8c.html#a27224542b8ffab81c2ed9f47752bb51e',1,'nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state):&#160;nd6.c'],['../nd6_8h.html#a27224542b8ffab81c2ed9f47752bb51e',1,'nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state):&#160;nd6.c']]],
+  ['nd6_5fcleanup_5fnetif_1',['nd6_cleanup_netif',['../nd6_8c.html#a84f9f52cab7ae37b4dd343536156dc73',1,'nd6_cleanup_netif(struct netif *netif):&#160;nd6.c'],['../nd6_8h.html#a84f9f52cab7ae37b4dd343536156dc73',1,'nd6_cleanup_netif(struct netif *netif):&#160;nd6.c']]],
+  ['nd6_5fclear_5fdestination_5fcache_2',['nd6_clear_destination_cache',['../nd6_8c.html#a64d7956cf2b0d45025b02661f3f62377',1,'nd6_clear_destination_cache(void):&#160;nd6.c'],['../nd6_8h.html#a64d7956cf2b0d45025b02661f3f62377',1,'nd6_clear_destination_cache(void):&#160;nd6.c']]],
+  ['nd6_5ffind_5froute_3',['nd6_find_route',['../nd6_8c.html#af4a71e18bb01efb89f9181676784efa7',1,'nd6_find_route(const ip6_addr_t *ip6addr):&#160;nd6.c'],['../nd6_8h.html#af4a71e18bb01efb89f9181676784efa7',1,'nd6_find_route(const ip6_addr_t *ip6addr):&#160;nd6.c']]],
+  ['nd6_5fget_5fdestination_5fmtu_4',['nd6_get_destination_mtu',['../nd6_8c.html#af226438f4f9b4aa7c3a2bbdf3c1e948c',1,'nd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif):&#160;nd6.c'],['../nd6_8h.html#af226438f4f9b4aa7c3a2bbdf3c1e948c',1,'nd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif):&#160;nd6.c']]],
+  ['nd6_5fget_5fnext_5fhop_5faddr_5for_5fqueue_5',['nd6_get_next_hop_addr_or_queue',['../nd6_8c.html#ae447c204ebbf71e6ebbc5ed727a73eb9',1,'nd6_get_next_hop_addr_or_queue(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr, const u8_t **hwaddrp):&#160;nd6.c'],['../nd6_8h.html#ae447c204ebbf71e6ebbc5ed727a73eb9',1,'nd6_get_next_hop_addr_or_queue(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr, const u8_t **hwaddrp):&#160;nd6.c']]],
+  ['nd6_5finput_6',['nd6_input',['../nd6_8c.html#abbb92837e715be0e7d99513a84995831',1,'nd6_input(struct pbuf *p, struct netif *inp):&#160;nd6.c'],['../nd6_8h.html#abbb92837e715be0e7d99513a84995831',1,'nd6_input(struct pbuf *p, struct netif *inp):&#160;nd6.c']]],
+  ['nd6_5freachability_5fhint_7',['nd6_reachability_hint',['../nd6_8c.html#a4959990cae26a3996f638ec996f046df',1,'nd6_reachability_hint(const ip6_addr_t *ip6addr):&#160;nd6.c'],['../nd6_8h.html#a4959990cae26a3996f638ec996f046df',1,'nd6_reachability_hint(const ip6_addr_t *ip6addr):&#160;nd6.c']]],
+  ['nd6_5frestart_5fnetif_8',['nd6_restart_netif',['../nd6_8c.html#a73d3192204da20be193e3c00c4a0cb54',1,'nd6_restart_netif(struct netif *netif):&#160;nd6.c'],['../nd6_8h.html#a73d3192204da20be193e3c00c4a0cb54',1,'nd6_restart_netif(struct netif *netif):&#160;nd6.c']]],
+  ['nd6_5ftmr_9',['nd6_tmr',['../nd6_8c.html#a754781b509e69c35a7a4ee7e380399fe',1,'nd6_tmr(void):&#160;nd6.c'],['../nd6_8h.html#a754781b509e69c35a7a4ee7e380399fe',1,'nd6_tmr(void):&#160;nd6.c']]],
+  ['netbiosns_5finit_10',['netbiosns_init',['../group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b',1,'netbiosns_init(void):&#160;netbiosns.c'],['../group__netbiosns.html#ga0c696ea25a79e97715c8217901cff66b',1,'netbiosns_init(void):&#160;netbiosns.c']]],
+  ['netbiosns_5fstop_11',['netbiosns_stop',['../group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806',1,'netbiosns_stop(void):&#160;netbiosns.c'],['../group__netbiosns.html#gaf82174943d25d67b04d44b7fba808806',1,'netbiosns_stop(void):&#160;netbiosns.c']]],
+  ['netbuf_5falloc_12',['netbuf_alloc',['../group__netbuf.html#ga1525001cbea926fdae88b0ac40bd6525',1,'netbuf_alloc(struct netbuf *buf, u16_t size):&#160;netbuf.c'],['../group__netbuf.html#ga1525001cbea926fdae88b0ac40bd6525',1,'netbuf_alloc(struct netbuf *buf, u16_t size):&#160;netbuf.c']]],
+  ['netbuf_5fchain_13',['netbuf_chain',['../group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602',1,'netbuf_chain(struct netbuf *head, struct netbuf *tail):&#160;netbuf.c'],['../group__netbuf.html#ga631e8bddd99b2397cd0b26973c659602',1,'netbuf_chain(struct netbuf *head, struct netbuf *tail):&#160;netbuf.c']]],
+  ['netbuf_5fdata_14',['netbuf_data',['../group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01',1,'netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len):&#160;netbuf.c'],['../group__netbuf.html#ga04a54a8476b37c2a8804fed679b6cc01',1,'netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len):&#160;netbuf.c']]],
+  ['netbuf_5fdelete_15',['netbuf_delete',['../group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d',1,'netbuf_delete(struct netbuf *buf):&#160;netbuf.c'],['../group__netbuf.html#ga9dfd3ddfe0ec65009cb140c68404b09d',1,'netbuf_delete(struct netbuf *buf):&#160;netbuf.c']]],
+  ['netbuf_5ffirst_16',['netbuf_first',['../group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51',1,'netbuf_first(struct netbuf *buf):&#160;netbuf.c'],['../group__netbuf.html#ga222ad2a2eb871d603b216a87e9f9be51',1,'netbuf_first(struct netbuf *buf):&#160;netbuf.c']]],
+  ['netbuf_5ffree_17',['netbuf_free',['../group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b',1,'netbuf_free(struct netbuf *buf):&#160;netbuf.c'],['../group__netbuf.html#ga02f82348ac23431a4b1512feae25f26b',1,'netbuf_free(struct netbuf *buf):&#160;netbuf.c']]],
+  ['netbuf_5fnew_18',['netbuf_new',['../group__netbuf.html#gade8afe4d5b849cec3784708d691be711',1,'netbuf_new(void):&#160;netbuf.c'],['../group__netbuf.html#gade8afe4d5b849cec3784708d691be711',1,'netbuf_new(void):&#160;netbuf.c']]],
+  ['netbuf_5fnext_19',['netbuf_next',['../group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715',1,'netbuf_next(struct netbuf *buf):&#160;netbuf.c'],['../group__netbuf.html#gaf4e3718d378bb11f2fc8af42ce7b3715',1,'netbuf_next(struct netbuf *buf):&#160;netbuf.c']]],
+  ['netbuf_5fref_20',['netbuf_ref',['../group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2',1,'netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size):&#160;netbuf.c'],['../group__netbuf.html#gabdffa0401e4473c9d9100ecbf50e46d2',1,'netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size):&#160;netbuf.c']]],
+  ['netconn_5faccept_21',['netconn_accept',['../group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69',1,'netconn_accept(struct netconn *conn, struct netconn **new_conn):&#160;api_lib.c'],['../group__netconn__tcp.html#ga13593148f60f7bbc6a505b567f175d69',1,'netconn_accept(struct netconn *conn, struct netconn **new_conn):&#160;api_lib.c']]],
+  ['netconn_5falloc_22',['netconn_alloc',['../api__msg_8c.html#a126d82a17c302d883f4131379abd1430',1,'netconn_alloc(enum netconn_type t, netconn_callback callback):&#160;api_msg.c'],['../api__msg_8h.html#a126d82a17c302d883f4131379abd1430',1,'netconn_alloc(enum netconn_type t, netconn_callback callback):&#160;api_msg.c']]],
+  ['netconn_5fbind_23',['netconn_bind',['../group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230',1,'netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port):&#160;api_lib.c'],['../group__netconn__common.html#ga63bcc4d7bd150674fa953a1253fa6230',1,'netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port):&#160;api_lib.c']]],
+  ['netconn_5fbind_5fif_24',['netconn_bind_if',['../group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5',1,'netconn_bind_if(struct netconn *conn, u8_t if_idx):&#160;api_lib.c'],['../group__netconn__common.html#gaa78479deeedcecd3bacade387ac40cc5',1,'netconn_bind_if(struct netconn *conn, u8_t if_idx):&#160;api_lib.c']]],
+  ['netconn_5fclose_25',['netconn_close',['../group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624',1,'netconn_close(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__tcp.html#ga25bb1c1c9928f91f53149a026e2e2624',1,'netconn_close(struct netconn *conn):&#160;api_lib.c']]],
+  ['netconn_5fconnect_26',['netconn_connect',['../group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77',1,'netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port):&#160;api_lib.c'],['../group__netconn__common.html#gacba7f74d973872ad0b88b9a96098cf77',1,'netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port):&#160;api_lib.c']]],
+  ['netconn_5fdelete_27',['netconn_delete',['../group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403',1,'netconn_delete(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__common.html#gab411221f912a6d9e4c82ac3963989403',1,'netconn_delete(struct netconn *conn):&#160;api_lib.c']]],
+  ['netconn_5fdisconnect_28',['netconn_disconnect',['../group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402',1,'netconn_disconnect(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__udp.html#ga90bb4c4d1af6602a655b78fce0520402',1,'netconn_disconnect(struct netconn *conn):&#160;api_lib.c']]],
+  ['netconn_5ferr_29',['netconn_err',['../group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4',1,'netconn_err(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__common.html#gab9eccae90351eb6c3d2ca690068445d4',1,'netconn_err(struct netconn *conn):&#160;api_lib.c']]],
+  ['netconn_5ffree_30',['netconn_free',['../api__msg_8c.html#a875b82ad129bdec1c6f2c21cbeedc48b',1,'netconn_free(struct netconn *conn):&#160;api_msg.c'],['../api__msg_8h.html#a875b82ad129bdec1c6f2c21cbeedc48b',1,'netconn_free(struct netconn *conn):&#160;api_msg.c']]],
+  ['netconn_5fgetaddr_31',['netconn_getaddr',['../api__lib_8c.html#a28430d1d86733f1bf98dc31305c42104',1,'netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local):&#160;api_lib.c'],['../api_8h.html#a28430d1d86733f1bf98dc31305c42104',1,'netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local):&#160;api_lib.c']]],
+  ['netconn_5fgethostbyname_5faddrtype_32',['netconn_gethostbyname_addrtype',['../group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5',1,'netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype):&#160;api_lib.c'],['../group__netconn__common.html#gafb3494b149dff96ed8d1acb770ab52f5',1,'netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype):&#160;api_lib.c']]],
+  ['netconn_5fjoin_5fleave_5fgroup_33',['netconn_join_leave_group',['../group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed',1,'netconn_join_leave_group(struct netconn *conn, const ip_addr_t *multiaddr, const ip_addr_t *netif_addr, enum netconn_igmp join_or_leave):&#160;api_lib.c'],['../group__netconn__udp.html#gaaaf2f92eeb38dca70b3e6ad98c3c45ed',1,'netconn_join_leave_group(struct netconn *conn, const ip_addr_t *multiaddr, const ip_addr_t *netif_addr, enum netconn_igmp join_or_leave):&#160;api_lib.c']]],
+  ['netconn_5fjoin_5fleave_5fgroup_5fnetif_34',['netconn_join_leave_group_netif',['../group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b',1,'netconn_join_leave_group_netif(struct netconn *conn, const ip_addr_t *multiaddr, u8_t if_idx, enum netconn_igmp join_or_leave):&#160;api_lib.c'],['../group__netconn__udp.html#ga5db2a1cf06a5fbb36f433e637da8729b',1,'netconn_join_leave_group_netif(struct netconn *conn, const ip_addr_t *multiaddr, u8_t if_idx, enum netconn_igmp join_or_leave):&#160;api_lib.c']]],
+  ['netconn_5flisten_5fwith_5fbacklog_35',['netconn_listen_with_backlog',['../group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d',1,'netconn_listen_with_backlog(struct netconn *conn, u8_t backlog):&#160;api_lib.c'],['../group__netconn__tcp.html#ga84333ba8e7cdf45558d2b4795f53265d',1,'netconn_listen_with_backlog(struct netconn *conn, u8_t backlog):&#160;api_lib.c']]],
+  ['netconn_5fnew_5fwith_5fproto_5fand_5fcallback_36',['netconn_new_with_proto_and_callback',['../api__lib_8c.html#a42711660e5030bc0dff779f3cea4178e',1,'netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback):&#160;api_lib.c'],['../api_8h.html#a42711660e5030bc0dff779f3cea4178e',1,'netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback):&#160;api_lib.c']]],
+  ['netconn_5fprepare_5fdelete_37',['netconn_prepare_delete',['../group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0',1,'netconn_prepare_delete(struct netconn *conn):&#160;api_lib.c'],['../group__netconn__common.html#gad5c079af0ad791a92fe9dade375744f0',1,'netconn_prepare_delete(struct netconn *conn):&#160;api_lib.c']]],
+  ['netconn_5frecv_38',['netconn_recv',['../group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf',1,'netconn_recv(struct netconn *conn, struct netbuf **new_buf):&#160;api_lib.c'],['../group__netconn__common.html#ga50490bab058f4e740798beffcf48cabf',1,'netconn_recv(struct netconn *conn, struct netbuf **new_buf):&#160;api_lib.c']]],
+  ['netconn_5frecv_5ftcp_5fpbuf_39',['netconn_recv_tcp_pbuf',['../group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490',1,'netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf):&#160;api_lib.c'],['../group__netconn__tcp.html#ga6893cb7648733d1f05696bac94e10490',1,'netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf):&#160;api_lib.c']]],
+  ['netconn_5frecv_5ftcp_5fpbuf_5fflags_40',['netconn_recv_tcp_pbuf_flags',['../group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294',1,'netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags):&#160;api_lib.c'],['../group__netconn__tcp.html#gabb8a242c445ef928c23258a2b2344294',1,'netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags):&#160;api_lib.c']]],
+  ['netconn_5frecv_5fudp_5fraw_5fnetbuf_41',['netconn_recv_udp_raw_netbuf',['../api__lib_8c.html#a805a90b546c5a149f04782351633979b',1,'netconn_recv_udp_raw_netbuf(struct netconn *conn, struct netbuf **new_buf):&#160;api_lib.c'],['../api_8h.html#a805a90b546c5a149f04782351633979b',1,'netconn_recv_udp_raw_netbuf(struct netconn *conn, struct netbuf **new_buf):&#160;api_lib.c']]],
+  ['netconn_5frecv_5fudp_5fraw_5fnetbuf_5fflags_42',['netconn_recv_udp_raw_netbuf_flags',['../api__lib_8c.html#a505c3b8e400babf9681e09c945b7f421',1,'netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags):&#160;api_lib.c'],['../api_8h.html#a505c3b8e400babf9681e09c945b7f421',1,'netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags):&#160;api_lib.c']]],
+  ['netconn_5fsend_43',['netconn_send',['../group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238',1,'netconn_send(struct netconn *conn, struct netbuf *buf):&#160;api_lib.c'],['../group__netconn__udp.html#gac4d4d10153d47c80a783c34b27c66238',1,'netconn_send(struct netconn *conn, struct netbuf *buf):&#160;api_lib.c']]],
+  ['netconn_5fsendto_44',['netconn_sendto',['../group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c',1,'netconn_sendto(struct netconn *conn, struct netbuf *buf, const ip_addr_t *addr, u16_t port):&#160;api_lib.c'],['../group__netconn__udp.html#ga8e1d852119bda1e1b602c2995282ef0c',1,'netconn_sendto(struct netconn *conn, struct netbuf *buf, const ip_addr_t *addr, u16_t port):&#160;api_lib.c']]],
+  ['netconn_5fshutdown_45',['netconn_shutdown',['../group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63',1,'netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx):&#160;api_lib.c'],['../group__netconn__tcp.html#ga6ec6b2cf7b0f59e9371e38ae7dea2a63',1,'netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx):&#160;api_lib.c']]],
+  ['netconn_5fwrite_5fpartly_46',['netconn_write_partly',['../group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf',1,'netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, u8_t apiflags, size_t *bytes_written):&#160;api_lib.c'],['../group__netconn__tcp.html#gacf9ce6f71652739d6be2ca83f7c423bf',1,'netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, u8_t apiflags, size_t *bytes_written):&#160;api_lib.c']]],
+  ['netconn_5fwrite_5fvectors_5fpartly_47',['netconn_write_vectors_partly',['../api__lib_8c.html#a992b4fe8a855fd94861738f7260d0a32',1,'netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt, u8_t apiflags, size_t *bytes_written):&#160;api_lib.c'],['../api_8h.html#a992b4fe8a855fd94861738f7260d0a32',1,'netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt, u8_t apiflags, size_t *bytes_written):&#160;api_lib.c']]],
+  ['netif_5fadd_48',['netif_add',['../group__netif.html#ga22055759a25f5d6cea7e7deab0a07434',1,'netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c'],['../group__netif.html#ga22055759a25f5d6cea7e7deab0a07434',1,'netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c']]],
+  ['netif_5fadd_5fext_5fcallback_49',['netif_add_ext_callback',['../group__netif.html#ga3efc2b72f75936d50708247420c9d1d9',1,'netif_add_ext_callback(netif_ext_callback_t *callback, netif_ext_callback_fn fn):&#160;netif.c'],['../group__netif.html#ga3efc2b72f75936d50708247420c9d1d9',1,'netif_add_ext_callback(netif_ext_callback_t *callback, netif_ext_callback_fn fn):&#160;netif.c']]],
+  ['netif_5fadd_5fip6_5faddress_50',['netif_add_ip6_address',['../group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327',1,'netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx):&#160;netif.c'],['../group__netif__ip6.html#gab0727fba5f5b3fed8d7013775506f327',1,'netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx):&#160;netif.c']]],
+  ['netif_5fadd_5fnoaddr_51',['netif_add_noaddr',['../group__netif.html#gafcb3925fb117375739abf97f3a856bcd',1,'netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c'],['../group__netif.html#gafcb3925fb117375739abf97f3a856bcd',1,'netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input):&#160;netif.c']]],
+  ['netif_5falloc_5fclient_5fdata_5fid_52',['netif_alloc_client_data_id',['../group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978',1,'netif_alloc_client_data_id(void):&#160;netif.c'],['../group__netif__cd.html#ga55d62d43b5a9a5527f0116ec38369978',1,'netif_alloc_client_data_id(void):&#160;netif.c']]],
+  ['netif_5fcreate_5fip6_5flinklocal_5faddress_53',['netif_create_ip6_linklocal_address',['../group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9',1,'netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit):&#160;netif.c'],['../group__netif__ip6.html#gae864211a5eb052deb5da7bc7e3427fb9',1,'netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit):&#160;netif.c']]],
+  ['netif_5ffind_54',['netif_find',['../group__netif.html#ga3c82d1c742338828b2f4349a75bb84de',1,'netif_find(const char *name):&#160;netif.c'],['../group__netif.html#ga3c82d1c742338828b2f4349a75bb84de',1,'netif_find(const char *name):&#160;netif.c']]],
+  ['netif_5fget_5fby_5findex_55',['netif_get_by_index',['../group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a',1,'netif_get_by_index(u8_t idx):&#160;netif.c'],['../group__netif.html#gaa934434420c0dea7b5cfe6df67f8c77a',1,'netif_get_by_index(u8_t idx):&#160;netif.c']]],
+  ['netif_5fget_5fip6_5faddr_5fmatch_56',['netif_get_ip6_addr_match',['../netif_8c.html#a0ec111195bcc452f77895ad35aedd7dc',1,'netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr):&#160;netif.c'],['../netif_8h.html#a0ec111195bcc452f77895ad35aedd7dc',1,'netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr):&#160;netif.c']]],
+  ['netif_5findex_5fto_5fname_57',['netif_index_to_name',['../group__netif.html#ga0e755cb6624d3365551eeed5430fa226',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c'],['../group__netif.html#ga0e755cb6624d3365551eeed5430fa226',1,'netif_index_to_name(u8_t idx, char *name):&#160;netif.c']]],
+  ['netif_5finput_58',['netif_input',['../group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385',1,'netif_input(struct pbuf *p, struct netif *inp):&#160;netif.c'],['../group__lwip__nosys.html#ga5532f93d68c874fb99c681bff2165385',1,'netif_input(struct pbuf *p, struct netif *inp):&#160;netif.c']]],
+  ['netif_5finvoke_5fext_5fcallback_59',['netif_invoke_ext_callback',['../netif_8c.html#a75b5298b1c3c3794747d78a4ce95d81c',1,'netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args):&#160;netif.c'],['../netif_8h.html#a75b5298b1c3c3794747d78a4ce95d81c',1,'netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args):&#160;netif.c']]],
+  ['netif_5fip6_5faddr_5fset_60',['netif_ip6_addr_set',['../group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb',1,'netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6):&#160;netif.c'],['../group__netif__ip6.html#gae21572fdbd8664d22a1b281a6c31c9bb',1,'netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6):&#160;netif.c']]],
+  ['netif_5fip6_5faddr_5fset_5fstate_61',['netif_ip6_addr_set_state',['../group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f',1,'netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state):&#160;netif.c'],['../group__netif__ip6.html#ga9cde7286535c7f037a9b16052561b91f',1,'netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state):&#160;netif.c']]],
+  ['netif_5floop_5foutput_62',['netif_loop_output',['../group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2',1,'netif_loop_output(struct netif *netif, struct pbuf *p):&#160;netif.c'],['../group__netif.html#ga691f1cc7c9778ffa62a3843c184404b2',1,'netif_loop_output(struct netif *netif, struct pbuf *p):&#160;netif.c']]],
+  ['netif_5fmdns_5fdata_63',['netif_mdns_data',['../mdns_8c.html#af15fa5b6331bec605f68f53cb87f58fa',1,'netif_mdns_data(struct netif *netif):&#160;mdns.c'],['../mdns__priv_8h.html#af15fa5b6331bec605f68f53cb87f58fa',1,'netif_mdns_data(struct netif *netif):&#160;mdns.c']]],
+  ['netif_5fname_5fto_5findex_64',['netif_name_to_index',['../group__netif.html#gac763a1f647fb9e8af4254418e813a6ae',1,'netif_name_to_index(const char *name):&#160;netif.c'],['../group__netif.html#gac763a1f647fb9e8af4254418e813a6ae',1,'netif_name_to_index(const char *name):&#160;netif.c']]],
+  ['netif_5fpoll_65',['netif_poll',['../netif_8c.html#a0fbaed78253d21e1b54e65651da3e327',1,'netif_poll(struct netif *netif):&#160;netif.c'],['../netif_8h.html#a0fbaed78253d21e1b54e65651da3e327',1,'netif_poll(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fremove_66',['netif_remove',['../group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979',1,'netif_remove(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga9c6e541f0c184e1ea61a5cd8afe3e979',1,'netif_remove(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fremove_5fext_5fcallback_67',['netif_remove_ext_callback',['../group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716',1,'netif_remove_ext_callback(netif_ext_callback_t *callback):&#160;netif.c'],['../group__netif.html#ga1d91ac26b0993a9a3466b317ab5ec716',1,'netif_remove_ext_callback(netif_ext_callback_t *callback):&#160;netif.c']]],
+  ['netif_5fset_5faddr_68',['netif_set_addr',['../group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1',1,'netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netif.c'],['../group__netif__ip4.html#ga85e31a68e96390dab2feffb11f4948a1',1,'netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netif.c']]],
+  ['netif_5fset_5fdefault_69',['netif_set_default',['../group__netif.html#gac90f290edd005238d62aa94c4ac9dea3',1,'netif_set_default(struct netif *netif):&#160;netif.c'],['../group__netif.html#gac90f290edd005238d62aa94c4ac9dea3',1,'netif_set_default(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fset_5fdown_70',['netif_set_down',['../group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf',1,'netif_set_down(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga641d07ed8c31fe5306bc01605a6790cf',1,'netif_set_down(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fset_5fgw_71',['netif_set_gw',['../group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520',1,'netif_set_gw(struct netif *netif, const ip4_addr_t *gw):&#160;netif.c'],['../group__netif__ip4.html#ga841876c274c3c90898579f9e12f3b520',1,'netif_set_gw(struct netif *netif, const ip4_addr_t *gw):&#160;netif.c']]],
+  ['netif_5fset_5fipaddr_72',['netif_set_ipaddr',['../group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca',1,'netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr):&#160;netif.c'],['../group__netif__ip4.html#ga73b043a7ec0e4899aba8433ec9064cca',1,'netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr):&#160;netif.c']]],
+  ['netif_5fset_5flink_5fcallback_73',['netif_set_link_callback',['../group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4',1,'netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback):&#160;netif.c'],['../group__netif.html#ga1cd45910add90e267e33d680bbc3f0f4',1,'netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback):&#160;netif.c']]],
+  ['netif_5fset_5flink_5fdown_74',['netif_set_link_down',['../group__netif.html#ga34e37a1e8e358760dc1c43887922c7db',1,'netif_set_link_down(struct netif *netif):&#160;netif.c'],['../group__netif.html#ga34e37a1e8e358760dc1c43887922c7db',1,'netif_set_link_down(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fset_5flink_5fup_75',['netif_set_link_up',['../group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea',1,'netif_set_link_up(struct netif *netif):&#160;netif.c'],['../group__netif.html#gae0d2975f189277990e9d5276fdd9e9ea',1,'netif_set_link_up(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fset_5fnetmask_76',['netif_set_netmask',['../group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53',1,'netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask):&#160;netif.c'],['../group__netif__ip4.html#ga0bdd7c057c2f55f670853e3906014a53',1,'netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask):&#160;netif.c']]],
+  ['netif_5fset_5fremove_5fcallback_77',['netif_set_remove_callback',['../group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce',1,'netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback):&#160;netif.c'],['../group__netif.html#ga319c88da0fdf25c1fee1595299bc35ce',1,'netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback):&#160;netif.c']]],
+  ['netif_5fset_5fstatus_5fcallback_78',['netif_set_status_callback',['../group__netif.html#gadc8787b23ac0ee023979cbadf87813d4',1,'netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback):&#160;netif.c'],['../group__netif.html#gadc8787b23ac0ee023979cbadf87813d4',1,'netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback):&#160;netif.c']]],
+  ['netif_5fset_5fup_79',['netif_set_up',['../group__netif.html#gaf19693be401a265a52d2a56c65753121',1,'netif_set_up(struct netif *netif):&#160;netif.c'],['../group__netif.html#gaf19693be401a265a52d2a56c65753121',1,'netif_set_up(struct netif *netif):&#160;netif.c']]],
+  ['netif_5fto_5fnum_80',['netif_to_num',['../snmp__core_8c.html#a871aa636806c7d68cbe24572598e59de',1,'netif_to_num(const struct netif *netif):&#160;snmp_core.c'],['../snmp__core_8h.html#a871aa636806c7d68cbe24572598e59de',1,'netif_to_num(const struct netif *netif):&#160;snmp_core.c']]],
+  ['netifapi_5farp_5fadd_81',['netifapi_arp_add',['../group__netifapi__arp.html#ga62b0bdbb3783eb27aa73485081306119',1,'netifapi.c']]],
+  ['netifapi_5farp_5fremove_82',['netifapi_arp_remove',['../group__netifapi__arp.html#ga037c3d05c19b4d467b6ce06eb4639ee8',1,'netifapi.c']]],
+  ['netifapi_5fnetif_5fadd_83',['netifapi_netif_add',['../group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519',1,'netifapi_netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netifapi.c'],['../group__netifapi__netif.html#gacc063c5a3071e34eec7376651e35a519',1,'netifapi_netif_add(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input):&#160;netifapi.c']]],
+  ['netifapi_5fnetif_5fcommon_84',['netifapi_netif_common',['../netifapi_8c.html#a26fd83042b53b2ff82e15262ed72f0a7',1,'netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc):&#160;netifapi.c'],['../netifapi_8h.html#a26fd83042b53b2ff82e15262ed72f0a7',1,'netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc):&#160;netifapi.c']]],
+  ['netifapi_5fnetif_5findex_5fto_5fname_85',['netifapi_netif_index_to_name',['../group__netifapi__netif.html#gab7914d77d0a89fd6c31048feb0bdafb6',1,'netifapi.c']]],
+  ['netifapi_5fnetif_5fname_5fto_5findex_86',['netifapi_netif_name_to_index',['../group__netifapi__netif.html#gad4a821182d01eafa4ca258f958fcb089',1,'netifapi.c']]],
+  ['netifapi_5fnetif_5fset_5faddr_87',['netifapi_netif_set_addr',['../group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973',1,'netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netifapi.c'],['../group__netifapi__netif.html#ga31755ea6dbb213236bfce19bcbe8c973',1,'netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw):&#160;netifapi.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_a.js b/doc/doxygen/output/html/search/functions_a.js
index 46beffd..582f57a 100644
--- a/doc/doxygen/output/html/search/functions_a.js
+++ b/doc/doxygen/output/html/search/functions_a.js
@@ -1,24 +1,35 @@
 var searchData=
 [
-  ['raw_5fbind_0',['raw_bind',['../group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4',1,'raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4',1,'raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c']]],
-  ['raw_5fbind_5fnetif_1',['raw_bind_netif',['../group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a',1,'raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif):&#160;raw.c'],['../group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a',1,'raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif):&#160;raw.c']]],
-  ['raw_5fconnect_2',['raw_connect',['../group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168',1,'raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168',1,'raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c']]],
-  ['raw_5fdisconnect_3',['raw_disconnect',['../group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef',1,'raw_disconnect(struct raw_pcb *pcb):&#160;raw.c'],['../group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef',1,'raw_disconnect(struct raw_pcb *pcb):&#160;raw.c']]],
-  ['raw_5finput_4',['raw_input',['../raw_8c.html#a03c4582d9ecf687e1f31d597c7889553',1,'raw_input(struct pbuf *p, struct netif *inp):&#160;raw.c'],['../raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553',1,'raw_input(struct pbuf *p, struct netif *inp):&#160;raw.c']]],
-  ['raw_5fnetif_5fip_5faddr_5fchanged_5',['raw_netif_ip_addr_changed',['../raw_8c.html#a61dc42f18e34800643000e48be6543ab',1,'raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;raw.c'],['../raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab',1,'raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;raw.c']]],
-  ['raw_5fnew_6',['raw_new',['../group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2',1,'raw_new(u8_t proto):&#160;raw.c'],['../group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2',1,'raw_new(u8_t proto):&#160;raw.c']]],
-  ['raw_5fnew_5fip_5ftype_7',['raw_new_ip_type',['../group__raw__raw.html#ga89697a092b3d72079f872a029e220eba',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c'],['../group__raw__raw.html#ga89697a092b3d72079f872a029e220eba',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c']]],
-  ['raw_5frecv_8',['raw_recv',['../group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426',1,'raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg):&#160;raw.c'],['../group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426',1,'raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg):&#160;raw.c']]],
-  ['raw_5fremove_9',['raw_remove',['../group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16',1,'raw_remove(struct raw_pcb *pcb):&#160;raw.c'],['../group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16',1,'raw_remove(struct raw_pcb *pcb):&#160;raw.c']]],
-  ['raw_5fsend_10',['raw_send',['../group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d',1,'raw_send(struct raw_pcb *pcb, struct pbuf *p):&#160;raw.c'],['../group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d',1,'raw_send(struct raw_pcb *pcb, struct pbuf *p):&#160;raw.c']]],
-  ['raw_5fsendto_11',['raw_sendto',['../group__raw__raw.html#ga09427456070fb610cc7795d23dedc159',1,'raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga09427456070fb610cc7795d23dedc159',1,'raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr):&#160;raw.c']]],
-  ['raw_5fsendto_5fif_5fsrc_12',['raw_sendto_if_src',['../group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1',1,'raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip):&#160;raw.c'],['../group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1',1,'raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip):&#160;raw.c']]],
-  ['rfc7668_5fif_5finit_13',['rfc7668_if_init',['../group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde',1,'rfc7668_if_init(struct netif *netif):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde',1,'rfc7668_if_init(struct netif *netif):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5finput_14',['rfc7668_input',['../group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197',1,'rfc7668_input(struct pbuf *p, struct netif *netif):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197',1,'rfc7668_input(struct pbuf *p, struct netif *netif):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5foutput_15',['rfc7668_output',['../group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0',1,'rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0',1,'rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5fcontext_16',['rfc7668_set_context',['../group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e',1,'rfc7668_set_context(u8_t index, const ip6_addr_t *context):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e',1,'rfc7668_set_context(u8_t idx, const ip6_addr_t *context):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5flocal_5faddr_5feui64_17',['rfc7668_set_local_addr_eui64',['../lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2',1,'rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2',1,'rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5flocal_5faddr_5fmac48_18',['rfc7668_set_local_addr_mac48',['../lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2',1,'rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2',1,'rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5fpeer_5faddr_5feui64_19',['rfc7668_set_peer_addr_eui64',['../lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593',1,'rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593',1,'rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len):&#160;lowpan6_ble.c']]],
-  ['rfc7668_5fset_5fpeer_5faddr_5fmac48_20',['rfc7668_set_peer_addr_mac48',['../lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0',1,'rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0',1,'rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr):&#160;lowpan6_ble.c']]]
+  ['pbuf_5fadd_5fheader_0',['pbuf_add_header',['../pbuf_8c.html#a32dc14bd88dcafa25e627ab18e801815',1,'pbuf_add_header(struct pbuf *p, size_t header_size_increment):&#160;pbuf.c'],['../pbuf_8h.html#a32dc14bd88dcafa25e627ab18e801815',1,'pbuf_add_header(struct pbuf *p, size_t header_size_increment):&#160;pbuf.c']]],
+  ['pbuf_5fadd_5fheader_5fforce_1',['pbuf_add_header_force',['../pbuf_8c.html#ad4ef8c5fbbd1447db04f8f73923e7dee',1,'pbuf_add_header_force(struct pbuf *p, size_t header_size_increment):&#160;pbuf.c'],['../pbuf_8h.html#ad4ef8c5fbbd1447db04f8f73923e7dee',1,'pbuf_add_header_force(struct pbuf *p, size_t header_size_increment):&#160;pbuf.c']]],
+  ['pbuf_5falloc_2',['pbuf_alloc',['../group__pbuf.html#ga8bb9c5d54a06995b1c67ce695ead9969',1,'pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type):&#160;pbuf.c'],['../group__pbuf.html#ga8bb9c5d54a06995b1c67ce695ead9969',1,'pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type):&#160;pbuf.c']]],
+  ['pbuf_5falloc_5freference_3',['pbuf_alloc_reference',['../group__pbuf.html#ga6cff29c18a60a7f2828457fa61e3accb',1,'pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type):&#160;pbuf.c'],['../group__pbuf.html#ga6cff29c18a60a7f2828457fa61e3accb',1,'pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type):&#160;pbuf.c']]],
+  ['pbuf_5falloced_5fcustom_4',['pbuf_alloced_custom',['../group__pbuf.html#ga5bcdac7b3aef4d60460ee05dec51db5f',1,'pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, void *payload_mem, u16_t payload_mem_len):&#160;pbuf.c'],['../group__pbuf.html#ga5bcdac7b3aef4d60460ee05dec51db5f',1,'pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, void *payload_mem, u16_t payload_mem_len):&#160;pbuf.c']]],
+  ['pbuf_5fcat_5',['pbuf_cat',['../group__pbuf.html#ga82429084fe29015509c9b4a072707cd4',1,'pbuf_cat(struct pbuf *h, struct pbuf *t):&#160;pbuf.c'],['../group__pbuf.html#ga82429084fe29015509c9b4a072707cd4',1,'pbuf_cat(struct pbuf *head, struct pbuf *tail):&#160;pbuf.c']]],
+  ['pbuf_5fchain_6',['pbuf_chain',['../group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891',1,'pbuf_chain(struct pbuf *h, struct pbuf *t):&#160;pbuf.c'],['../group__pbuf.html#ga831c9a72bda1d3bd4c7b96f5a0e3b891',1,'pbuf_chain(struct pbuf *head, struct pbuf *tail):&#160;pbuf.c']]],
+  ['pbuf_5fclen_7',['pbuf_clen',['../pbuf_8c.html#a5df7ac5ae59012fe9aeddba375a72190',1,'pbuf_clen(const struct pbuf *p):&#160;pbuf.c'],['../pbuf_8h.html#a5df7ac5ae59012fe9aeddba375a72190',1,'pbuf_clen(const struct pbuf *p):&#160;pbuf.c']]],
+  ['pbuf_5fclone_8',['pbuf_clone',['../group__pbuf.html#gac6842a5d8268606f9608bae15d652a22',1,'pbuf_clone(pbuf_layer layer, pbuf_type type, struct pbuf *p):&#160;pbuf.c'],['../group__pbuf.html#gac6842a5d8268606f9608bae15d652a22',1,'pbuf_clone(pbuf_layer l, pbuf_type type, struct pbuf *p):&#160;pbuf.c']]],
+  ['pbuf_5fcoalesce_9',['pbuf_coalesce',['../group__pbuf.html#ga031469589fa95ece3bf1c136d1509eac',1,'pbuf_coalesce(struct pbuf *p, pbuf_layer layer):&#160;pbuf.c'],['../group__pbuf.html#ga031469589fa95ece3bf1c136d1509eac',1,'pbuf_coalesce(struct pbuf *p, pbuf_layer layer):&#160;pbuf.c']]],
+  ['pbuf_5fcopy_10',['pbuf_copy',['../group__pbuf.html#gaba88511dee3df4b631fde691f421320d',1,'pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from):&#160;pbuf.c'],['../group__pbuf.html#gaba88511dee3df4b631fde691f421320d',1,'pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from):&#160;pbuf.c']]],
+  ['pbuf_5fcopy_5fpartial_11',['pbuf_copy_partial',['../group__pbuf.html#gac2f1f58fd36042e82af46f5015720899',1,'pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#gac2f1f58fd36042e82af46f5015720899',1,'pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset):&#160;pbuf.c']]],
+  ['pbuf_5fcopy_5fpartial_5fpbuf_12',['pbuf_copy_partial_pbuf',['../group__pbuf.html#gadded8d23ed42840f2eb7fef7244dde95',1,'pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#gadded8d23ed42840f2eb7fef7244dde95',1,'pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset):&#160;pbuf.c']]],
+  ['pbuf_5fdechain_13',['pbuf_dechain',['../pbuf_8c.html#ace8aac12c3ebe16262c2202bd5eb02ab',1,'pbuf_dechain(struct pbuf *p):&#160;pbuf.c'],['../pbuf_8h.html#ace8aac12c3ebe16262c2202bd5eb02ab',1,'pbuf_dechain(struct pbuf *p):&#160;pbuf.c']]],
+  ['pbuf_5ffree_14',['pbuf_free',['../group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b',1,'pbuf_free(struct pbuf *p):&#160;pbuf.c'],['../group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b',1,'pbuf_free(struct pbuf *p):&#160;pbuf.c']]],
+  ['pbuf_5ffree_5fcallback_15',['pbuf_free_callback',['../tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c',1,'pbuf_free_callback(struct pbuf *p):&#160;tcpip.c'],['../tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c',1,'pbuf_free_callback(struct pbuf *p):&#160;tcpip.c']]],
+  ['pbuf_5ffree_5fheader_16',['pbuf_free_header',['../pbuf_8c.html#ab0a834127db093fcb6ffc48d966de318',1,'pbuf_free_header(struct pbuf *q, u16_t size):&#160;pbuf.c'],['../pbuf_8h.html#ab0a834127db093fcb6ffc48d966de318',1,'pbuf_free_header(struct pbuf *q, u16_t size):&#160;pbuf.c']]],
+  ['pbuf_5fget_5fat_17',['pbuf_get_at',['../group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6',1,'pbuf_get_at(const struct pbuf *p, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#ga6d803d9945bffb7ad97743f2fa503da6',1,'pbuf_get_at(const struct pbuf *p, u16_t offset):&#160;pbuf.c']]],
+  ['pbuf_5fget_5fcontiguous_18',['pbuf_get_contiguous',['../group__pbuf.html#ga6da6c83929df1b736b107e89faa8a8a2',1,'pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#ga6da6c83929df1b736b107e89faa8a8a2',1,'pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset):&#160;pbuf.c']]],
+  ['pbuf_5fheader_19',['pbuf_header',['../pbuf_8c.html#a0f81deff4a0e6e8e0ff161a7b9871449',1,'pbuf_header(struct pbuf *p, s16_t header_size_increment):&#160;pbuf.c'],['../pbuf_8h.html#aaa17c1951cf2d207b6adfd3947d91f00',1,'pbuf_header(struct pbuf *p, s16_t header_size):&#160;pbuf.c']]],
+  ['pbuf_5fheader_5fforce_20',['pbuf_header_force',['../pbuf_8c.html#ad0e64d6fbc423593461063da97da9ce6',1,'pbuf_header_force(struct pbuf *p, s16_t header_size_increment):&#160;pbuf.c'],['../pbuf_8h.html#a27480c41c34021d4417691d327163626',1,'pbuf_header_force(struct pbuf *p, s16_t header_size):&#160;pbuf.c']]],
+  ['pbuf_5fmemcmp_21',['pbuf_memcmp',['../group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974',1,'pbuf_memcmp(const struct pbuf *p, u16_t offset, const void *s2, u16_t n):&#160;pbuf.c'],['../group__pbuf.html#ga2170ccbbb13238380dbb203ee1b85974',1,'pbuf_memcmp(const struct pbuf *p, u16_t offset, const void *s2, u16_t n):&#160;pbuf.c']]],
+  ['pbuf_5fmemfind_22',['pbuf_memfind',['../group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448',1,'pbuf_memfind(const struct pbuf *p, const void *mem, u16_t mem_len, u16_t start_offset):&#160;pbuf.c'],['../group__pbuf.html#ga18c164a6e4a24d89ea9eb7571a886448',1,'pbuf_memfind(const struct pbuf *p, const void *mem, u16_t mem_len, u16_t start_offset):&#160;pbuf.c']]],
+  ['pbuf_5fput_5fat_23',['pbuf_put_at',['../group__pbuf.html#gaf76863707dc02993eae116574b1ea03f',1,'pbuf_put_at(struct pbuf *p, u16_t offset, u8_t data):&#160;pbuf.c'],['../group__pbuf.html#gaf76863707dc02993eae116574b1ea03f',1,'pbuf_put_at(struct pbuf *p, u16_t offset, u8_t data):&#160;pbuf.c']]],
+  ['pbuf_5frealloc_24',['pbuf_realloc',['../group__pbuf.html#ga50abfe830a33a1a47a562febee66015d',1,'pbuf_realloc(struct pbuf *p, u16_t new_len):&#160;pbuf.c'],['../group__pbuf.html#ga50abfe830a33a1a47a562febee66015d',1,'pbuf_realloc(struct pbuf *p, u16_t size):&#160;pbuf.c']]],
+  ['pbuf_5fref_25',['pbuf_ref',['../group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e',1,'pbuf_ref(struct pbuf *p):&#160;pbuf.c'],['../group__pbuf.html#ga77f6bbd69e45e542014d9c547c7da74e',1,'pbuf_ref(struct pbuf *p):&#160;pbuf.c']]],
+  ['pbuf_5fremove_5fheader_26',['pbuf_remove_header',['../pbuf_8c.html#aca0cd8b3f08fbb5e35bc91a663083cc1',1,'pbuf_remove_header(struct pbuf *p, size_t header_size_decrement):&#160;pbuf.c'],['../pbuf_8h.html#ab65da7cd8f7449b3b2e57d7fa1a74ef4',1,'pbuf_remove_header(struct pbuf *p, size_t header_size):&#160;pbuf.c']]],
+  ['pbuf_5fskip_27',['pbuf_skip',['../group__pbuf.html#gabe4dfb2409c87a7c52c9a22a779f92e9',1,'pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset):&#160;pbuf.c'],['../group__pbuf.html#gabe4dfb2409c87a7c52c9a22a779f92e9',1,'pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset):&#160;pbuf.c']]],
+  ['pbuf_5fstrstr_28',['pbuf_strstr',['../pbuf_8c.html#a9ba3f7b705309ceadb147692fd5a1c7d',1,'pbuf_strstr(const struct pbuf *p, const char *substr):&#160;pbuf.c'],['../pbuf_8h.html#a9ba3f7b705309ceadb147692fd5a1c7d',1,'pbuf_strstr(const struct pbuf *p, const char *substr):&#160;pbuf.c']]],
+  ['pbuf_5ftake_29',['pbuf_take',['../group__pbuf.html#gad1e31e370271335b197272af2724ca85',1,'pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len):&#160;pbuf.c'],['../group__pbuf.html#gad1e31e370271335b197272af2724ca85',1,'pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len):&#160;pbuf.c']]],
+  ['pbuf_5ftake_5fat_30',['pbuf_take_at',['../group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44',1,'pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#gae1cf2bf7454ff87ff377b0b2262f9b44',1,'pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset):&#160;pbuf.c']]],
+  ['pbuf_5ftry_5fget_5fat_31',['pbuf_try_get_at',['../group__pbuf.html#ga839f342803b0cf89049744124c5a98ad',1,'pbuf_try_get_at(const struct pbuf *p, u16_t offset):&#160;pbuf.c'],['../group__pbuf.html#ga839f342803b0cf89049744124c5a98ad',1,'pbuf_try_get_at(const struct pbuf *p, u16_t offset):&#160;pbuf.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_b.js b/doc/doxygen/output/html/search/functions_b.js
index b55a2f3..46beffd 100644
--- a/doc/doxygen/output/html/search/functions_b.js
+++ b/doc/doxygen/output/html/search/functions_b.js
@@ -1,120 +1,24 @@
 var searchData=
 [
-  ['slipif_5finit_0',['slipif_init',['../group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3',1,'slipif_init(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3',1,'slipif_init(struct netif *netif):&#160;slipif.c']]],
-  ['slipif_5fpoll_1',['slipif_poll',['../group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6',1,'slipif_poll(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6',1,'slipif_poll(struct netif *netif):&#160;slipif.c']]],
-  ['slipif_5fprocess_5frxqueue_2',['slipif_process_rxqueue',['../group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946',1,'slipif_process_rxqueue(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946',1,'slipif_process_rxqueue(struct netif *netif):&#160;slipif.c']]],
-  ['slipif_5freceived_5fbyte_3',['slipif_received_byte',['../group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3',1,'slipif_received_byte(struct netif *netif, u8_t data):&#160;slipif.c'],['../group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3',1,'slipif_received_byte(struct netif *netif, u8_t data):&#160;slipif.c']]],
-  ['slipif_5freceived_5fbytes_4',['slipif_received_bytes',['../group__slipif.html#gabbee48569a513c90fe154632038eb6d6',1,'slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len):&#160;slipif.c'],['../group__slipif.html#gabbee48569a513c90fe154632038eb6d6',1,'slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len):&#160;slipif.c']]],
-  ['smtp_5fsend_5fmail_5',['smtp_send_mail',['../group__smtp.html#gae43119480c4146df9eeff7ae80c767f7',1,'smtp_send_mail(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c'],['../group__smtp.html#gae43119480c4146df9eeff7ae80c767f7',1,'smtp_send_mail(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c']]],
-  ['smtp_5fsend_5fmail_5fint_6',['smtp_send_mail_int',['../group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243',1,'smtp_send_mail_int(void *arg):&#160;smtp.c'],['../group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243',1,'smtp_send_mail_int(void *arg):&#160;smtp.c']]],
-  ['smtp_5fsend_5fmail_5fstatic_7',['smtp_send_mail_static',['../group__smtp.html#ga06f6582701def2a62582373bb0be5788',1,'smtp_send_mail_static(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c'],['../group__smtp.html#ga06f6582701def2a62582373bb0be5788',1,'smtp_send_mail_static(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c']]],
-  ['smtp_5fset_5fauth_8',['smtp_set_auth',['../group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899',1,'smtp_set_auth(const char *username, const char *pass):&#160;smtp.c'],['../group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899',1,'smtp_set_auth(const char *username, const char *pass):&#160;smtp.c']]],
-  ['smtp_5fset_5fserver_5faddr_9',['smtp_set_server_addr',['../group__smtp.html#ga1ccf4305461ec16cf41599341ec54983',1,'smtp_set_server_addr(const char *server):&#160;smtp.c'],['../group__smtp.html#ga1ccf4305461ec16cf41599341ec54983',1,'smtp_set_server_addr(const char *server):&#160;smtp.c']]],
-  ['smtp_5fset_5fserver_5fport_10',['smtp_set_server_port',['../group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f',1,'smtp_set_server_port(u16_t port):&#160;smtp.c'],['../group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f',1,'smtp_set_server_port(u16_t port):&#160;smtp.c']]],
-  ['smtp_5fset_5ftls_5fconfig_11',['smtp_set_tls_config',['../group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e',1,'smtp_set_tls_config(struct altcp_tls_config *tls_config):&#160;smtp.c'],['../group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e',1,'smtp_set_tls_config(struct altcp_tls_config *tls_config):&#160;smtp.c']]],
-  ['snmp_5fans1_5fenc_5ftlv_12',['snmp_ans1_enc_tlv',['../snmp__asn1_8c.html#af8e905a214936995d235789f359cf015',1,'snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#af8e905a214936995d235789f359cf015',1,'snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fdec_5foid_13',['snmp_asn1_dec_oid',['../snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908',1,'snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908',1,'snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fdec_5fraw_14',['snmp_asn1_dec_raw',['../snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e',1,'snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e',1,'snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fdec_5fs32t_15',['snmp_asn1_dec_s32t',['../snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb',1,'snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb',1,'snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fdec_5ftlv_16',['snmp_asn1_dec_tlv',['../snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496',1,'snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496',1,'snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fdec_5fu32t_17',['snmp_asn1_dec_u32t',['../snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51',1,'snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51',1,'snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5flength_5fcnt_18',['snmp_asn1_enc_length_cnt',['../snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d',1,'snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d',1,'snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5foid_19',['snmp_asn1_enc_oid',['../snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218',1,'snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218',1,'snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5foid_5fcnt_20',['snmp_asn1_enc_oid_cnt',['../snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f',1,'snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f',1,'snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fraw_21',['snmp_asn1_enc_raw',['../snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6',1,'snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6',1,'snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fs32t_22',['snmp_asn1_enc_s32t',['../snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6',1,'snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6',1,'snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fs32t_5fcnt_23',['snmp_asn1_enc_s32t_cnt',['../snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f',1,'snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f',1,'snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fu32t_24',['snmp_asn1_enc_u32t',['../snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2',1,'snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2',1,'snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value):&#160;snmp_asn1.c']]],
-  ['snmp_5fasn1_5fenc_5fu32t_5fcnt_25',['snmp_asn1_enc_u32t_cnt',['../snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4',1,'snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4',1,'snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed):&#160;snmp_asn1.c']]],
-  ['snmp_5fauthfail_5ftrap_26',['snmp_authfail_trap',['../group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee',1,'snmp_authfail_trap(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee',1,'snmp_authfail_trap(void):&#160;snmp_traps.c']]],
-  ['snmp_5fcoldstart_5ftrap_27',['snmp_coldstart_trap',['../group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be',1,'snmp_coldstart_trap(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be',1,'snmp_coldstart_trap(void):&#160;snmp_traps.c']]],
-  ['snmp_5fdecode_5fbits_28',['snmp_decode_bits',['../snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc',1,'snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value):&#160;snmp_core.c'],['../snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc',1,'snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value):&#160;snmp_core.c']]],
-  ['snmp_5fencode_5fbits_29',['snmp_encode_bits',['../snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03',1,'snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count):&#160;snmp_core.c'],['../snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03',1,'snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count):&#160;snmp_core.c']]],
-  ['snmp_5fget_5fauth_5ftraps_5fenabled_30',['snmp_get_auth_traps_enabled',['../group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7',1,'snmp_get_auth_traps_enabled(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7',1,'snmp_get_auth_traps_enabled(void):&#160;snmp_traps.c']]],
-  ['snmp_5fget_5fcommunity_31',['snmp_get_community',['../group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8',1,'snmp_get_community(void):&#160;snmp_msg.c'],['../group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8',1,'snmp_get_community(void):&#160;snmp_msg.c']]],
-  ['snmp_5fget_5fcommunity_5ftrap_32',['snmp_get_community_trap',['../group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba',1,'snmp_get_community_trap(void):&#160;snmp_msg.c'],['../group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba',1,'snmp_get_community_trap(void):&#160;snmp_msg.c']]],
-  ['snmp_5fget_5fcommunity_5fwrite_33',['snmp_get_community_write',['../group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e',1,'snmp_get_community_write(void):&#160;snmp_msg.c'],['../group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e',1,'snmp_get_community_write(void):&#160;snmp_msg.c']]],
-  ['snmp_5fget_5fdevice_5fenterprise_5foid_34',['snmp_get_device_enterprise_oid',['../group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c'],['../group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c']]],
-  ['snmp_5finit_35',['snmp_init',['../snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5',1,'snmp_init(void):&#160;snmp_netconn.c'],['../group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5',1,'snmp_init(void):&#160;snmp_raw.c']]],
-  ['snmp_5fip4_5fto_5foid_36',['snmp_ip4_to_oid',['../snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1',1,'snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1',1,'snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
-  ['snmp_5fip6_5fto_5foid_37',['snmp_ip6_to_oid',['../snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9',1,'snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9',1,'snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
-  ['snmp_5fip_5fport_5fto_5foid_38',['snmp_ip_port_to_oid',['../snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27',1,'snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27',1,'snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid):&#160;snmp_core.c']]],
-  ['snmp_5fip_5fto_5foid_39',['snmp_ip_to_oid',['../snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e',1,'snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e',1,'snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
-  ['snmp_5fmib2_5fset_5fsyscontact_40',['snmp_mib2_set_syscontact',['../group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e',1,'snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e',1,'snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsyscontact_5freadonly_41',['snmp_mib2_set_syscontact_readonly',['../group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a',1,'snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a',1,'snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsysdescr_42',['snmp_mib2_set_sysdescr',['../group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc',1,'snmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc',1,'snmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsyslocation_43',['snmp_mib2_set_syslocation',['../group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2',1,'snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2',1,'snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsyslocation_5freadonly_44',['snmp_mib2_set_syslocation_readonly',['../group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267',1,'snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267',1,'snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsysname_45',['snmp_mib2_set_sysname',['../group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7',1,'snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7',1,'snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib2_5fset_5fsysname_5freadonly_46',['snmp_mib2_set_sysname_readonly',['../group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5',1,'snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5',1,'snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
-  ['snmp_5fmib_5ftree_5fresolve_5fexact_47',['snmp_mib_tree_resolve_exact',['../snmp__core_8c.html#a8ba7d922d9eaac8cd024aed1413901f6',1,'snmp_core.c']]],
-  ['snmp_5fnext_5foid_5fcheck_48',['snmp_next_oid_check',['../snmp__core_8c.html#a18126b2b13f267306c27e851e9379983',1,'snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference):&#160;snmp_core.c'],['../snmp__core_8h.html#a18126b2b13f267306c27e851e9379983',1,'snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference):&#160;snmp_core.c']]],
-  ['snmp_5fnext_5foid_5finit_49',['snmp_next_oid_init',['../snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213',1,'snmp_next_oid_init(struct snmp_next_oid_state *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213',1,'snmp_next_oid_init(struct snmp_next_oid_state *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len):&#160;snmp_core.c']]],
-  ['snmp_5fnext_5foid_5fprecheck_50',['snmp_next_oid_precheck',['../snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a',1,'snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a',1,'snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fappend_51',['snmp_oid_append',['../snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93',1,'snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93',1,'snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fassign_52',['snmp_oid_assign',['../snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6',1,'snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6',1,'snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fcombine_53',['snmp_oid_combine',['../snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904',1,'snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904',1,'snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fcompare_54',['snmp_oid_compare',['../snmp__core_8c.html#af041ab415e8063097c79be2b892174f8',1,'snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#af041ab415e8063097c79be2b892174f8',1,'snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fequal_55',['snmp_oid_equal',['../snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e',1,'snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e',1,'snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fin_5frange_56',['snmp_oid_in_range',['../snmp__core_8c.html#a5275903be5948b1c28bfadb365823504',1,'snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a5275903be5948b1c28bfadb365823504',1,'snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fprefix_57',['snmp_oid_prefix',['../snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39',1,'snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39',1,'snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fto_5fip_58',['snmp_oid_to_ip',['../snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84',1,'snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84',1,'snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fto_5fip4_59',['snmp_oid_to_ip4',['../snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77',1,'snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77',1,'snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fto_5fip6_60',['snmp_oid_to_ip6',['../snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09',1,'snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09',1,'snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip):&#160;snmp_core.c']]],
-  ['snmp_5foid_5fto_5fip_5fport_61',['snmp_oid_to_ip_port',['../snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507',1,'snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port):&#160;snmp_core.c'],['../snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507',1,'snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port):&#160;snmp_core.c']]],
-  ['snmp_5fsend_5ftrap_62',['snmp_send_trap',['../group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd',1,'snmp_send_trap(const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd',1,'snmp_send_trap(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c']]],
-  ['snmp_5fsend_5ftrap_5fgeneric_63',['snmp_send_trap_generic',['../group__snmp__traps.html#ga0e044259289cb690197173f93c17607d',1,'snmp_send_trap_generic(s32_t generic_trap):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga0e044259289cb690197173f93c17607d',1,'snmp_send_trap_generic(s32_t generic_trap):&#160;snmp_traps.c']]],
-  ['snmp_5fsend_5ftrap_5fspecific_64',['snmp_send_trap_specific',['../group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1',1,'snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1',1,'snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c']]],
-  ['snmp_5fset_5fauth_5ftraps_5fenabled_65',['snmp_set_auth_traps_enabled',['../group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c',1,'snmp_set_auth_traps_enabled(u8_t enable):&#160;snmp_traps.c'],['../group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c',1,'snmp_set_auth_traps_enabled(u8_t enable):&#160;snmp_traps.c']]],
-  ['snmp_5fset_5fcommunity_66',['snmp_set_community',['../group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1',1,'snmp_set_community(const char *const community):&#160;snmp_msg.c'],['../group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1',1,'snmp_set_community(const char *const community):&#160;snmp_msg.c']]],
-  ['snmp_5fset_5fcommunity_5ftrap_67',['snmp_set_community_trap',['../group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760',1,'snmp_set_community_trap(const char *const community):&#160;snmp_msg.c'],['../group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760',1,'snmp_set_community_trap(const char *const community):&#160;snmp_msg.c']]],
-  ['snmp_5fset_5fcommunity_5fwrite_68',['snmp_set_community_write',['../group__snmp__core.html#ga341461766863cff46a44e5f431f2da01',1,'snmp_set_community_write(const char *const community):&#160;snmp_msg.c'],['../group__snmp__core.html#ga341461766863cff46a44e5f431f2da01',1,'snmp_set_community_write(const char *const community):&#160;snmp_msg.c']]],
-  ['snmp_5fset_5fdevice_5fenterprise_5foid_69',['snmp_set_device_enterprise_oid',['../group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a',1,'snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid):&#160;snmp_core.c'],['../group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a',1,'snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid):&#160;snmp_core.c']]],
-  ['snmp_5fset_5fmibs_70',['snmp_set_mibs',['../group__snmp__core.html#ga29c76474971f25d038fd486447c70e21',1,'snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs):&#160;snmp_core.c'],['../group__snmp__core.html#ga29c76474971f25d038fd486447c70e21',1,'snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs):&#160;snmp_core.c']]],
-  ['snmp_5fset_5fwrite_5fcallback_71',['snmp_set_write_callback',['../group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b',1,'snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg):&#160;snmp_msg.c'],['../group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b',1,'snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg):&#160;snmp_msg.c']]],
-  ['snmp_5fthreadsync_5finit_72',['snmp_threadsync_init',['../snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6',1,'snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn):&#160;snmp_threadsync.c'],['../snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6',1,'snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn):&#160;snmp_threadsync.c']]],
-  ['snmp_5ftrap_5fdst_5fenable_73',['snmp_trap_dst_enable',['../group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32',1,'snmp_trap_dst_enable(u8_t dst_idx, u8_t enable):&#160;snmp_traps.c'],['../group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32',1,'snmp_trap_dst_enable(u8_t dst_idx, u8_t enable):&#160;snmp_traps.c']]],
-  ['snmp_5ftrap_5fdst_5fip_5fset_74',['snmp_trap_dst_ip_set',['../group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86',1,'snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86',1,'snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst):&#160;snmp_traps.c']]],
-  ['snmp_5fvarbind_5flength_75',['snmp_varbind_length',['../snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5',1,'snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len):&#160;snmp_msg.c'],['../snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5',1,'snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len):&#160;snmp_msg.c']]],
-  ['sntp_5fenabled_76',['sntp_enabled',['../group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5',1,'sntp_enabled(void):&#160;sntp.c'],['../group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5',1,'sntp_enabled(void):&#160;sntp.c']]],
-  ['sntp_5fgetoperatingmode_77',['sntp_getoperatingmode',['../group__sntp.html#gae66404a551d5cef420cf844a71356fae',1,'sntp_getoperatingmode(void):&#160;sntp.c'],['../group__sntp.html#gae66404a551d5cef420cf844a71356fae',1,'sntp_getoperatingmode(void):&#160;sntp.c']]],
-  ['sntp_5fgetreachability_78',['sntp_getreachability',['../group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e',1,'sntp_getreachability(u8_t idx):&#160;sntp.c'],['../group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e',1,'sntp_getreachability(u8_t idx):&#160;sntp.c']]],
-  ['sntp_5fgetserver_79',['sntp_getserver',['../group__sntp.html#gab114c12154cf2c3e3a733724c6a77429',1,'sntp_getserver(u8_t idx):&#160;sntp.c'],['../group__sntp.html#gab114c12154cf2c3e3a733724c6a77429',1,'sntp_getserver(u8_t idx):&#160;sntp.c']]],
-  ['sntp_5finit_80',['sntp_init',['../group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba',1,'sntp_init(void):&#160;sntp.c'],['../group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba',1,'sntp_init(void):&#160;sntp.c']]],
-  ['sntp_5fsetoperatingmode_81',['sntp_setoperatingmode',['../group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120',1,'sntp_setoperatingmode(u8_t operating_mode):&#160;sntp.c'],['../group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120',1,'sntp_setoperatingmode(u8_t operating_mode):&#160;sntp.c']]],
-  ['sntp_5fsetserver_82',['sntp_setserver',['../group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a',1,'sntp_setserver(u8_t idx, const ip_addr_t *server):&#160;sntp.c'],['../group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a',1,'sntp_setserver(u8_t idx, const ip_addr_t *addr):&#160;sntp.c']]],
-  ['sntp_5fstop_83',['sntp_stop',['../group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488',1,'sntp_stop(void):&#160;sntp.c'],['../group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488',1,'sntp_stop(void):&#160;sntp.c']]],
-  ['stats_5finit_84',['stats_init',['../stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d',1,'stats_init(void):&#160;stats.c'],['../stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d',1,'stats_init(void):&#160;stats.c']]],
-  ['sys_5farch_5fmbox_5ffetch_85',['sys_arch_mbox_fetch',['../group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8',1,'sys.h']]],
-  ['sys_5farch_5fmbox_5ftryfetch_86',['sys_arch_mbox_tryfetch',['../group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c',1,'sys.h']]],
-  ['sys_5farch_5fsem_5fwait_87',['sys_arch_sem_wait',['../group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f',1,'sys.h']]],
-  ['sys_5fcheck_5ftimeouts_88',['sys_check_timeouts',['../group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883',1,'sys_check_timeouts(void):&#160;timeouts.c'],['../group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883',1,'sys_check_timeouts(void):&#160;timeouts.c']]],
-  ['sys_5finit_89',['sys_init',['../group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448',1,'sys.h']]],
-  ['sys_5fjiffies_90',['sys_jiffies',['../sys_8h.html#ac89f307e8b360eaf821b461a4f26753a',1,'sys.h']]],
-  ['sys_5fmbox_5ffree_91',['sys_mbox_free',['../group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f',1,'sys.h']]],
-  ['sys_5fmbox_5fnew_92',['sys_mbox_new',['../group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc',1,'sys.h']]],
-  ['sys_5fmbox_5fpost_93',['sys_mbox_post',['../group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555',1,'sys.h']]],
-  ['sys_5fmbox_5fset_5finvalid_94',['sys_mbox_set_invalid',['../group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172',1,'sys.h']]],
-  ['sys_5fmbox_5ftrypost_95',['sys_mbox_trypost',['../group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195',1,'sys.h']]],
-  ['sys_5fmbox_5ftrypost_5ffromisr_96',['sys_mbox_trypost_fromisr',['../group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a',1,'sys.h']]],
-  ['sys_5fmbox_5fvalid_97',['sys_mbox_valid',['../group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d',1,'sys.h']]],
-  ['sys_5fmsleep_98',['sys_msleep',['../group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e',1,'sys_msleep(u32_t ms):&#160;sys.c'],['../group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e',1,'sys_msleep(u32_t ms):&#160;sys.c']]],
-  ['sys_5fmutex_5ffree_99',['sys_mutex_free',['../group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9',1,'sys.h']]],
-  ['sys_5fmutex_5flock_100',['sys_mutex_lock',['../group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a',1,'sys.h']]],
-  ['sys_5fmutex_5fnew_101',['sys_mutex_new',['../group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897',1,'sys.h']]],
-  ['sys_5fmutex_5fset_5finvalid_102',['sys_mutex_set_invalid',['../group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8',1,'sys.h']]],
-  ['sys_5fmutex_5funlock_103',['sys_mutex_unlock',['../group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb',1,'sys.h']]],
-  ['sys_5fmutex_5fvalid_104',['sys_mutex_valid',['../group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a',1,'sys.h']]],
-  ['sys_5fnow_105',['sys_now',['../group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199',1,'sys.h']]],
-  ['sys_5frestart_5ftimeouts_106',['sys_restart_timeouts',['../timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e',1,'sys_restart_timeouts(void):&#160;timeouts.c'],['../timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e',1,'sys_restart_timeouts(void):&#160;timeouts.c']]],
-  ['sys_5fsem_5ffree_107',['sys_sem_free',['../group__sys__sem.html#ga83b781f96c30e915c752065a757da283',1,'sys.h']]],
-  ['sys_5fsem_5fnew_108',['sys_sem_new',['../group__sys__sem.html#gaf99da9e34a71855285c535183133dfde',1,'sys.h']]],
-  ['sys_5fsem_5fset_5finvalid_109',['sys_sem_set_invalid',['../group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33',1,'sys.h']]],
-  ['sys_5fsem_5fsignal_110',['sys_sem_signal',['../group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875',1,'sys.h']]],
-  ['sys_5fsem_5fvalid_111',['sys_sem_valid',['../group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4',1,'sys.h']]],
-  ['sys_5fthread_5fnew_112',['sys_thread_new',['../group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a',1,'sys.h']]],
-  ['sys_5ftimeout_113',['sys_timeout',['../timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8',1,'sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg):&#160;timeouts.c'],['../timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8',1,'sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg):&#160;timeouts.c']]],
-  ['sys_5ftimeouts_5finit_114',['sys_timeouts_init',['../timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c',1,'sys_timeouts_init(void):&#160;timeouts.c'],['../timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c',1,'sys_timeouts_init(void):&#160;timeouts.c']]],
-  ['sys_5ftimeouts_5fsleeptime_115',['sys_timeouts_sleeptime',['../timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664',1,'sys_timeouts_sleeptime(void):&#160;timeouts.c'],['../timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664',1,'sys_timeouts_sleeptime(void):&#160;timeouts.c']]],
-  ['sys_5funtimeout_116',['sys_untimeout',['../timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6',1,'sys_untimeout(sys_timeout_handler handler, void *arg):&#160;timeouts.c'],['../timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6',1,'sys_untimeout(sys_timeout_handler handler, void *arg):&#160;timeouts.c']]]
+  ['raw_5fbind_0',['raw_bind',['../group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4',1,'raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga8576dbbc7f03797525d2cdb7ec3b9fe4',1,'raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c']]],
+  ['raw_5fbind_5fnetif_1',['raw_bind_netif',['../group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a',1,'raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif):&#160;raw.c'],['../group__raw__raw.html#gaa124ac8a9479aebefe2c953629df591a',1,'raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif):&#160;raw.c']]],
+  ['raw_5fconnect_2',['raw_connect',['../group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168',1,'raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga31bb29c964d5e2f734e563485fc25168',1,'raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr):&#160;raw.c']]],
+  ['raw_5fdisconnect_3',['raw_disconnect',['../group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef',1,'raw_disconnect(struct raw_pcb *pcb):&#160;raw.c'],['../group__raw__raw.html#ga7634c0306e2c6f8040e35f6547e8d3ef',1,'raw_disconnect(struct raw_pcb *pcb):&#160;raw.c']]],
+  ['raw_5finput_4',['raw_input',['../raw_8c.html#a03c4582d9ecf687e1f31d597c7889553',1,'raw_input(struct pbuf *p, struct netif *inp):&#160;raw.c'],['../raw__priv_8h.html#a03c4582d9ecf687e1f31d597c7889553',1,'raw_input(struct pbuf *p, struct netif *inp):&#160;raw.c']]],
+  ['raw_5fnetif_5fip_5faddr_5fchanged_5',['raw_netif_ip_addr_changed',['../raw_8c.html#a61dc42f18e34800643000e48be6543ab',1,'raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;raw.c'],['../raw__priv_8h.html#a61dc42f18e34800643000e48be6543ab',1,'raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;raw.c']]],
+  ['raw_5fnew_6',['raw_new',['../group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2',1,'raw_new(u8_t proto):&#160;raw.c'],['../group__raw__raw.html#gaa6be019f74e7e8452b2393027cf7f6a2',1,'raw_new(u8_t proto):&#160;raw.c']]],
+  ['raw_5fnew_5fip_5ftype_7',['raw_new_ip_type',['../group__raw__raw.html#ga89697a092b3d72079f872a029e220eba',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c'],['../group__raw__raw.html#ga89697a092b3d72079f872a029e220eba',1,'raw_new_ip_type(u8_t type, u8_t proto):&#160;raw.c']]],
+  ['raw_5frecv_8',['raw_recv',['../group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426',1,'raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg):&#160;raw.c'],['../group__raw__raw.html#gadf84e4e6911ce3c0d7f5669b6edac426',1,'raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg):&#160;raw.c']]],
+  ['raw_5fremove_9',['raw_remove',['../group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16',1,'raw_remove(struct raw_pcb *pcb):&#160;raw.c'],['../group__raw__raw.html#ga8db62f7d75f722a653b5368305a47e16',1,'raw_remove(struct raw_pcb *pcb):&#160;raw.c']]],
+  ['raw_5fsend_10',['raw_send',['../group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d',1,'raw_send(struct raw_pcb *pcb, struct pbuf *p):&#160;raw.c'],['../group__raw__raw.html#gabbc2e7c7a1b4429f420562d4f31b3a9d',1,'raw_send(struct raw_pcb *pcb, struct pbuf *p):&#160;raw.c']]],
+  ['raw_5fsendto_11',['raw_sendto',['../group__raw__raw.html#ga09427456070fb610cc7795d23dedc159',1,'raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr):&#160;raw.c'],['../group__raw__raw.html#ga09427456070fb610cc7795d23dedc159',1,'raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr):&#160;raw.c']]],
+  ['raw_5fsendto_5fif_5fsrc_12',['raw_sendto_if_src',['../group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1',1,'raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip):&#160;raw.c'],['../group__raw__raw.html#ga2fe3765ae938a3f7c53dc7051b7ab0b1',1,'raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip):&#160;raw.c']]],
+  ['rfc7668_5fif_5finit_13',['rfc7668_if_init',['../group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde',1,'rfc7668_if_init(struct netif *netif):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga3d940376bd983c14ffcc8d2580f3bdde',1,'rfc7668_if_init(struct netif *netif):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5finput_14',['rfc7668_input',['../group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197',1,'rfc7668_input(struct pbuf *p, struct netif *netif):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga1d9d7aff9f2f0515f761be0802178197',1,'rfc7668_input(struct pbuf *p, struct netif *netif):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5foutput_15',['rfc7668_output',['../group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0',1,'rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga22930ade4e77b3195fe59949834d85f0',1,'rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5fcontext_16',['rfc7668_set_context',['../group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e',1,'rfc7668_set_context(u8_t index, const ip6_addr_t *context):&#160;lowpan6_ble.c'],['../group__rfc7668if.html#ga29dc0ebb8e640b64a57008b940fbca1e',1,'rfc7668_set_context(u8_t idx, const ip6_addr_t *context):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5flocal_5faddr_5feui64_17',['rfc7668_set_local_addr_eui64',['../lowpan6__ble_8h.html#a9c5b721f6fb28b4c999baab56a65d8e2',1,'rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a9c5b721f6fb28b4c999baab56a65d8e2',1,'rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5flocal_5faddr_5fmac48_18',['rfc7668_set_local_addr_mac48',['../lowpan6__ble_8h.html#a53d4e8096dd714f94c69d67a6cd49ac2',1,'rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a53d4e8096dd714f94c69d67a6cd49ac2',1,'rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5fpeer_5faddr_5feui64_19',['rfc7668_set_peer_addr_eui64',['../lowpan6__ble_8h.html#a01b797f4fde59dfb803f0299e6a49593',1,'rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a01b797f4fde59dfb803f0299e6a49593',1,'rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len):&#160;lowpan6_ble.c']]],
+  ['rfc7668_5fset_5fpeer_5faddr_5fmac48_20',['rfc7668_set_peer_addr_mac48',['../lowpan6__ble_8h.html#a437b9f9e85be644bd7b939413e3c81d0',1,'rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a437b9f9e85be644bd7b939413e3c81d0',1,'rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr):&#160;lowpan6_ble.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_c.js b/doc/doxygen/output/html/search/functions_c.js
index 4f74306..a0fa115 100644
--- a/doc/doxygen/output/html/search/functions_c.js
+++ b/doc/doxygen/output/html/search/functions_c.js
@@ -1,78 +1,127 @@
 var searchData=
 [
-  ['tcp_5fabandon_0',['tcp_abandon',['../tcp_8c.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe',1,'tcp_abandon(struct tcp_pcb *pcb, int reset):&#160;tcp.c'],['../tcp__priv_8h.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe',1,'tcp_abandon(struct tcp_pcb *pcb, int reset):&#160;tcp.c']]],
-  ['tcp_5fabort_1',['tcp_abort',['../group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61',1,'tcp_abort(struct tcp_pcb *pcb):&#160;tcp.c'],['../group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61',1,'tcp_abort(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5faccept_2',['tcp_accept',['../group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62',1,'tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept):&#160;tcp.c'],['../group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62',1,'tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept):&#160;tcp.c']]],
-  ['tcp_5falloc_3',['tcp_alloc',['../tcp_8c.html#a9a4cb4f0391916cea723b5b5a11df2bb',1,'tcp_alloc(u8_t prio):&#160;tcp.c'],['../tcp__priv_8h.html#a9a4cb4f0391916cea723b5b5a11df2bb',1,'tcp_alloc(u8_t prio):&#160;tcp.c']]],
-  ['tcp_5farg_4',['tcp_arg',['../group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6',1,'tcp_arg(struct tcp_pcb *pcb, void *arg):&#160;tcp.c'],['../group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6',1,'tcp_arg(struct tcp_pcb *pcb, void *arg):&#160;tcp.c']]],
-  ['tcp_5fbacklog_5faccepted_5',['tcp_backlog_accepted',['../group__tcp__raw.html#ga619154658137a23839ca3b94882131ca',1,'tcp_backlog_accepted(struct tcp_pcb *pcb):&#160;tcp.c'],['../group__tcp__raw.html#ga619154658137a23839ca3b94882131ca',1,'tcp_backlog_accepted(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5fbacklog_5fdelayed_6',['tcp_backlog_delayed',['../group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8',1,'tcp_backlog_delayed(struct tcp_pcb *pcb):&#160;tcp.c'],['../group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8',1,'tcp_backlog_delayed(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5fbind_7',['tcp_bind',['../group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee',1,'tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;tcp.c'],['../group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee',1,'tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;tcp.c']]],
-  ['tcp_5fbind_5fnetif_8',['tcp_bind_netif',['../group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f',1,'tcp_bind_netif(struct tcp_pcb *pcb, const struct netif *netif):&#160;tcp.c'],['../group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f',1,'tcp_bind_netif(struct tcp_pcb *pcb, const struct netif *netif):&#160;tcp.c']]],
-  ['tcp_5fclose_9',['tcp_close',['../group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623',1,'tcp_close(struct tcp_pcb *pcb):&#160;tcp.c'],['../group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623',1,'tcp_close(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5fconnect_10',['tcp_connect',['../group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012',1,'tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, tcp_connected_fn connected):&#160;tcp.c'],['../group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012',1,'tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, tcp_connected_fn connected):&#160;tcp.c']]],
-  ['tcp_5feff_5fsend_5fmss_5fnetif_11',['tcp_eff_send_mss_netif',['../tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3',1,'tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, const ip_addr_t *dest):&#160;tcp.c'],['../tcp__priv_8h.html#a08a3b5396c40f32dd8b21e7d63b3e1b3',1,'tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, const ip_addr_t *dest):&#160;tcp.c']]],
-  ['tcp_5fenqueue_5fflags_12',['tcp_enqueue_flags',['../tcp__out_8c.html#aa7d5d552647d567095876aab202bfd1a',1,'tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags):&#160;tcp_out.c'],['../tcp__priv_8h.html#aa7d5d552647d567095876aab202bfd1a',1,'tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags):&#160;tcp_out.c']]],
-  ['tcp_5ferr_13',['tcp_err',['../group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121',1,'tcp_err(struct tcp_pcb *pcb, tcp_err_fn err):&#160;tcp.c'],['../group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121',1,'tcp_err(struct tcp_pcb *pcb, tcp_err_fn err):&#160;tcp.c']]],
-  ['tcp_5fext_5farg_5falloc_5fid_14',['tcp_ext_arg_alloc_id',['../group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616',1,'tcp_ext_arg_alloc_id(void):&#160;tcp.c'],['../group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616',1,'tcp_ext_arg_alloc_id(void):&#160;tcp.c']]],
-  ['tcp_5fext_5farg_5fget_15',['tcp_ext_arg_get',['../group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id):&#160;tcp.c'],['../group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id):&#160;tcp.c']]],
-  ['tcp_5fext_5farg_5finvoke_5fcallbacks_5fpassive_5fopen_16',['tcp_ext_arg_invoke_callbacks_passive_open',['../tcp_8c.html#a5265b1df024d04287ed3edc02b1b9ccc',1,'tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb):&#160;tcp.c'],['../tcp__priv_8h.html#a5265b1df024d04287ed3edc02b1b9ccc',1,'tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb):&#160;tcp.c']]],
-  ['tcp_5fext_5farg_5fset_17',['tcp_ext_arg_set',['../group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318',1,'tcp_ext_arg_set(struct tcp_pcb *pcb, uint8_t id, void *arg):&#160;tcp.c'],['../group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318',1,'tcp_ext_arg_set(struct tcp_pcb *pcb, uint8_t id, void *arg):&#160;tcp.c']]],
-  ['tcp_5fext_5farg_5fset_5fcallbacks_18',['tcp_ext_arg_set_callbacks',['../group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316',1,'tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, uint8_t id, const struct tcp_ext_arg_callbacks *const callbacks):&#160;tcp.c'],['../group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316',1,'tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, uint8_t id, const struct tcp_ext_arg_callbacks *const callbacks):&#160;tcp.c']]],
-  ['tcp_5ffasttmr_19',['tcp_fasttmr',['../tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d',1,'tcp_fasttmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d',1,'tcp_fasttmr(void):&#160;tcp.c']]],
-  ['tcp_5ffree_20',['tcp_free',['../tcp_8c.html#aa2b6b075c27c64dfb8c402ac961fb910',1,'tcp_free(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#aa2b6b075c27c64dfb8c402ac961fb910',1,'tcp_free(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5finit_21',['tcp_init',['../tcp_8c.html#a51de4ded7d342456d31722493c92c969',1,'tcp_init(void):&#160;tcp.c'],['../tcp__priv_8h.html#a51de4ded7d342456d31722493c92c969',1,'tcp_init(void):&#160;tcp.c']]],
-  ['tcp_5finput_22',['tcp_input',['../tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5',1,'tcp_input(struct pbuf *p, struct netif *inp):&#160;tcp_in.c'],['../tcp__priv_8h.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5',1,'tcp_input(struct pbuf *p, struct netif *inp):&#160;tcp_in.c']]],
-  ['tcp_5fkeepalive_23',['tcp_keepalive',['../tcp__out_8c.html#a0d8bb5fc8522515aa35d305774cc5332',1,'tcp_keepalive(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332',1,'tcp_keepalive(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5flisten_5fwith_5fbacklog_24',['tcp_listen_with_backlog',['../group__tcp__raw.html#ga77bb2ca7f053e73545d36b745f236d54',1,'tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog):&#160;tcp.c'],['../group__tcp__raw.html#ga77bb2ca7f053e73545d36b745f236d54',1,'tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog):&#160;tcp.c']]],
-  ['tcp_5flisten_5fwith_5fbacklog_5fand_5ferr_25',['tcp_listen_with_backlog_and_err',['../group__tcp__raw.html#ga8883f9735809f1679d744bc48f1c674a',1,'tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err):&#160;tcp.c'],['../group__tcp__raw.html#ga8883f9735809f1679d744bc48f1c674a',1,'tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err):&#160;tcp.c']]],
-  ['tcp_5fnetif_5fip_5faddr_5fchanged_26',['tcp_netif_ip_addr_changed',['../tcp_8c.html#a4d0c2d1ad02134c79fc72fe95ee2a703',1,'tcp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;tcp.c'],['../tcp__priv_8h.html#a4d0c2d1ad02134c79fc72fe95ee2a703',1,'tcp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;tcp.c']]],
-  ['tcp_5fnew_27',['tcp_new',['../group__tcp__raw.html#ga2e00c668b99d92113cd595647702be83',1,'tcp_new(void):&#160;tcp.c'],['../group__tcp__raw.html#ga2e00c668b99d92113cd595647702be83',1,'tcp_new(void):&#160;tcp.c']]],
-  ['tcp_5fnew_5fip_5ftype_28',['tcp_new_ip_type',['../group__tcp__raw.html#ga89f6955b7248c76a073cd1be461aeb5b',1,'tcp_new_ip_type(u8_t type):&#160;tcp.c'],['../group__tcp__raw.html#ga89f6955b7248c76a073cd1be461aeb5b',1,'tcp_new_ip_type(u8_t type):&#160;tcp.c']]],
-  ['tcp_5fnext_5fiss_29',['tcp_next_iss',['../tcp_8c.html#afd5dc2fa74855a84b2da642ba31059ea',1,'tcp_next_iss(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#afd5dc2fa74855a84b2da642ba31059ea',1,'tcp_next_iss(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5foutput_30',['tcp_output',['../group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f',1,'tcp_output(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f',1,'tcp_output(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5fpcb_5fpurge_31',['tcp_pcb_purge',['../tcp_8c.html#a44fc672b9d14a65e61040707c45302ba',1,'tcp_pcb_purge(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#a44fc672b9d14a65e61040707c45302ba',1,'tcp_pcb_purge(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5fpcb_5fremove_32',['tcp_pcb_remove',['../tcp_8c.html#aaaef096f6a03bf5b778329bb66ee06f6',1,'tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#aaaef096f6a03bf5b778329bb66ee06f6',1,'tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5fpoll_33',['tcp_poll',['../group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5',1,'tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval):&#160;tcp.c'],['../group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5',1,'tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval):&#160;tcp.c']]],
-  ['tcp_5fprocess_5frefused_5fdata_34',['tcp_process_refused_data',['../tcp_8c.html#a0075b56ad4b0eca7c9d439cf150e1973',1,'tcp_process_refused_data(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#a0075b56ad4b0eca7c9d439cf150e1973',1,'tcp_process_refused_data(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5frecv_35',['tcp_recv',['../group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0',1,'tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv):&#160;tcp.c'],['../group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0',1,'tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv):&#160;tcp.c']]],
-  ['tcp_5frecv_5fnull_36',['tcp_recv_null',['../tcp_8c.html#a0cb3f604fc8d20870d8cab291da5701c',1,'tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err):&#160;tcp.c'],['../tcp__priv_8h.html#a0cb3f604fc8d20870d8cab291da5701c',1,'tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err):&#160;tcp.c']]],
-  ['tcp_5frecved_37',['tcp_recved',['../group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44',1,'tcp_recved(struct tcp_pcb *pcb, u16_t len):&#160;tcp.c'],['../group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44',1,'tcp_recved(struct tcp_pcb *pcb, u16_t len):&#160;tcp.c']]],
-  ['tcp_5frexmit_38',['tcp_rexmit',['../tcp__out_8c.html#af75fefe4fe509845be156d6e424eb6f1',1,'tcp_rexmit(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#af75fefe4fe509845be156d6e424eb6f1',1,'tcp_rexmit(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5frexmit_5ffast_39',['tcp_rexmit_fast',['../tcp__out_8c.html#adb6ee7b4d59f125cc8bfac3bb5ca3937',1,'tcp_rexmit_fast(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#adb6ee7b4d59f125cc8bfac3bb5ca3937',1,'tcp_rexmit_fast(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5frexmit_5frto_40',['tcp_rexmit_rto',['../tcp__out_8c.html#ab5ef9c8ab4629eb721987ae316b9f30f',1,'tcp_rexmit_rto(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#ab5ef9c8ab4629eb721987ae316b9f30f',1,'tcp_rexmit_rto(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5frexmit_5frto_5fcommit_41',['tcp_rexmit_rto_commit',['../tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4',1,'tcp_rexmit_rto_commit(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a9ef9dc094e21bdf0779aed25ab0b08d4',1,'tcp_rexmit_rto_commit(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5frexmit_5frto_5fprepare_42',['tcp_rexmit_rto_prepare',['../tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39',1,'tcp_rexmit_rto_prepare(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39',1,'tcp_rexmit_rto_prepare(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5frst_43',['tcp_rst',['../tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014',1,'tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c'],['../tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014',1,'tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c']]],
-  ['tcp_5fseg_5fcopy_44',['tcp_seg_copy',['../tcp_8c.html#a9384b436de95d5bf8550438b9d3c8cd4',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c']]],
-  ['tcp_5fseg_5ffree_45',['tcp_seg_free',['../tcp_8c.html#ac6283651b26f74dba2444159aee88b20',1,'tcp_seg_free(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20',1,'tcp_seg_free(struct tcp_seg *seg):&#160;tcp.c']]],
-  ['tcp_5fsegs_5ffree_46',['tcp_segs_free',['../tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c',1,'tcp_segs_free(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c',1,'tcp_segs_free(struct tcp_seg *seg):&#160;tcp.c']]],
-  ['tcp_5fsend_5fempty_5fack_47',['tcp_send_empty_ack',['../tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996',1,'tcp_send_empty_ack(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996',1,'tcp_send_empty_ack(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5fsend_5ffin_48',['tcp_send_fin',['../tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342',1,'tcp_send_fin(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342',1,'tcp_send_fin(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcp_5fsent_49',['tcp_sent',['../group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808',1,'tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent):&#160;tcp.c'],['../group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808',1,'tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent):&#160;tcp.c']]],
-  ['tcp_5fsetprio_50',['tcp_setprio',['../tcp_8c.html#a2c4234f1e95b6bde0e84d4ea97ae95bc',1,'tcp_setprio(struct tcp_pcb *pcb, u8_t prio):&#160;tcp.c'],['../tcp_8h.html#a2c4234f1e95b6bde0e84d4ea97ae95bc',1,'tcp_setprio(struct tcp_pcb *pcb, u8_t prio):&#160;tcp.c']]],
-  ['tcp_5fshutdown_51',['tcp_shutdown',['../group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd',1,'tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx):&#160;tcp.c'],['../group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd',1,'tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx):&#160;tcp.c']]],
-  ['tcp_5fslowtmr_52',['tcp_slowtmr',['../tcp_8c.html#a421fb42ef919018e14ae413adfee9905',1,'tcp_slowtmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905',1,'tcp_slowtmr(void):&#160;tcp.c']]],
-  ['tcp_5fsplit_5funsent_5fseg_53',['tcp_split_unsent_seg',['../tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5',1,'tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split):&#160;tcp_out.c'],['../tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5',1,'tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split):&#160;tcp_out.c']]],
-  ['tcp_5ftimer_5fneeded_54',['tcp_timer_needed',['../timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249',1,'tcp_timer_needed(void):&#160;timeouts.c'],['../tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249',1,'tcp_timer_needed(void):&#160;timeouts.c']]],
-  ['tcp_5ftmr_55',['tcp_tmr',['../tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb',1,'tcp_tmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb',1,'tcp_tmr(void):&#160;tcp.c']]],
-  ['tcp_5ftxnow_56',['tcp_txnow',['../tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547',1,'tcp_txnow(void):&#160;tcp.c'],['../tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547',1,'tcp_txnow(void):&#160;tcp.c']]],
-  ['tcp_5fupdate_5frcv_5fann_5fwnd_57',['tcp_update_rcv_ann_wnd',['../tcp_8c.html#a6d2c254b779db4e517cb34e41301588d',1,'tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d',1,'tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb):&#160;tcp.c']]],
-  ['tcp_5fwrite_58',['tcp_write',['../group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5',1,'tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags):&#160;tcp_out.c'],['../group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5',1,'tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len, u8_t apiflags):&#160;tcp_out.c']]],
-  ['tcp_5fzero_5fwindow_5fprobe_59',['tcp_zero_window_probe',['../tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6',1,'tcp_zero_window_probe(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6',1,'tcp_zero_window_probe(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
-  ['tcpip_5f6lowpan_5finput_60',['tcpip_6lowpan_input',['../group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b',1,'tcpip_6lowpan_input(struct pbuf *p, struct netif *inp):&#160;lowpan6.c'],['../group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b',1,'tcpip_6lowpan_input(struct pbuf *p, struct netif *inp):&#160;lowpan6.c']]],
-  ['tcpip_5fapi_5fcall_61',['tcpip_api_call',['../tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08',1,'tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call):&#160;tcpip.c'],['../tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08',1,'tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call):&#160;tcpip.c']]],
-  ['tcpip_5fcallback_62',['tcpip_callback',['../group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a',1,'tcpip_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a',1,'tcpip_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
-  ['tcpip_5fcallbackmsg_5fdelete_63',['tcpip_callbackmsg_delete',['../group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd',1,'tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd',1,'tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
-  ['tcpip_5fcallbackmsg_5fnew_64',['tcpip_callbackmsg_new',['../group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
-  ['tcpip_5fcallbackmsg_5ftrycallback_65',['tcpip_callbackmsg_trycallback',['../group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8',1,'tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8',1,'tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
-  ['tcpip_5fcallbackmsg_5ftrycallback_5ffromisr_66',['tcpip_callbackmsg_trycallback_fromisr',['../group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666',1,'tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666',1,'tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
-  ['tcpip_5finit_67',['tcpip_init',['../group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db',1,'tcpip_init(tcpip_init_done_fn initfunc, void *arg):&#160;tcpip.c'],['../group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db',1,'tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg):&#160;tcpip.c']]],
-  ['tcpip_5finpkt_68',['tcpip_inpkt',['../tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102',1,'tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn):&#160;tcpip.c'],['../tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102',1,'tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn):&#160;tcpip.c']]],
-  ['tcpip_5finput_69',['tcpip_input',['../group__lwip__os.html#gae510f195171bed8499ae94e264a92717',1,'tcpip_input(struct pbuf *p, struct netif *inp):&#160;tcpip.c'],['../group__lwip__os.html#gae510f195171bed8499ae94e264a92717',1,'tcpip_input(struct pbuf *p, struct netif *inp):&#160;tcpip.c']]],
-  ['tcpip_5frfc7668_5finput_70',['tcpip_rfc7668_input',['../lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a',1,'tcpip_rfc7668_input(struct pbuf *p, struct netif *inp):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a',1,'tcpip_rfc7668_input(struct pbuf *p, struct netif *inp):&#160;lowpan6_ble.c']]],
-  ['tcpip_5fsend_5fmsg_5fwait_5fsem_71',['tcpip_send_msg_wait_sem',['../tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d',1,'tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem):&#160;tcpip.c'],['../tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d',1,'tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem):&#160;tcpip.c']]],
-  ['tcpip_5ftry_5fcallback_72',['tcpip_try_callback',['../group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020',1,'tcpip_try_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020',1,'tcpip_try_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
-  ['tftp_5fcleanup_73',['tftp_cleanup',['../group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec',1,'tftp_cleanup(void):&#160;tftp_server.c'],['../group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec',1,'tftp_cleanup(void):&#160;tftp_server.c']]],
-  ['tftp_5finit_74',['tftp_init',['../group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3',1,'tftp_init(const struct tftp_context *ctx):&#160;tftp_server.c'],['../group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3',1,'tftp_init(const struct tftp_context *ctx):&#160;tftp_server.c']]]
+  ['slipif_5finit_0',['slipif_init',['../group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3',1,'slipif_init(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#ga687973ba82dab13a5b9d38d7399aeee3',1,'slipif_init(struct netif *netif):&#160;slipif.c']]],
+  ['slipif_5fpoll_1',['slipif_poll',['../group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6',1,'slipif_poll(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#ga7b036fd1cde9b299139cac62f52d15a6',1,'slipif_poll(struct netif *netif):&#160;slipif.c']]],
+  ['slipif_5fprocess_5frxqueue_2',['slipif_process_rxqueue',['../group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946',1,'slipif_process_rxqueue(struct netif *netif):&#160;slipif.c'],['../group__slipif.html#gae135be7d61e5bb49ab72476b0aa70946',1,'slipif_process_rxqueue(struct netif *netif):&#160;slipif.c']]],
+  ['slipif_5freceived_5fbyte_3',['slipif_received_byte',['../group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3',1,'slipif_received_byte(struct netif *netif, u8_t data):&#160;slipif.c'],['../group__slipif.html#ga3f2f5e2fa4a816dc27a46f3ee91cf1b3',1,'slipif_received_byte(struct netif *netif, u8_t data):&#160;slipif.c']]],
+  ['slipif_5freceived_5fbytes_4',['slipif_received_bytes',['../group__slipif.html#gabbee48569a513c90fe154632038eb6d6',1,'slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len):&#160;slipif.c'],['../group__slipif.html#gabbee48569a513c90fe154632038eb6d6',1,'slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len):&#160;slipif.c']]],
+  ['smtp_5fsend_5fmail_5',['smtp_send_mail',['../group__smtp.html#gae43119480c4146df9eeff7ae80c767f7',1,'smtp_send_mail(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c'],['../group__smtp.html#gae43119480c4146df9eeff7ae80c767f7',1,'smtp_send_mail(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c']]],
+  ['smtp_5fsend_5fmail_5fint_6',['smtp_send_mail_int',['../group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243',1,'smtp_send_mail_int(void *arg):&#160;smtp.c'],['../group__smtp.html#gaa9331cc8c6d73a8cd7e6e4466aca9243',1,'smtp_send_mail_int(void *arg):&#160;smtp.c']]],
+  ['smtp_5fsend_5fmail_5fstatic_7',['smtp_send_mail_static',['../group__smtp.html#ga06f6582701def2a62582373bb0be5788',1,'smtp_send_mail_static(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c'],['../group__smtp.html#ga06f6582701def2a62582373bb0be5788',1,'smtp_send_mail_static(const char *from, const char *to, const char *subject, const char *body, smtp_result_fn callback_fn, void *callback_arg):&#160;smtp.c']]],
+  ['smtp_5fset_5fauth_8',['smtp_set_auth',['../group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899',1,'smtp_set_auth(const char *username, const char *pass):&#160;smtp.c'],['../group__smtp.html#ga79567a5a75e048a6b8addb5b038fc899',1,'smtp_set_auth(const char *username, const char *pass):&#160;smtp.c']]],
+  ['smtp_5fset_5fserver_5faddr_9',['smtp_set_server_addr',['../group__smtp.html#ga1ccf4305461ec16cf41599341ec54983',1,'smtp_set_server_addr(const char *server):&#160;smtp.c'],['../group__smtp.html#ga1ccf4305461ec16cf41599341ec54983',1,'smtp_set_server_addr(const char *server):&#160;smtp.c']]],
+  ['smtp_5fset_5fserver_5fport_10',['smtp_set_server_port',['../group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f',1,'smtp_set_server_port(u16_t port):&#160;smtp.c'],['../group__smtp.html#ga4b0606e7ad64d8215cebbea43f08759f',1,'smtp_set_server_port(u16_t port):&#160;smtp.c']]],
+  ['smtp_5fset_5ftls_5fconfig_11',['smtp_set_tls_config',['../group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e',1,'smtp_set_tls_config(struct altcp_tls_config *tls_config):&#160;smtp.c'],['../group__smtp.html#gae72a8a0ec42ecae1be401978e224c39e',1,'smtp_set_tls_config(struct altcp_tls_config *tls_config):&#160;smtp.c']]],
+  ['snmp_5fans1_5fenc_5ftlv_12',['snmp_ans1_enc_tlv',['../snmp__asn1_8c.html#af8e905a214936995d235789f359cf015',1,'snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#af8e905a214936995d235789f359cf015',1,'snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fdec_5foid_13',['snmp_asn1_dec_oid',['../snmp__asn1_8c.html#a8bb84ec51c46a890b7ced016043b2908',1,'snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a8bb84ec51c46a890b7ced016043b2908',1,'snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fdec_5fraw_14',['snmp_asn1_dec_raw',['../snmp__asn1_8c.html#a31055a35285214ea0d4ad60c64c2f73e',1,'snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a31055a35285214ea0d4ad60c64c2f73e',1,'snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fdec_5fs32t_15',['snmp_asn1_dec_s32t',['../snmp__asn1_8c.html#a51d36daf2935c246eb55fb749581e2bb',1,'snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a51d36daf2935c246eb55fb749581e2bb',1,'snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fdec_5ftlv_16',['snmp_asn1_dec_tlv',['../snmp__asn1_8c.html#a7e3f63b155b06f7ade627060b55e4496',1,'snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a7e3f63b155b06f7ade627060b55e4496',1,'snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fdec_5fu32t_17',['snmp_asn1_dec_u32t',['../snmp__asn1_8c.html#ac04e08c19c40cfc3333a181018887a51',1,'snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#ac04e08c19c40cfc3333a181018887a51',1,'snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5flength_5fcnt_18',['snmp_asn1_enc_length_cnt',['../snmp__asn1_8c.html#a20343aef4524459a2b45704e18ef520d',1,'snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a20343aef4524459a2b45704e18ef520d',1,'snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5foid_19',['snmp_asn1_enc_oid',['../snmp__asn1_8c.html#aa71260abd46fc2f682874016896fe218',1,'snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#aa71260abd46fc2f682874016896fe218',1,'snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5foid_5fcnt_20',['snmp_asn1_enc_oid_cnt',['../snmp__asn1_8c.html#ab6fd58c1b41cb98117f00a11db7d226f',1,'snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#ab6fd58c1b41cb98117f00a11db7d226f',1,'snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fraw_21',['snmp_asn1_enc_raw',['../snmp__asn1_8c.html#a167b707051bbbeafea14eeca72449ac6',1,'snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a167b707051bbbeafea14eeca72449ac6',1,'snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fs32t_22',['snmp_asn1_enc_s32t',['../snmp__asn1_8c.html#a25b3fe21becd08260ec56bef9299d3c6',1,'snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a25b3fe21becd08260ec56bef9299d3c6',1,'snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fs32t_5fcnt_23',['snmp_asn1_enc_s32t_cnt',['../snmp__asn1_8c.html#a8c74914532f1e0c219dfb1977fd0c22f',1,'snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a8c74914532f1e0c219dfb1977fd0c22f',1,'snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fu32t_24',['snmp_asn1_enc_u32t',['../snmp__asn1_8c.html#aa54b4ee3c58ef66721df96fd8b1f66b2',1,'snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#aa54b4ee3c58ef66721df96fd8b1f66b2',1,'snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value):&#160;snmp_asn1.c']]],
+  ['snmp_5fasn1_5fenc_5fu32t_5fcnt_25',['snmp_asn1_enc_u32t_cnt',['../snmp__asn1_8c.html#a58965e0305884d550786440c84119ad4',1,'snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed):&#160;snmp_asn1.c'],['../snmp__asn1_8h.html#a58965e0305884d550786440c84119ad4',1,'snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed):&#160;snmp_asn1.c']]],
+  ['snmp_5fauthfail_5ftrap_26',['snmp_authfail_trap',['../group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee',1,'snmp_authfail_trap(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee',1,'snmp_authfail_trap(void):&#160;snmp_traps.c']]],
+  ['snmp_5fcoldstart_5ftrap_27',['snmp_coldstart_trap',['../group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be',1,'snmp_coldstart_trap(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be',1,'snmp_coldstart_trap(void):&#160;snmp_traps.c']]],
+  ['snmp_5fdecode_5fbits_28',['snmp_decode_bits',['../snmp__core_8c.html#ad3ab34b13bb9fcc757c8d366fe520fdc',1,'snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value):&#160;snmp_core.c'],['../snmp__core_8h.html#ad3ab34b13bb9fcc757c8d366fe520fdc',1,'snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value):&#160;snmp_core.c']]],
+  ['snmp_5fencode_5fbits_29',['snmp_encode_bits',['../snmp__core_8c.html#ae6f5d0c38a7ec164a67fa55c87f1de03',1,'snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count):&#160;snmp_core.c'],['../snmp__core_8h.html#ae6f5d0c38a7ec164a67fa55c87f1de03',1,'snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count):&#160;snmp_core.c']]],
+  ['snmp_5fget_5fauth_5ftraps_5fenabled_30',['snmp_get_auth_traps_enabled',['../group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7',1,'snmp_get_auth_traps_enabled(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7',1,'snmp_get_auth_traps_enabled(void):&#160;snmp_traps.c']]],
+  ['snmp_5fget_5fcommunity_31',['snmp_get_community',['../group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8',1,'snmp_get_community(void):&#160;snmp_msg.c'],['../group__snmp__core.html#ga1fe737c1371a3ed3bb515d451ef3eea8',1,'snmp_get_community(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fcommunity_5ftrap_32',['snmp_get_community_trap',['../group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba',1,'snmp_get_community_trap(void):&#160;snmp_msg.c'],['../group__snmp__traps.html#ga566aa7aeaf5fb75ca0a2af58486f4cba',1,'snmp_get_community_trap(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fcommunity_5fwrite_33',['snmp_get_community_write',['../group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e',1,'snmp_get_community_write(void):&#160;snmp_msg.c'],['../group__snmp__core.html#ga6654521b83f35c600b689b950dcc2c4e',1,'snmp_get_community_write(void):&#160;snmp_msg.c']]],
+  ['snmp_5fget_5fdefault_5ftrap_5fversion_34',['snmp_get_default_trap_version',['../group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359',1,'snmp_get_default_trap_version(void):&#160;snmp_traps.c'],['../group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359',1,'snmp_get_default_trap_version(void):&#160;snmp_traps.c']]],
+  ['snmp_5fget_5fdevice_5fenterprise_5foid_35',['snmp_get_device_enterprise_oid',['../group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c'],['../group__snmp__core.html#ga51e84055f7d9c445118bf8e93fd1adf8',1,'snmp_get_device_enterprise_oid(void):&#160;snmp_core.c']]],
+  ['snmp_5finit_36',['snmp_init',['../snmp__netconn_8c.html#ga4d88f2fc7655280384131d543e0d83e5',1,'snmp_init(void):&#160;snmp_netconn.c'],['../group__snmp__core.html#ga4d88f2fc7655280384131d543e0d83e5',1,'snmp_init(void):&#160;snmp_raw.c']]],
+  ['snmp_5fip4_5fto_5foid_37',['snmp_ip4_to_oid',['../snmp__core_8c.html#a4e01d395f0c8c38c2b5b681047969da1',1,'snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a4e01d395f0c8c38c2b5b681047969da1',1,'snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
+  ['snmp_5fip6_5fto_5foid_38',['snmp_ip6_to_oid',['../snmp__core_8c.html#af1f327eef86765cce0253c94ec3c5ce9',1,'snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#af1f327eef86765cce0253c94ec3c5ce9',1,'snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
+  ['snmp_5fip_5fport_5fto_5foid_39',['snmp_ip_port_to_oid',['../snmp__core_8c.html#a53b01262de3d1c52faf88dd4bb702a27',1,'snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a53b01262de3d1c52faf88dd4bb702a27',1,'snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid):&#160;snmp_core.c']]],
+  ['snmp_5fip_5fto_5foid_40',['snmp_ip_to_oid',['../snmp__core_8c.html#a909ed1b0da526a0acdf6fa57a06f351e',1,'snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid):&#160;snmp_core.c'],['../snmp__core_8h.html#a909ed1b0da526a0acdf6fa57a06f351e',1,'snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid):&#160;snmp_core.c']]],
+  ['snmp_5fmib2_5fset_5fsyscontact_41',['snmp_mib2_set_syscontact',['../group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e',1,'snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gaf96002d9d10bcae27a95b2367674249e',1,'snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsyscontact_5freadonly_42',['snmp_mib2_set_syscontact_readonly',['../group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a',1,'snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#ga53339a03d720c745790837905bc2171a',1,'snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsysdescr_43',['snmp_mib2_set_sysdescr',['../group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc',1,'snmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gacde87dc1d3bd669b19d834b028f490cc',1,'snmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsyslocation_44',['snmp_mib2_set_syslocation',['../group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2',1,'snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#ga4248e004a27344b7260574c3a51882f2',1,'snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsyslocation_5freadonly_45',['snmp_mib2_set_syslocation_readonly',['../group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267',1,'snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gac1759d5b0640943697be2ad538325267',1,'snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsysname_46',['snmp_mib2_set_sysname',['../group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7',1,'snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gae7ce98a6ecc0bb92aaa2b330599a2db7',1,'snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib2_5fset_5fsysname_5freadonly_47',['snmp_mib2_set_sysname_readonly',['../group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5',1,'snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c'],['../group__snmp__mib2.html#gab95eb687492fa0e7d762f911c442bdc5',1,'snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen):&#160;snmp_mib2_system.c']]],
+  ['snmp_5fmib_5ftree_5fresolve_5fexact_48',['snmp_mib_tree_resolve_exact',['../snmp__core_8c.html#a8ba7d922d9eaac8cd024aed1413901f6',1,'snmp_core.c']]],
+  ['snmp_5fnext_5foid_5fcheck_49',['snmp_next_oid_check',['../snmp__core_8c.html#a18126b2b13f267306c27e851e9379983',1,'snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference):&#160;snmp_core.c'],['../snmp__core_8h.html#a18126b2b13f267306c27e851e9379983',1,'snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference):&#160;snmp_core.c']]],
+  ['snmp_5fnext_5foid_5finit_50',['snmp_next_oid_init',['../snmp__core_8c.html#a8074765d5c2b809561f032d35e59e213',1,'snmp_next_oid_init(struct snmp_next_oid_state *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a8074765d5c2b809561f032d35e59e213',1,'snmp_next_oid_init(struct snmp_next_oid_state *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len):&#160;snmp_core.c']]],
+  ['snmp_5fnext_5foid_5fprecheck_51',['snmp_next_oid_precheck',['../snmp__core_8c.html#a9768ecf81f01880dbf1cc1933bd9e60a',1,'snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a9768ecf81f01880dbf1cc1933bd9e60a',1,'snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fappend_52',['snmp_oid_append',['../snmp__core_8c.html#a5aa6c8dbfc93235b160afaf3a40c1c93',1,'snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a5aa6c8dbfc93235b160afaf3a40c1c93',1,'snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fassign_53',['snmp_oid_assign',['../snmp__core_8c.html#a41fd5e854d809499e28c66b4918481a6',1,'snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a41fd5e854d809499e28c66b4918481a6',1,'snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fcombine_54',['snmp_oid_combine',['../snmp__core_8c.html#a6edcb88d8162544333bcede301cf0904',1,'snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a6edcb88d8162544333bcede301cf0904',1,'snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fcompare_55',['snmp_oid_compare',['../snmp__core_8c.html#af041ab415e8063097c79be2b892174f8',1,'snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#af041ab415e8063097c79be2b892174f8',1,'snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fequal_56',['snmp_oid_equal',['../snmp__core_8c.html#ac2b6821b3d4a25033433fc25ffd74c9e',1,'snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c'],['../snmp__core_8h.html#ac2b6821b3d4a25033433fc25ffd74c9e',1,'snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fin_5frange_57',['snmp_oid_in_range',['../snmp__core_8c.html#a5275903be5948b1c28bfadb365823504',1,'snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a5275903be5948b1c28bfadb365823504',1,'snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fprefix_58',['snmp_oid_prefix',['../snmp__core_8c.html#a32256b37b211b4f59d8f114cee364f39',1,'snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c'],['../snmp__core_8h.html#a32256b37b211b4f59d8f114cee364f39',1,'snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fto_5fip_59',['snmp_oid_to_ip',['../snmp__core_8c.html#a66aac86af921cd8aecb95eb252eb3e84',1,'snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#a66aac86af921cd8aecb95eb252eb3e84',1,'snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fto_5fip4_60',['snmp_oid_to_ip4',['../snmp__core_8c.html#a095efcd4202782e57625d7b1afcdbf77',1,'snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#a095efcd4202782e57625d7b1afcdbf77',1,'snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fto_5fip6_61',['snmp_oid_to_ip6',['../snmp__core_8c.html#aa1b651a1faf6f1ee0dfdbea48310ed09',1,'snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip):&#160;snmp_core.c'],['../snmp__core_8h.html#aa1b651a1faf6f1ee0dfdbea48310ed09',1,'snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip):&#160;snmp_core.c']]],
+  ['snmp_5foid_5fto_5fip_5fport_62',['snmp_oid_to_ip_port',['../snmp__core_8c.html#a21f02b239cc9abae586f5ef92923e507',1,'snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port):&#160;snmp_core.c'],['../snmp__core_8h.html#a21f02b239cc9abae586f5ef92923e507',1,'snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port):&#160;snmp_core.c']]],
+  ['snmp_5fsend_5finform_63',['snmp_send_inform',['../group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692',1,'snmp_send_inform(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c'],['../group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692',1,'snmp_send_inform(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5finform_5fgeneric_64',['snmp_send_inform_generic',['../group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275',1,'snmp_send_inform_generic(s32_t generic_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c'],['../group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275',1,'snmp_send_inform_generic(s32_t generic_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5finform_5fspecific_65',['snmp_send_inform_specific',['../group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210',1,'snmp_send_inform_specific(s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210',1,'snmp_send_inform_specific(s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5ftrap_66',['snmp_send_trap',['../group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c',1,'snmp_send_trap(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c',1,'snmp_send_trap(const struct snmp_obj_id *oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5ftrap_5fgeneric_67',['snmp_send_trap_generic',['../group__snmp__traps.html#ga0e044259289cb690197173f93c17607d',1,'snmp_send_trap_generic(s32_t generic_trap):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga0e044259289cb690197173f93c17607d',1,'snmp_send_trap_generic(s32_t generic_trap):&#160;snmp_traps.c']]],
+  ['snmp_5fsend_5ftrap_5fspecific_68',['snmp_send_trap_specific',['../group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1',1,'snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1',1,'snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds):&#160;snmp_traps.c']]],
+  ['snmp_5fset_5fauth_5ftraps_5fenabled_69',['snmp_set_auth_traps_enabled',['../group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c',1,'snmp_set_auth_traps_enabled(u8_t enable):&#160;snmp_traps.c'],['../group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c',1,'snmp_set_auth_traps_enabled(u8_t enable):&#160;snmp_traps.c']]],
+  ['snmp_5fset_5fcommunity_70',['snmp_set_community',['../group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1',1,'snmp_set_community(const char *const community):&#160;snmp_msg.c'],['../group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1',1,'snmp_set_community(const char *const community):&#160;snmp_msg.c']]],
+  ['snmp_5fset_5fcommunity_5ftrap_71',['snmp_set_community_trap',['../group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760',1,'snmp_set_community_trap(const char *const community):&#160;snmp_msg.c'],['../group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760',1,'snmp_set_community_trap(const char *const community):&#160;snmp_msg.c']]],
+  ['snmp_5fset_5fcommunity_5fwrite_72',['snmp_set_community_write',['../group__snmp__core.html#ga341461766863cff46a44e5f431f2da01',1,'snmp_set_community_write(const char *const community):&#160;snmp_msg.c'],['../group__snmp__core.html#ga341461766863cff46a44e5f431f2da01',1,'snmp_set_community_write(const char *const community):&#160;snmp_msg.c']]],
+  ['snmp_5fset_5fdefault_5ftrap_5fversion_73',['snmp_set_default_trap_version',['../group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455',1,'snmp_set_default_trap_version(u8_t snmp_version):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455',1,'snmp_set_default_trap_version(u8_t snmp_version):&#160;snmp_traps.c']]],
+  ['snmp_5fset_5fdevice_5fenterprise_5foid_74',['snmp_set_device_enterprise_oid',['../group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a',1,'snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid):&#160;snmp_core.c'],['../group__snmp__core.html#gacc71ac857bf9215f06a624dda09abe3a',1,'snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid):&#160;snmp_core.c']]],
+  ['snmp_5fset_5finform_5fcallback_75',['snmp_set_inform_callback',['../group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838',1,'snmp_set_inform_callback(snmp_inform_callback_fct inform_callback, void *callback_arg):&#160;snmp_msg.c'],['../group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838',1,'snmp_set_inform_callback(snmp_inform_callback_fct inform_callback, void *callback_arg):&#160;snmp_msg.c']]],
+  ['snmp_5fset_5fmibs_76',['snmp_set_mibs',['../group__snmp__core.html#ga29c76474971f25d038fd486447c70e21',1,'snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs):&#160;snmp_core.c'],['../group__snmp__core.html#ga29c76474971f25d038fd486447c70e21',1,'snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs):&#160;snmp_core.c']]],
+  ['snmp_5fset_5fwrite_5fcallback_77',['snmp_set_write_callback',['../group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b',1,'snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg):&#160;snmp_msg.c'],['../group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b',1,'snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg):&#160;snmp_msg.c']]],
+  ['snmp_5fthreadsync_5finit_78',['snmp_threadsync_init',['../snmp__threadsync_8c.html#a36e5b1dbb067641b7a6ac486b4ec15b6',1,'snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn):&#160;snmp_threadsync.c'],['../snmp__threadsync_8h.html#a36e5b1dbb067641b7a6ac486b4ec15b6',1,'snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn):&#160;snmp_threadsync.c']]],
+  ['snmp_5ftrap_5fdst_5fenable_79',['snmp_trap_dst_enable',['../group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32',1,'snmp_trap_dst_enable(u8_t dst_idx, u8_t enable):&#160;snmp_traps.c'],['../group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32',1,'snmp_trap_dst_enable(u8_t dst_idx, u8_t enable):&#160;snmp_traps.c']]],
+  ['snmp_5ftrap_5fdst_5fip_5fset_80',['snmp_trap_dst_ip_set',['../group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86',1,'snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst):&#160;snmp_traps.c'],['../group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86',1,'snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst):&#160;snmp_traps.c']]],
+  ['snmp_5fvarbind_5flength_81',['snmp_varbind_length',['../snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5',1,'snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len):&#160;snmp_msg.c'],['../snmp__msg_8h.html#ac1f684dada963f68b71a04a702f28fe5',1,'snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len):&#160;snmp_msg.c']]],
+  ['sntp_5fenabled_82',['sntp_enabled',['../group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5',1,'sntp_enabled(void):&#160;sntp.c'],['../group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5',1,'sntp_enabled(void):&#160;sntp.c']]],
+  ['sntp_5fgetkodreceived_83',['sntp_getkodreceived',['../group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e',1,'sntp_getkodreceived(u8_t idx):&#160;sntp.c'],['../group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e',1,'sntp_getkodreceived(u8_t idx):&#160;sntp.c']]],
+  ['sntp_5fgetoperatingmode_84',['sntp_getoperatingmode',['../group__sntp.html#gae66404a551d5cef420cf844a71356fae',1,'sntp_getoperatingmode(void):&#160;sntp.c'],['../group__sntp.html#gae66404a551d5cef420cf844a71356fae',1,'sntp_getoperatingmode(void):&#160;sntp.c']]],
+  ['sntp_5fgetreachability_85',['sntp_getreachability',['../group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e',1,'sntp_getreachability(u8_t idx):&#160;sntp.c'],['../group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e',1,'sntp_getreachability(u8_t idx):&#160;sntp.c']]],
+  ['sntp_5fgetserver_86',['sntp_getserver',['../group__sntp.html#gab114c12154cf2c3e3a733724c6a77429',1,'sntp_getserver(u8_t idx):&#160;sntp.c'],['../group__sntp.html#gab114c12154cf2c3e3a733724c6a77429',1,'sntp_getserver(u8_t idx):&#160;sntp.c']]],
+  ['sntp_5finit_87',['sntp_init',['../group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba',1,'sntp_init(void):&#160;sntp.c'],['../group__sntp.html#ga9b300c6616de60524c85ea40bf70e2ba',1,'sntp_init(void):&#160;sntp.c']]],
+  ['sntp_5fsetoperatingmode_88',['sntp_setoperatingmode',['../group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120',1,'sntp_setoperatingmode(u8_t operating_mode):&#160;sntp.c'],['../group__sntp.html#gaae94fb2adadbf9667e9597f8a45bf120',1,'sntp_setoperatingmode(u8_t operating_mode):&#160;sntp.c']]],
+  ['sntp_5fsetserver_89',['sntp_setserver',['../group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a',1,'sntp_setserver(u8_t idx, const ip_addr_t *server):&#160;sntp.c'],['../group__sntp.html#ga4fa038dcea66349fafdbe1cc3e52ff3a',1,'sntp_setserver(u8_t idx, const ip_addr_t *addr):&#160;sntp.c']]],
+  ['sntp_5fstop_90',['sntp_stop',['../group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488',1,'sntp_stop(void):&#160;sntp.c'],['../group__sntp.html#ga8119fc2d1ff7ff6eba511cc9c7167488',1,'sntp_stop(void):&#160;sntp.c']]],
+  ['stats_5finit_91',['stats_init',['../stats_8c.html#aeaa149d6c0445b22e944a063e0884d0d',1,'stats_init(void):&#160;stats.c'],['../stats_8h.html#aeaa149d6c0445b22e944a063e0884d0d',1,'stats_init(void):&#160;stats.c']]],
+  ['sys_5farch_5fmbox_5ffetch_92',['sys_arch_mbox_fetch',['../group__sys__mbox.html#ga6464cd77cf6799bd8b3d6c840166a2e8',1,'sys.h']]],
+  ['sys_5farch_5fmbox_5ftryfetch_93',['sys_arch_mbox_tryfetch',['../group__sys__mbox.html#gafab441b130b4ec417012835dbe1e497c',1,'sys.h']]],
+  ['sys_5farch_5fsem_5fwait_94',['sys_arch_sem_wait',['../group__sys__sem.html#ga8d364c5037778acb21c3df675db81b4f',1,'sys.h']]],
+  ['sys_5fcheck_5ftimeouts_95',['sys_check_timeouts',['../group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883',1,'sys_check_timeouts(void):&#160;timeouts.c'],['../group__lwip__nosys.html#ga83cffdf69ab60fd0eba9d17d363f9883',1,'sys_check_timeouts(void):&#160;timeouts.c']]],
+  ['sys_5finit_96',['sys_init',['../group__sys__misc.html#gaf411a8bc6b7ed4b0af9114e10c959448',1,'sys.h']]],
+  ['sys_5fjiffies_97',['sys_jiffies',['../sys_8h.html#ac89f307e8b360eaf821b461a4f26753a',1,'sys.h']]],
+  ['sys_5fmbox_5ffree_98',['sys_mbox_free',['../group__sys__mbox.html#gac641a45812155d2234ef80dd6412882f',1,'sys.h']]],
+  ['sys_5fmbox_5fnew_99',['sys_mbox_new',['../group__sys__mbox.html#gab9793f30642de06ce87827e9adbe30cc',1,'sys.h']]],
+  ['sys_5fmbox_5fpost_100',['sys_mbox_post',['../group__sys__mbox.html#ga9d068386a3c53dd01b8af99c3ef77555',1,'sys.h']]],
+  ['sys_5fmbox_5fset_5finvalid_101',['sys_mbox_set_invalid',['../group__sys__mbox.html#ga53ddec9d7f5500c5b1d982cd17493172',1,'sys.h']]],
+  ['sys_5fmbox_5ftrypost_102',['sys_mbox_trypost',['../group__sys__mbox.html#gaa36345e48a49d67cbb0878cd4cbd2195',1,'sys.h']]],
+  ['sys_5fmbox_5ftrypost_5ffromisr_103',['sys_mbox_trypost_fromisr',['../group__sys__mbox.html#gaf677a6e76adb7650a3020fdb3cb8429a',1,'sys.h']]],
+  ['sys_5fmbox_5fvalid_104',['sys_mbox_valid',['../group__sys__mbox.html#ga8bcfab4bd791dd33f69a778e7585275d',1,'sys.h']]],
+  ['sys_5fmsleep_105',['sys_msleep',['../group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e',1,'sys_msleep(u32_t ms):&#160;sys.c'],['../group__sys__misc.html#ga6b8786f43e779953e8b74e983c88682e',1,'sys_msleep(u32_t ms):&#160;sys.c']]],
+  ['sys_5fmutex_5ffree_106',['sys_mutex_free',['../group__sys__mutex.html#ga16336ce68b741e98204102ca4bc84dd9',1,'sys.h']]],
+  ['sys_5fmutex_5flock_107',['sys_mutex_lock',['../group__sys__mutex.html#ga4d4eb9afe5965fa2661dd54ff55d616a',1,'sys.h']]],
+  ['sys_5fmutex_5fnew_108',['sys_mutex_new',['../group__sys__mutex.html#ga38e7dae1fd88b338eb1cd97f110f3897',1,'sys.h']]],
+  ['sys_5fmutex_5fset_5finvalid_109',['sys_mutex_set_invalid',['../group__sys__mutex.html#ga3f392725971dc837aa56dd7e45fa7ca8',1,'sys.h']]],
+  ['sys_5fmutex_5funlock_110',['sys_mutex_unlock',['../group__sys__mutex.html#ga5568f68898fe9d5735f9ce2f665624fb',1,'sys.h']]],
+  ['sys_5fmutex_5fvalid_111',['sys_mutex_valid',['../group__sys__mutex.html#gaebe83ba90a6d9c23cdb3eb5d49562c4a',1,'sys.h']]],
+  ['sys_5fnow_112',['sys_now',['../group__sys__time.html#ga11316ac1e77418c6fa4ab8869e3fa199',1,'sys.h']]],
+  ['sys_5frestart_5ftimeouts_113',['sys_restart_timeouts',['../timeouts_8c.html#a6913959cf264dbe876b7e7c4db1cc13e',1,'sys_restart_timeouts(void):&#160;timeouts.c'],['../timeouts_8h.html#a6913959cf264dbe876b7e7c4db1cc13e',1,'sys_restart_timeouts(void):&#160;timeouts.c']]],
+  ['sys_5fsem_5ffree_114',['sys_sem_free',['../group__sys__sem.html#ga83b781f96c30e915c752065a757da283',1,'sys.h']]],
+  ['sys_5fsem_5fnew_115',['sys_sem_new',['../group__sys__sem.html#gaf99da9e34a71855285c535183133dfde',1,'sys.h']]],
+  ['sys_5fsem_5fset_5finvalid_116',['sys_sem_set_invalid',['../group__sys__sem.html#ga42a2ab32afbf41a4146a9d135224ef33',1,'sys.h']]],
+  ['sys_5fsem_5fsignal_117',['sys_sem_signal',['../group__sys__sem.html#gaaf800273061fcc3f8200fd4e1b9ca875',1,'sys.h']]],
+  ['sys_5fsem_5fvalid_118',['sys_sem_valid',['../group__sys__sem.html#ga09a6c052ddaf799139efc56adfa087e4',1,'sys.h']]],
+  ['sys_5fthread_5fnew_119',['sys_thread_new',['../group__sys__misc.html#ga0d596afdd8dbcfad320172d39b0f607a',1,'sys.h']]],
+  ['sys_5ftimeout_120',['sys_timeout',['../timeouts_8c.html#a8deed391626ec8b5423998e33782d7a8',1,'sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg):&#160;timeouts.c'],['../timeouts_8h.html#a8deed391626ec8b5423998e33782d7a8',1,'sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg):&#160;timeouts.c']]],
+  ['sys_5ftimeouts_5finit_121',['sys_timeouts_init',['../timeouts_8c.html#a60f42f167f496f6f740c8df48f4dd26c',1,'sys_timeouts_init(void):&#160;timeouts.c'],['../timeouts_8h.html#a60f42f167f496f6f740c8df48f4dd26c',1,'sys_timeouts_init(void):&#160;timeouts.c']]],
+  ['sys_5ftimeouts_5fsleeptime_122',['sys_timeouts_sleeptime',['../timeouts_8c.html#aa9971a14a5810cfeb1efd7104cde6664',1,'sys_timeouts_sleeptime(void):&#160;timeouts.c'],['../timeouts_8h.html#aa9971a14a5810cfeb1efd7104cde6664',1,'sys_timeouts_sleeptime(void):&#160;timeouts.c']]],
+  ['sys_5funtimeout_123',['sys_untimeout',['../timeouts_8c.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6',1,'sys_untimeout(sys_timeout_handler handler, void *arg):&#160;timeouts.c'],['../timeouts_8h.html#adbfcaa78f4b8d71ae0d7f0bcab6f8fb6',1,'sys_untimeout(sys_timeout_handler handler, void *arg):&#160;timeouts.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_d.js b/doc/doxygen/output/html/search/functions_d.js
index 152d872..cadc68a 100644
--- a/doc/doxygen/output/html/search/functions_d.js
+++ b/doc/doxygen/output/html/search/functions_d.js
@@ -1,18 +1,82 @@
 var searchData=
 [
-  ['udp_5fbind_0',['udp_bind',['../group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e',1,'udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;udp.c'],['../group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e',1,'udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;udp.c']]],
-  ['udp_5fbind_5fnetif_1',['udp_bind_netif',['../group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8',1,'udp_bind_netif(struct udp_pcb *pcb, const struct netif *netif):&#160;udp.c'],['../group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8',1,'udp_bind_netif(struct udp_pcb *pcb, const struct netif *netif):&#160;udp.c']]],
-  ['udp_5fconnect_2',['udp_connect',['../group__udp__raw.html#ga83625967670477aa254643129a53971b',1,'udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;udp.c'],['../group__udp__raw.html#ga83625967670477aa254643129a53971b',1,'udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;udp.c']]],
-  ['udp_5fdisconnect_3',['udp_disconnect',['../group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc',1,'udp_disconnect(struct udp_pcb *pcb):&#160;udp.c'],['../group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc',1,'udp_disconnect(struct udp_pcb *pcb):&#160;udp.c']]],
-  ['udp_5finit_4',['udp_init',['../udp_8c.html#ae7f7431ce99333577d7b82b26619309e',1,'udp_init(void):&#160;udp.c'],['../udp_8h.html#ae7f7431ce99333577d7b82b26619309e',1,'udp_init(void):&#160;udp.c']]],
-  ['udp_5finput_5',['udp_input',['../udp_8c.html#a7b338a5515606bd51976fbc5bcec9611',1,'udp_input(struct pbuf *p, struct netif *inp):&#160;udp.c'],['../udp_8h.html#a7b338a5515606bd51976fbc5bcec9611',1,'udp_input(struct pbuf *p, struct netif *inp):&#160;udp.c']]],
-  ['udp_5fnetif_5fip_5faddr_5fchanged_6',['udp_netif_ip_addr_changed',['../udp_8c.html#ab857f86a0b15d02b864292b161b2c3fc',1,'udp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;udp.c'],['../udp_8h.html#ab857f86a0b15d02b864292b161b2c3fc',1,'udp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;udp.c']]],
-  ['udp_5fnew_7',['udp_new',['../group__udp__raw.html#ga0601b0c0a2471fd7b6cfa217cc6c1eb7',1,'udp_new(void):&#160;udp.c'],['../group__udp__raw.html#ga0601b0c0a2471fd7b6cfa217cc6c1eb7',1,'udp_new(void):&#160;udp.c']]],
-  ['udp_5fnew_5fip_5ftype_8',['udp_new_ip_type',['../group__udp__raw.html#gaa426f09a4212893cf3308d9eeec0399a',1,'udp_new_ip_type(u8_t type):&#160;udp.c'],['../group__udp__raw.html#gaa426f09a4212893cf3308d9eeec0399a',1,'udp_new_ip_type(u8_t type):&#160;udp.c']]],
-  ['udp_5frecv_9',['udp_recv',['../group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027',1,'udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg):&#160;udp.c'],['../group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027',1,'udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg):&#160;udp.c']]],
-  ['udp_5fremove_10',['udp_remove',['../group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646',1,'udp_remove(struct udp_pcb *pcb):&#160;udp.c'],['../group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646',1,'udp_remove(struct udp_pcb *pcb):&#160;udp.c']]],
-  ['udp_5fsend_11',['udp_send',['../group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc',1,'udp_send(struct udp_pcb *pcb, struct pbuf *p):&#160;udp.c'],['../group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc',1,'udp_send(struct udp_pcb *pcb, struct pbuf *p):&#160;udp.c']]],
-  ['udp_5fsendto_12',['udp_sendto',['../group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743',1,'udp_sendto(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port):&#160;udp.c'],['../group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743',1,'udp_sendto(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port):&#160;udp.c']]],
-  ['udp_5fsendto_5fif_13',['udp_sendto_if',['../group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142',1,'udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif):&#160;udp.c'],['../group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142',1,'udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif):&#160;udp.c']]],
-  ['udp_5fsendto_5fif_5fsrc_14',['udp_sendto_if_src',['../group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7',1,'udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip):&#160;udp.c'],['../group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7',1,'udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip):&#160;udp.c']]]
+  ['tcp_5fabandon_0',['tcp_abandon',['../tcp_8c.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe',1,'tcp_abandon(struct tcp_pcb *pcb, int reset):&#160;tcp.c'],['../tcp__priv_8h.html#ae4f0f1ca01dbccd680eaa2d8433cd7fe',1,'tcp_abandon(struct tcp_pcb *pcb, int reset):&#160;tcp.c']]],
+  ['tcp_5fabort_1',['tcp_abort',['../group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61',1,'tcp_abort(struct tcp_pcb *pcb):&#160;tcp.c'],['../group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61',1,'tcp_abort(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5faccept_2',['tcp_accept',['../group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62',1,'tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept):&#160;tcp.c'],['../group__tcp__raw.html#gaff4c3e380fc60c8fb9b3aa95eda94c62',1,'tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept):&#160;tcp.c']]],
+  ['tcp_5falloc_3',['tcp_alloc',['../tcp_8c.html#a9a4cb4f0391916cea723b5b5a11df2bb',1,'tcp_alloc(u8_t prio):&#160;tcp.c'],['../tcp__priv_8h.html#a9a4cb4f0391916cea723b5b5a11df2bb',1,'tcp_alloc(u8_t prio):&#160;tcp.c']]],
+  ['tcp_5farg_4',['tcp_arg',['../group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6',1,'tcp_arg(struct tcp_pcb *pcb, void *arg):&#160;tcp.c'],['../group__tcp__raw.html#gac10926e6f76f73e17c0d37aaab3e56b6',1,'tcp_arg(struct tcp_pcb *pcb, void *arg):&#160;tcp.c']]],
+  ['tcp_5fbacklog_5faccepted_5',['tcp_backlog_accepted',['../group__tcp__raw.html#ga619154658137a23839ca3b94882131ca',1,'tcp_backlog_accepted(struct tcp_pcb *pcb):&#160;tcp.c'],['../group__tcp__raw.html#ga619154658137a23839ca3b94882131ca',1,'tcp_backlog_accepted(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5fbacklog_5fdelayed_6',['tcp_backlog_delayed',['../group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8',1,'tcp_backlog_delayed(struct tcp_pcb *pcb):&#160;tcp.c'],['../group__tcp__raw.html#ga427b11c7b98c748ec487cd43093bd2f8',1,'tcp_backlog_delayed(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5fbind_7',['tcp_bind',['../group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee',1,'tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;tcp.c'],['../group__tcp__raw.html#gacf5aa67bd7fc66fef43f77a55a1201ee',1,'tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;tcp.c']]],
+  ['tcp_5fbind_5fnetif_8',['tcp_bind_netif',['../group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f',1,'tcp_bind_netif(struct tcp_pcb *pcb, const struct netif *netif):&#160;tcp.c'],['../group__tcp__raw.html#ga6469a15709088e80024258dbe80fcd1f',1,'tcp_bind_netif(struct tcp_pcb *pcb, const struct netif *netif):&#160;tcp.c']]],
+  ['tcp_5fclose_9',['tcp_close',['../group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623',1,'tcp_close(struct tcp_pcb *pcb):&#160;tcp.c'],['../group__tcp__raw.html#ga87093e137fcc53ea82a134a3f5b33623',1,'tcp_close(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5fconnect_10',['tcp_connect',['../group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012',1,'tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, tcp_connected_fn connected):&#160;tcp.c'],['../group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012',1,'tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, tcp_connected_fn connected):&#160;tcp.c']]],
+  ['tcp_5feff_5fsend_5fmss_5fnetif_11',['tcp_eff_send_mss_netif',['../tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3',1,'tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, const ip_addr_t *dest):&#160;tcp.c'],['../tcp__priv_8h.html#a08a3b5396c40f32dd8b21e7d63b3e1b3',1,'tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, const ip_addr_t *dest):&#160;tcp.c']]],
+  ['tcp_5fenqueue_5fflags_12',['tcp_enqueue_flags',['../tcp__out_8c.html#aa7d5d552647d567095876aab202bfd1a',1,'tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags):&#160;tcp_out.c'],['../tcp__priv_8h.html#aa7d5d552647d567095876aab202bfd1a',1,'tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags):&#160;tcp_out.c']]],
+  ['tcp_5ferr_13',['tcp_err',['../group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121',1,'tcp_err(struct tcp_pcb *pcb, tcp_err_fn err):&#160;tcp.c'],['../group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121',1,'tcp_err(struct tcp_pcb *pcb, tcp_err_fn err):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5falloc_5fid_14',['tcp_ext_arg_alloc_id',['../group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616',1,'tcp_ext_arg_alloc_id(void):&#160;tcp.c'],['../group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616',1,'tcp_ext_arg_alloc_id(void):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5fget_15',['tcp_ext_arg_get',['../group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, u8_t id):&#160;tcp.c'],['../group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56',1,'tcp_ext_arg_get(const struct tcp_pcb *pcb, u8_t id):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5finvoke_5fcallbacks_5fpassive_5fopen_16',['tcp_ext_arg_invoke_callbacks_passive_open',['../tcp_8c.html#a5265b1df024d04287ed3edc02b1b9ccc',1,'tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb):&#160;tcp.c'],['../tcp__priv_8h.html#a5265b1df024d04287ed3edc02b1b9ccc',1,'tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5fset_17',['tcp_ext_arg_set',['../group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e',1,'tcp_ext_arg_set(struct tcp_pcb *pcb, u8_t id, void *arg):&#160;tcp.c'],['../group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e',1,'tcp_ext_arg_set(struct tcp_pcb *pcb, u8_t id, void *arg):&#160;tcp.c']]],
+  ['tcp_5fext_5farg_5fset_5fcallbacks_18',['tcp_ext_arg_set_callbacks',['../group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5',1,'tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, u8_t id, const struct tcp_ext_arg_callbacks *const callbacks):&#160;tcp.c'],['../group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5',1,'tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, u8_t id, const struct tcp_ext_arg_callbacks *const callbacks):&#160;tcp.c']]],
+  ['tcp_5ffasttmr_19',['tcp_fasttmr',['../tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d',1,'tcp_fasttmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#abf446b07e52161b8a53cea07bc6c366d',1,'tcp_fasttmr(void):&#160;tcp.c']]],
+  ['tcp_5ffree_20',['tcp_free',['../tcp_8c.html#aa2b6b075c27c64dfb8c402ac961fb910',1,'tcp_free(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#aa2b6b075c27c64dfb8c402ac961fb910',1,'tcp_free(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5finit_21',['tcp_init',['../tcp_8c.html#a51de4ded7d342456d31722493c92c969',1,'tcp_init(void):&#160;tcp.c'],['../tcp__priv_8h.html#a51de4ded7d342456d31722493c92c969',1,'tcp_init(void):&#160;tcp.c']]],
+  ['tcp_5finput_22',['tcp_input',['../tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5',1,'tcp_input(struct pbuf *p, struct netif *inp):&#160;tcp_in.c'],['../tcp__priv_8h.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5',1,'tcp_input(struct pbuf *p, struct netif *inp):&#160;tcp_in.c']]],
+  ['tcp_5fkeepalive_23',['tcp_keepalive',['../tcp__out_8c.html#a0d8bb5fc8522515aa35d305774cc5332',1,'tcp_keepalive(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a0d8bb5fc8522515aa35d305774cc5332',1,'tcp_keepalive(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5flisten_5fwith_5fbacklog_24',['tcp_listen_with_backlog',['../group__tcp__raw.html#ga77bb2ca7f053e73545d36b745f236d54',1,'tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog):&#160;tcp.c'],['../group__tcp__raw.html#ga77bb2ca7f053e73545d36b745f236d54',1,'tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog):&#160;tcp.c']]],
+  ['tcp_5flisten_5fwith_5fbacklog_5fand_5ferr_25',['tcp_listen_with_backlog_and_err',['../group__tcp__raw.html#ga8883f9735809f1679d744bc48f1c674a',1,'tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err):&#160;tcp.c'],['../group__tcp__raw.html#ga8883f9735809f1679d744bc48f1c674a',1,'tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err):&#160;tcp.c']]],
+  ['tcp_5fnetif_5fip_5faddr_5fchanged_26',['tcp_netif_ip_addr_changed',['../tcp_8c.html#a4d0c2d1ad02134c79fc72fe95ee2a703',1,'tcp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;tcp.c'],['../tcp__priv_8h.html#a4d0c2d1ad02134c79fc72fe95ee2a703',1,'tcp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;tcp.c']]],
+  ['tcp_5fnew_27',['tcp_new',['../group__tcp__raw.html#ga2e00c668b99d92113cd595647702be83',1,'tcp_new(void):&#160;tcp.c'],['../group__tcp__raw.html#ga2e00c668b99d92113cd595647702be83',1,'tcp_new(void):&#160;tcp.c']]],
+  ['tcp_5fnew_5fip_5ftype_28',['tcp_new_ip_type',['../group__tcp__raw.html#ga89f6955b7248c76a073cd1be461aeb5b',1,'tcp_new_ip_type(u8_t type):&#160;tcp.c'],['../group__tcp__raw.html#ga89f6955b7248c76a073cd1be461aeb5b',1,'tcp_new_ip_type(u8_t type):&#160;tcp.c']]],
+  ['tcp_5fnext_5fiss_29',['tcp_next_iss',['../tcp_8c.html#afd5dc2fa74855a84b2da642ba31059ea',1,'tcp_next_iss(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#afd5dc2fa74855a84b2da642ba31059ea',1,'tcp_next_iss(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5foutput_30',['tcp_output',['../group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f',1,'tcp_output(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f',1,'tcp_output(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5fpcb_5fpurge_31',['tcp_pcb_purge',['../tcp_8c.html#a44fc672b9d14a65e61040707c45302ba',1,'tcp_pcb_purge(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#a44fc672b9d14a65e61040707c45302ba',1,'tcp_pcb_purge(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5fpcb_5fremove_32',['tcp_pcb_remove',['../tcp_8c.html#aaaef096f6a03bf5b778329bb66ee06f6',1,'tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#aaaef096f6a03bf5b778329bb66ee06f6',1,'tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5fpoll_33',['tcp_poll',['../group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5',1,'tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval):&#160;tcp.c'],['../group__tcp__raw.html#gafba47015098ed7ce523dcf7bdf70f7e5',1,'tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval):&#160;tcp.c']]],
+  ['tcp_5fprocess_5frefused_5fdata_34',['tcp_process_refused_data',['../tcp_8c.html#a0075b56ad4b0eca7c9d439cf150e1973',1,'tcp_process_refused_data(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#a0075b56ad4b0eca7c9d439cf150e1973',1,'tcp_process_refused_data(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5frecv_35',['tcp_recv',['../group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0',1,'tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv):&#160;tcp.c'],['../group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0',1,'tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv):&#160;tcp.c']]],
+  ['tcp_5frecv_5fnull_36',['tcp_recv_null',['../tcp_8c.html#a0cb3f604fc8d20870d8cab291da5701c',1,'tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err):&#160;tcp.c'],['../tcp__priv_8h.html#a0cb3f604fc8d20870d8cab291da5701c',1,'tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err):&#160;tcp.c']]],
+  ['tcp_5frecved_37',['tcp_recved',['../group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44',1,'tcp_recved(struct tcp_pcb *pcb, u16_t len):&#160;tcp.c'],['../group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44',1,'tcp_recved(struct tcp_pcb *pcb, u16_t len):&#160;tcp.c']]],
+  ['tcp_5frexmit_38',['tcp_rexmit',['../tcp__out_8c.html#af75fefe4fe509845be156d6e424eb6f1',1,'tcp_rexmit(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#af75fefe4fe509845be156d6e424eb6f1',1,'tcp_rexmit(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5frexmit_5ffast_39',['tcp_rexmit_fast',['../tcp__out_8c.html#adb6ee7b4d59f125cc8bfac3bb5ca3937',1,'tcp_rexmit_fast(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#adb6ee7b4d59f125cc8bfac3bb5ca3937',1,'tcp_rexmit_fast(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5frexmit_5frto_40',['tcp_rexmit_rto',['../tcp__out_8c.html#ab5ef9c8ab4629eb721987ae316b9f30f',1,'tcp_rexmit_rto(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#ab5ef9c8ab4629eb721987ae316b9f30f',1,'tcp_rexmit_rto(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5frexmit_5frto_5fcommit_41',['tcp_rexmit_rto_commit',['../tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4',1,'tcp_rexmit_rto_commit(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a9ef9dc094e21bdf0779aed25ab0b08d4',1,'tcp_rexmit_rto_commit(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5frexmit_5frto_5fprepare_42',['tcp_rexmit_rto_prepare',['../tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39',1,'tcp_rexmit_rto_prepare(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39',1,'tcp_rexmit_rto_prepare(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5frst_43',['tcp_rst',['../tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014',1,'tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c'],['../tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014',1,'tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c']]],
+  ['tcp_5frst_5fnetif_44',['tcp_rst_netif',['../tcp__out_8c.html#a7cf7cbc5aa473de8116dc9f00cbc5d57',1,'tcp_rst_netif(struct netif *netif, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c'],['../tcp__priv_8h.html#a7cf7cbc5aa473de8116dc9f00cbc5d57',1,'tcp_rst_netif(struct netif *netif, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port):&#160;tcp_out.c']]],
+  ['tcp_5fseg_5fcopy_45',['tcp_seg_copy',['../tcp_8c.html#a9384b436de95d5bf8550438b9d3c8cd4',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4',1,'tcp_seg_copy(struct tcp_seg *seg):&#160;tcp.c']]],
+  ['tcp_5fseg_5ffree_46',['tcp_seg_free',['../tcp_8c.html#ac6283651b26f74dba2444159aee88b20',1,'tcp_seg_free(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20',1,'tcp_seg_free(struct tcp_seg *seg):&#160;tcp.c']]],
+  ['tcp_5fsegs_5ffree_47',['tcp_segs_free',['../tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c',1,'tcp_segs_free(struct tcp_seg *seg):&#160;tcp.c'],['../tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c',1,'tcp_segs_free(struct tcp_seg *seg):&#160;tcp.c']]],
+  ['tcp_5fsend_5fempty_5fack_48',['tcp_send_empty_ack',['../tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996',1,'tcp_send_empty_ack(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#aefde3e34b2cc8df9654986484c44a996',1,'tcp_send_empty_ack(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5fsend_5ffin_49',['tcp_send_fin',['../tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342',1,'tcp_send_fin(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#af40ba9d645a8910436c3d7cf13dba342',1,'tcp_send_fin(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcp_5fsent_50',['tcp_sent',['../group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808',1,'tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent):&#160;tcp.c'],['../group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808',1,'tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent):&#160;tcp.c']]],
+  ['tcp_5fsetprio_51',['tcp_setprio',['../group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc',1,'tcp_setprio(struct tcp_pcb *pcb, u8_t prio):&#160;tcp.c'],['../group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc',1,'tcp_setprio(struct tcp_pcb *pcb, u8_t prio):&#160;tcp.c']]],
+  ['tcp_5fshutdown_52',['tcp_shutdown',['../group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd',1,'tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx):&#160;tcp.c'],['../group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd',1,'tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx):&#160;tcp.c']]],
+  ['tcp_5fslowtmr_53',['tcp_slowtmr',['../tcp_8c.html#a421fb42ef919018e14ae413adfee9905',1,'tcp_slowtmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#a421fb42ef919018e14ae413adfee9905',1,'tcp_slowtmr(void):&#160;tcp.c']]],
+  ['tcp_5fsplit_5funsent_5fseg_54',['tcp_split_unsent_seg',['../tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5',1,'tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split):&#160;tcp_out.c'],['../tcp__priv_8h.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5',1,'tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split):&#160;tcp_out.c']]],
+  ['tcp_5ftimer_5fneeded_55',['tcp_timer_needed',['../timeouts_8c.html#a8181bc316fdf61b85f787c5cadfcd249',1,'tcp_timer_needed(void):&#160;timeouts.c'],['../tcp__priv_8h.html#a8181bc316fdf61b85f787c5cadfcd249',1,'tcp_timer_needed(void):&#160;timeouts.c']]],
+  ['tcp_5ftmr_56',['tcp_tmr',['../tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb',1,'tcp_tmr(void):&#160;tcp.c'],['../tcp__priv_8h.html#a3846a756b13214ed88ea47d0ff8279eb',1,'tcp_tmr(void):&#160;tcp.c']]],
+  ['tcp_5ftxnow_57',['tcp_txnow',['../tcp_8c.html#a5ae0268e59fda0665fdd08c6e77ec547',1,'tcp_txnow(void):&#160;tcp.c'],['../tcp__priv_8h.html#a5ae0268e59fda0665fdd08c6e77ec547',1,'tcp_txnow(void):&#160;tcp.c']]],
+  ['tcp_5fupdate_5frcv_5fann_5fwnd_58',['tcp_update_rcv_ann_wnd',['../tcp_8c.html#a6d2c254b779db4e517cb34e41301588d',1,'tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb):&#160;tcp.c'],['../tcp__priv_8h.html#a6d2c254b779db4e517cb34e41301588d',1,'tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb):&#160;tcp.c']]],
+  ['tcp_5fwrite_59',['tcp_write',['../group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5',1,'tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags):&#160;tcp_out.c'],['../group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5',1,'tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len, u8_t apiflags):&#160;tcp_out.c']]],
+  ['tcp_5fzero_5fwindow_5fprobe_60',['tcp_zero_window_probe',['../tcp__out_8c.html#a6c20490aa45c771c38ce8ad3031cbdf6',1,'tcp_zero_window_probe(struct tcp_pcb *pcb):&#160;tcp_out.c'],['../tcp__priv_8h.html#a6c20490aa45c771c38ce8ad3031cbdf6',1,'tcp_zero_window_probe(struct tcp_pcb *pcb):&#160;tcp_out.c']]],
+  ['tcpip_5f6lowpan_5finput_61',['tcpip_6lowpan_input',['../group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b',1,'tcpip_6lowpan_input(struct pbuf *p, struct netif *inp):&#160;lowpan6.c'],['../group__sixlowpan.html#ga9d9b93c47dd138fd84a503ffecb9336b',1,'tcpip_6lowpan_input(struct pbuf *p, struct netif *inp):&#160;lowpan6.c']]],
+  ['tcpip_5fapi_5fcall_62',['tcpip_api_call',['../tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08',1,'tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call):&#160;tcpip.c'],['../tcpip__priv_8h.html#a3d42b0c46607f91aedcc7745ed466b08',1,'tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call):&#160;tcpip.c']]],
+  ['tcpip_5fcallback_63',['tcpip_callback',['../group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a',1,'tcpip_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a',1,'tcpip_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['tcpip_5fcallback_5fwait_64',['tcpip_callback_wait',['../tcpip_8c.html#a8d8a2ac0271def71a4ca31b24a31228f',1,'tcpip_callback_wait(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../tcpip_8h.html#a8d8a2ac0271def71a4ca31b24a31228f',1,'tcpip_callback_wait(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['tcpip_5fcallbackmsg_5fdelete_65',['tcpip_callbackmsg_delete',['../group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd',1,'tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd',1,'tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
+  ['tcpip_5fcallbackmsg_5fnew_66',['tcpip_callbackmsg_new',['../group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1',1,'tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['tcpip_5fcallbackmsg_5ftrycallback_67',['tcpip_callbackmsg_trycallback',['../group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8',1,'tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8',1,'tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
+  ['tcpip_5fcallbackmsg_5ftrycallback_5ffromisr_68',['tcpip_callbackmsg_trycallback_fromisr',['../group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666',1,'tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg):&#160;tcpip.c'],['../group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666',1,'tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg):&#160;tcpip.c']]],
+  ['tcpip_5finit_69',['tcpip_init',['../group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db',1,'tcpip_init(tcpip_init_done_fn initfunc, void *arg):&#160;tcpip.c'],['../group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db',1,'tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg):&#160;tcpip.c']]],
+  ['tcpip_5finpkt_70',['tcpip_inpkt',['../tcpip_8c.html#a93043b3c66dbe4a15a60299c6199d102',1,'tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn):&#160;tcpip.c'],['../tcpip_8h.html#a93043b3c66dbe4a15a60299c6199d102',1,'tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn):&#160;tcpip.c']]],
+  ['tcpip_5finput_71',['tcpip_input',['../group__lwip__os.html#gae510f195171bed8499ae94e264a92717',1,'tcpip_input(struct pbuf *p, struct netif *inp):&#160;tcpip.c'],['../group__lwip__os.html#gae510f195171bed8499ae94e264a92717',1,'tcpip_input(struct pbuf *p, struct netif *inp):&#160;tcpip.c']]],
+  ['tcpip_5frfc7668_5finput_72',['tcpip_rfc7668_input',['../lowpan6__ble_8h.html#a6ae90ad69f5d901eb44cf87b9120cd9a',1,'tcpip_rfc7668_input(struct pbuf *p, struct netif *inp):&#160;lowpan6_ble.c'],['../lowpan6__ble_8c.html#a6ae90ad69f5d901eb44cf87b9120cd9a',1,'tcpip_rfc7668_input(struct pbuf *p, struct netif *inp):&#160;lowpan6_ble.c']]],
+  ['tcpip_5fsend_5fmsg_5fwait_5fsem_73',['tcpip_send_msg_wait_sem',['../tcpip_8c.html#a12bdf37eddcd72c4178e3ea7d370395d',1,'tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem):&#160;tcpip.c'],['../tcpip__priv_8h.html#a12bdf37eddcd72c4178e3ea7d370395d',1,'tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem):&#160;tcpip.c']]],
+  ['tcpip_5ftry_5fcallback_74',['tcpip_try_callback',['../group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020',1,'tcpip_try_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c'],['../group__lwip__os.html#gaeb7b3c7414c76ad8dde14d2fba6cb020',1,'tcpip_try_callback(tcpip_callback_fn function, void *ctx):&#160;tcpip.c']]],
+  ['tftp_5fcleanup_75',['tftp_cleanup',['../group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec',1,'tftp_cleanup(void):&#160;tftp.c'],['../group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec',1,'tftp_cleanup(void):&#160;tftp.c']]],
+  ['tftp_5finit_5fclient_76',['tftp_init_client',['../group__tftp.html#gaa6b743a64287206acb825bd60448e5f8',1,'tftp_init_client(const struct tftp_context *ctx):&#160;tftp.c'],['../group__tftp.html#gaa6b743a64287206acb825bd60448e5f8',1,'tftp_init_client(const struct tftp_context *ctx):&#160;tftp.c']]],
+  ['tftp_5finit_5fcommon_77',['tftp_init_common',['../tftp_8c.html#a5c6cf3de84a0dc990c055d66e574ca70',1,'tftp_init_common(u8_t mode, const struct tftp_context *ctx):&#160;tftp.c'],['../tftp__common_8h.html#a5c6cf3de84a0dc990c055d66e574ca70',1,'tftp_init_common(u8_t mode, const struct tftp_context *ctx):&#160;tftp.c']]],
+  ['tftp_5finit_5fserver_78',['tftp_init_server',['../group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40',1,'tftp_init_server(const struct tftp_context *ctx):&#160;tftp.c'],['../group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40',1,'tftp_init_server(const struct tftp_context *ctx):&#160;tftp.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_e.js b/doc/doxygen/output/html/search/functions_e.js
index b95757c..152d872 100644
--- a/doc/doxygen/output/html/search/functions_e.js
+++ b/doc/doxygen/output/html/search/functions_e.js
@@ -1,4 +1,18 @@
 var searchData=
 [
-  ['zepif_5finit_0',['zepif_init',['../group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004',1,'zepif_init(struct netif *netif):&#160;zepif.c'],['../group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004',1,'zepif_init(struct netif *netif):&#160;zepif.c']]]
+  ['udp_5fbind_0',['udp_bind',['../group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e',1,'udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;udp.c'],['../group__udp__raw.html#gac7fbda8b12b9b9360e92b51e805e799e',1,'udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;udp.c']]],
+  ['udp_5fbind_5fnetif_1',['udp_bind_netif',['../group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8',1,'udp_bind_netif(struct udp_pcb *pcb, const struct netif *netif):&#160;udp.c'],['../group__udp__raw.html#ga4360535ae72e77019721c9637a1051a8',1,'udp_bind_netif(struct udp_pcb *pcb, const struct netif *netif):&#160;udp.c']]],
+  ['udp_5fconnect_2',['udp_connect',['../group__udp__raw.html#ga83625967670477aa254643129a53971b',1,'udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;udp.c'],['../group__udp__raw.html#ga83625967670477aa254643129a53971b',1,'udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port):&#160;udp.c']]],
+  ['udp_5fdisconnect_3',['udp_disconnect',['../group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc',1,'udp_disconnect(struct udp_pcb *pcb):&#160;udp.c'],['../group__udp__raw.html#ga8d26559743e59e4b409c92a268ee67fc',1,'udp_disconnect(struct udp_pcb *pcb):&#160;udp.c']]],
+  ['udp_5finit_4',['udp_init',['../udp_8c.html#ae7f7431ce99333577d7b82b26619309e',1,'udp_init(void):&#160;udp.c'],['../udp_8h.html#ae7f7431ce99333577d7b82b26619309e',1,'udp_init(void):&#160;udp.c']]],
+  ['udp_5finput_5',['udp_input',['../udp_8c.html#a7b338a5515606bd51976fbc5bcec9611',1,'udp_input(struct pbuf *p, struct netif *inp):&#160;udp.c'],['../udp_8h.html#a7b338a5515606bd51976fbc5bcec9611',1,'udp_input(struct pbuf *p, struct netif *inp):&#160;udp.c']]],
+  ['udp_5fnetif_5fip_5faddr_5fchanged_6',['udp_netif_ip_addr_changed',['../udp_8c.html#ab857f86a0b15d02b864292b161b2c3fc',1,'udp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;udp.c'],['../udp_8h.html#ab857f86a0b15d02b864292b161b2c3fc',1,'udp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr):&#160;udp.c']]],
+  ['udp_5fnew_7',['udp_new',['../group__udp__raw.html#ga0601b0c0a2471fd7b6cfa217cc6c1eb7',1,'udp_new(void):&#160;udp.c'],['../group__udp__raw.html#ga0601b0c0a2471fd7b6cfa217cc6c1eb7',1,'udp_new(void):&#160;udp.c']]],
+  ['udp_5fnew_5fip_5ftype_8',['udp_new_ip_type',['../group__udp__raw.html#gaa426f09a4212893cf3308d9eeec0399a',1,'udp_new_ip_type(u8_t type):&#160;udp.c'],['../group__udp__raw.html#gaa426f09a4212893cf3308d9eeec0399a',1,'udp_new_ip_type(u8_t type):&#160;udp.c']]],
+  ['udp_5frecv_9',['udp_recv',['../group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027',1,'udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg):&#160;udp.c'],['../group__udp__raw.html#gada6d02b9a5f35e1fb2e1bc71b11e6027',1,'udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg):&#160;udp.c']]],
+  ['udp_5fremove_10',['udp_remove',['../group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646',1,'udp_remove(struct udp_pcb *pcb):&#160;udp.c'],['../group__udp__raw.html#ga3aed8e469f74f960837ebf9f34acf646',1,'udp_remove(struct udp_pcb *pcb):&#160;udp.c']]],
+  ['udp_5fsend_11',['udp_send',['../group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc',1,'udp_send(struct udp_pcb *pcb, struct pbuf *p):&#160;udp.c'],['../group__udp__raw.html#gaa4546c43981f043c0ae4514d625cc3fc',1,'udp_send(struct udp_pcb *pcb, struct pbuf *p):&#160;udp.c']]],
+  ['udp_5fsendto_12',['udp_sendto',['../group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743',1,'udp_sendto(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port):&#160;udp.c'],['../group__udp__raw.html#gaa0e135a5958f1f0cc83cbeb609e18743',1,'udp_sendto(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port):&#160;udp.c']]],
+  ['udp_5fsendto_5fif_13',['udp_sendto_if',['../group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142',1,'udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif):&#160;udp.c'],['../group__udp__raw.html#ga83f8c873671ca7f307d14b29a0a7a142',1,'udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif):&#160;udp.c']]],
+  ['udp_5fsendto_5fif_5fsrc_14',['udp_sendto_if_src',['../group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7',1,'udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip):&#160;udp.c'],['../group__udp__raw.html#gaa389827c979c766c1dae301239f7bbb7',1,'udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip):&#160;udp.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/functions_f.js b/doc/doxygen/output/html/search/functions_f.js
new file mode 100644
index 0000000..b95757c
--- /dev/null
+++ b/doc/doxygen/output/html/search/functions_f.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['zepif_5finit_0',['zepif_init',['../group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004',1,'zepif_init(struct netif *netif):&#160;zepif.c'],['../group__zepif.html#gad61a6d9c1ab17e5b2c2c3eb9b42cc004',1,'zepif_init(struct netif *netif):&#160;zepif.c']]]
+];
diff --git a/doc/doxygen/output/html/search/groups_11.js b/doc/doxygen/output/html/search/groups_11.js
index a28d29e..c2440ff 100644
--- a/doc/doxygen/output/html/search/groups_11.js
+++ b/doc/doxygen/output/html/search/groups_11.js
@@ -4,7 +4,7 @@
   ['sections_1',['Critical sections',['../group__sys__prot.html',1,'']]],
   ['semaphores_2',['Semaphores',['../group__sys__sem.html',1,'']]],
   ['sequential_20style_20apis_3',['Sequential-style APIs',['../group__sequential__api.html',1,'']]],
-  ['server_4',['server',['../group__httpd.html',1,'HTTP server'],['../group__iperf.html',1,'Iperf server'],['../group__tftp.html',1,'TFTP server']]],
+  ['server_4',['server',['../group__httpd.html',1,'HTTP server'],['../group__iperf.html',1,'Iperf server'],['../group__tftp.html',1,'TFTP client/server']]],
   ['slip_5',['SLIP',['../group__slipif.html',1,'']]],
   ['smtp_20client_6',['SMTP client',['../group__smtp.html',1,'']]],
   ['snmp_20mib2_20callbacks_7',['SNMP MIB2 callbacks',['../group__lwip__opts__mib2.html',1,'']]],
diff --git a/doc/doxygen/output/html/search/groups_12.js b/doc/doxygen/output/html/search/groups_12.js
index f8d70d7..f16755e 100644
--- a/doc/doxygen/output/html/search/groups_12.js
+++ b/doc/doxygen/output/html/search/groups_12.js
@@ -5,7 +5,7 @@
   ['tcp_20introduction_2',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
   ['tcp_20only_3',['TCP only',['../group__netconn__tcp.html',1,'']]],
   ['tcpip_20thread_4',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
-  ['tftp_20server_5',['TFTP server',['../group__tftp.html',1,'']]],
+  ['tftp_20client_20server_5',['TFTP client/server',['../group__tftp.html',1,'']]],
   ['thread_6',['OS mode (TCPIP thread)',['../group__lwip__os.html',1,'']]],
   ['thread_20safe_20apis_7',['Thread-safe APIs',['../group__lwip__opts__threadsafe__apis.html',1,'']]],
   ['threading_8',['Threading',['../group__lwip__opts__thread.html',1,'']]],
diff --git a/doc/doxygen/output/html/search/groups_3.js b/doc/doxygen/output/html/search/groups_3.js
index e74cc8b..03ab0da 100644
--- a/doc/doxygen/output/html/search/groups_3.js
+++ b/doc/doxygen/output/html/search/groups_3.js
@@ -2,19 +2,20 @@
 [
   ['abstraction_0',['Compiler/platform abstraction',['../group__compiler__abstraction.html',1,'']]],
   ['abstraction_20layer_1',['abstraction layer',['../group__sys__os.html',1,'OS abstraction layer'],['../group__sys__layer.html',1,'Porting (system abstraction layer)']]],
-  ['address_20handling_2',['address handling',['../group__ipaddr.html',1,'IP address handling'],['../group__netif__ip4.html',1,'IPv4 address handling'],['../group__netif__ip6.html',1,'IPv6 address handling']]],
-  ['agent_3',['SNMPv2c/v3 agent',['../group__snmp.html',1,'']]],
-  ['and_20lwip_5fdbg_5ftypes_5fon_20values_4',['LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values',['../group__debugging__levels.html',1,'']]],
-  ['and_20memory_20pools_5',['Heap and memory pools',['../group__lwip__opts__mem.html',1,'']]],
-  ['and_20mpu_6',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
-  ['api_7',['API',['../group__if__api.html',1,'Interface Identification API'],['../group__netconn.html',1,'Netconn API'],['../group__netdbapi.html',1,'NETDB API'],['../group__netifapi.html',1,'NETIF API'],['../group__socket.html',1,'Socket API']]],
-  ['apis_8',['APIs',['../group__callbackstyle__api.html',1,'&quot;raw&quot; APIs'],['../group__api.html',1,'APIs'],['../group__lwip__opts__callback.html',1,'Callback-style APIs'],['../group__sequential__api.html',1,'Sequential-style APIs'],['../group__lwip__opts__threadsafe__apis.html',1,'Thread-safe APIs']]],
-  ['application_20layered_20tcp_20functions_9',['Application layered TCP Functions',['../group__altcp.html',1,'']]],
-  ['application_20layered_20tcp_20introduction_10',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
-  ['applications_11',['Applications',['../group__apps.html',1,'']]],
-  ['arguments_12',['ext arguments',['../group__tcp__raw__extargs.html',1,'']]],
-  ['arp_13',['ARP',['../group__lwip__opts__arp.html',1,'']]],
-  ['assertion_20handling_14',['Assertion handling',['../group__lwip__assertions.html',1,'']]],
-  ['assigned_20numbers_15',['assigned numbers',['../group__iana.html',1,'IANA assigned numbers'],['../group__ieee.html',1,'IEEE assigned numbers']]],
-  ['autoip_16',['AUTOIP',['../group__autoip.html',1,'AUTOIP'],['../group__netifapi__autoip.html',1,'AUTOIP'],['../group__lwip__opts__autoip.html',1,'AUTOIP']]]
+  ['acd_2',['ACD',['../group__acd.html',1,'ACD'],['../group__lwip__opts__acd.html',1,'ACD']]],
+  ['address_20handling_3',['address handling',['../group__ipaddr.html',1,'IP address handling'],['../group__netif__ip4.html',1,'IPv4 address handling'],['../group__netif__ip6.html',1,'IPv6 address handling']]],
+  ['agent_4',['SNMPv2c/v3 agent',['../group__snmp.html',1,'']]],
+  ['and_20lwip_5fdbg_5ftypes_5fon_20values_5',['LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values',['../group__debugging__levels.html',1,'']]],
+  ['and_20memory_20pools_6',['Heap and memory pools',['../group__lwip__opts__mem.html',1,'']]],
+  ['and_20mpu_7',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
+  ['api_8',['API',['../group__if__api.html',1,'Interface Identification API'],['../group__netconn.html',1,'Netconn API'],['../group__netdbapi.html',1,'NETDB API'],['../group__netifapi.html',1,'NETIF API'],['../group__socket.html',1,'Socket API']]],
+  ['apis_9',['APIs',['../group__callbackstyle__api.html',1,'&quot;raw&quot; APIs'],['../group__api.html',1,'APIs'],['../group__lwip__opts__callback.html',1,'Callback-style APIs'],['../group__sequential__api.html',1,'Sequential-style APIs'],['../group__lwip__opts__threadsafe__apis.html',1,'Thread-safe APIs']]],
+  ['application_20layered_20tcp_20functions_10',['Application layered TCP Functions',['../group__altcp.html',1,'']]],
+  ['application_20layered_20tcp_20introduction_11',['Application layered TCP Introduction',['../group__altcp__api.html',1,'']]],
+  ['applications_12',['Applications',['../group__apps.html',1,'']]],
+  ['arguments_13',['ext arguments',['../group__tcp__raw__extargs.html',1,'']]],
+  ['arp_14',['ARP',['../group__netifapi__arp.html',1,'ARP'],['../group__lwip__opts__arp.html',1,'ARP']]],
+  ['assertion_20handling_15',['Assertion handling',['../group__lwip__assertions.html',1,'']]],
+  ['assigned_20numbers_16',['assigned numbers',['../group__iana.html',1,'IANA assigned numbers'],['../group__ieee.html',1,'IEEE assigned numbers']]],
+  ['autoip_17',['AUTOIP',['../group__autoip.html',1,'AUTOIP'],['../group__netifapi__autoip.html',1,'AUTOIP'],['../group__lwip__opts__autoip.html',1,'AUTOIP']]]
 ];
diff --git a/doc/doxygen/output/html/search/groups_5.js b/doc/doxygen/output/html/search/groups_5.js
index 2b58e43..fa82931 100644
--- a/doc/doxygen/output/html/search/groups_5.js
+++ b/doc/doxygen/output/html/search/groups_5.js
@@ -5,11 +5,12 @@
   ['checksum_2',['Checksum',['../group__lwip__opts__checksum.html',1,'']]],
   ['client_3',['client',['../group__httpc.html',1,'HTTP client'],['../group__mqtt.html',1,'MQTT client'],['../group__smtp.html',1,'SMTP client']]],
   ['client_20data_20handling_4',['Client data handling',['../group__netif__cd.html',1,'']]],
-  ['code_5',['FDB example code',['../group__bridgeif__fdb.html',1,'']]],
-  ['codes_6',['Error codes',['../group__infrastructure__errors.html',1,'']]],
-  ['common_20functions_7',['Common functions',['../group__netconn__common.html',1,'']]],
-  ['compiler_20platform_20abstraction_8',['Compiler/platform abstraction',['../group__compiler__abstraction.html',1,'']]],
-  ['core_9',['Core',['../group__snmp__core.html',1,'']]],
-  ['core_20locking_20and_20mpu_10',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
-  ['critical_20sections_11',['Critical sections',['../group__sys__prot.html',1,'']]]
+  ['client_20server_5',['TFTP client/server',['../group__tftp.html',1,'']]],
+  ['code_6',['FDB example code',['../group__bridgeif__fdb.html',1,'']]],
+  ['codes_7',['Error codes',['../group__infrastructure__errors.html',1,'']]],
+  ['common_20functions_8',['Common functions',['../group__netconn__common.html',1,'']]],
+  ['compiler_20platform_20abstraction_9',['Compiler/platform abstraction',['../group__compiler__abstraction.html',1,'']]],
+  ['core_10',['Core',['../group__snmp__core.html',1,'']]],
+  ['core_20locking_20and_20mpu_11',['Core locking and MPU',['../group__lwip__opts__lock.html',1,'']]],
+  ['critical_20sections_12',['Critical sections',['../group__sys__prot.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/pages_0.js b/doc/doxygen/output/html/search/pages_0.js
index ae98262..125da90 100644
--- a/doc/doxygen/output/html/search/pages_0.js
+++ b/doc/doxygen/output/html/search/pages_0.js
@@ -1,4 +1,5 @@
 var searchData=
 [
-  ['bugs_0',['Reporting bugs',['../bugs.html',1,'']]]
+  ['bugs_0',['Reporting bugs',['../bugs.html',1,'']]],
+  ['build_20system_1',['CMake build system',['../cmake.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/pages_1.js b/doc/doxygen/output/html/search/pages_1.js
index 44d2d34..46fa503 100644
--- a/doc/doxygen/output/html/search/pages_1.js
+++ b/doc/doxygen/output/html/search/pages_1.js
@@ -1,7 +1,8 @@
 var searchData=
 [
   ['changelog_0',['Changelog',['../changelog.html',1,'']]],
-  ['common_20pitfalls_1',['Common pitfalls',['../pitfalls.html',1,'']]],
-  ['contribute_20to_20lwip_2',['How to contribute to lwIP',['../contrib.html',1,'']]],
-  ['copy_20rx_3',['Zero-copy RX',['../zerocopyrx.html',1,'']]]
+  ['cmake_20build_20system_1',['CMake build system',['../cmake.html',1,'']]],
+  ['common_20pitfalls_2',['Common pitfalls',['../pitfalls.html',1,'']]],
+  ['contribute_20to_20lwip_3',['How to contribute to lwIP',['../contrib.html',1,'']]],
+  ['copy_20rx_4',['Zero-copy RX',['../zerocopyrx.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/pages_4.js b/doc/doxygen/output/html/search/pages_4.js
index 761337c..e722eee 100644
--- a/doc/doxygen/output/html/search/pages_4.js
+++ b/doc/doxygen/output/html/search/pages_4.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['initalization_0',['System initalization',['../sys_init.html',1,'']]]
+  ['initialization_0',['System initialization',['../sys_init.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/pages_a.js b/doc/doxygen/output/html/search/pages_a.js
index b7b5409..21ed986 100644
--- a/doc/doxygen/output/html/search/pages_a.js
+++ b/doc/doxygen/output/html/search/pages_a.js
@@ -1,5 +1,6 @@
 var searchData=
 [
   ['sizes_0',['Debugging memory pool sizes',['../mem_err.html',1,'']]],
-  ['system_20initalization_1',['System initalization',['../sys_init.html',1,'']]]
+  ['system_1',['CMake build system',['../cmake.html',1,'']]],
+  ['system_20initialization_2',['System initialization',['../sys_init.html',1,'']]]
 ];
diff --git a/doc/doxygen/output/html/search/searchdata.js b/doc/doxygen/output/html/search/searchdata.js
index b14a59c..c138f1a 100644
--- a/doc/doxygen/output/html/search/searchdata.js
+++ b/doc/doxygen/output/html/search/searchdata.js
@@ -3,12 +3,12 @@
   0: "168_abcdefghijklmnopqrstuvwz",
   1: "_abdegilmnprstuz",
   2: "abdehilmnoprstuz",
-  3: "abdehilmnprstuz",
+  3: "abdeghilmnprstuz",
   4: "_abcdefghijklmnopqrstuvwz",
-  5: "bdehilmnprstu",
+  5: "abdehilmnprstu",
   6: "deilmnprs",
   7: "ehilmnp",
-  8: "adefhilmnpstuz",
+  8: "adefhilmnpqstuz",
   9: "168abcdefhilmnoprstuvz",
   10: "bcdhilmoprstuz"
 };
diff --git a/doc/doxygen/output/html/search/typedefs_0.js b/doc/doxygen/output/html/search/typedefs_0.js
index fa80df0..feddc3a 100644
--- a/doc/doxygen/output/html/search/typedefs_0.js
+++ b/doc/doxygen/output/html/search/typedefs_0.js
@@ -1,4 +1,5 @@
 var searchData=
 [
-  ['bridgeif_5finitdata_5ft_0',['bridgeif_initdata_t',['../group__bridgeif.html#ga61c8f232a5907f3662157746e71d35cc',1,'bridgeif.h']]]
+  ['acd_5fconflict_5fcallback_5ft_0',['acd_conflict_callback_t',['../acd_8h.html#abb446404752f56b028eafa8302db955f',1,'acd.h']]],
+  ['altcp_5fallocator_5ft_1',['altcp_allocator_t',['../group__altcp.html#ga04a328f67359ee03d1ec6824978b7209',1,'altcp.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_1.js b/doc/doxygen/output/html/search/typedefs_1.js
index 46c2959..fa80df0 100644
--- a/doc/doxygen/output/html/search/typedefs_1.js
+++ b/doc/doxygen/output/html/search/typedefs_1.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['dns_5ffound_5fcallback_0',['dns_found_callback',['../dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae',1,'dns.h']]]
+  ['bridgeif_5finitdata_5ft_0',['bridgeif_initdata_t',['../group__bridgeif.html#ga61c8f232a5907f3662157746e71d35cc',1,'bridgeif.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_2.js b/doc/doxygen/output/html/search/typedefs_2.js
index 4c356f7..af1c069 100644
--- a/doc/doxygen/output/html/search/typedefs_2.js
+++ b/doc/doxygen/output/html/search/typedefs_2.js
@@ -1,4 +1,5 @@
 var searchData=
 [
-  ['err_5ft_0',['err_t',['../group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb',1,'err.h']]]
+  ['dhcp_5ftimeout_5ft_0',['dhcp_timeout_t',['../dhcp_8h.html#aa85d661c7e160921c0497e7baa892b67',1,'dhcp.h']]],
+  ['dns_5ffound_5fcallback_1',['dns_found_callback',['../dns_8h.html#ab5a9dec5b22802f91876c53e99f427ae',1,'dns.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_3.js b/doc/doxygen/output/html/search/typedefs_3.js
index 75dda88..4c356f7 100644
--- a/doc/doxygen/output/html/search/typedefs_3.js
+++ b/doc/doxygen/output/html/search/typedefs_3.js
@@ -1,6 +1,4 @@
 var searchData=
 [
-  ['httpc_5fheaders_5fdone_5ffn_0',['httpc_headers_done_fn',['../group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472',1,'http_client.h']]],
-  ['httpc_5fresult_5ffn_1',['httpc_result_fn',['../group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd',1,'http_client.h']]],
-  ['httpc_5fresult_5ft_2',['httpc_result_t',['../group__httpc.html#gaeef5c7398d07b644c0d5593f3b7d1392',1,'http_client.h']]]
+  ['err_5ft_0',['err_t',['../group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb',1,'err.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_4.js b/doc/doxygen/output/html/search/typedefs_4.js
index 52697d7..75dda88 100644
--- a/doc/doxygen/output/html/search/typedefs_4.js
+++ b/doc/doxygen/output/html/search/typedefs_4.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['ip4_5faddr_5ft_0',['ip4_addr_t',['../ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e',1,'ip4_addr.h']]],
-  ['ip6_5faddr_5ft_1',['ip6_addr_t',['../ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762',1,'ip6_addr.h']]],
-  ['ip_5faddr_5ft_2',['ip_addr_t',['../group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e',1,'ip_addr.h']]]
+  ['httpc_5fheaders_5fdone_5ffn_0',['httpc_headers_done_fn',['../group__httpc.html#ga1e5b62519d6592c89ed3edfabd917472',1,'http_client.h']]],
+  ['httpc_5fresult_5ffn_1',['httpc_result_fn',['../group__httpc.html#ga0452eb8007dbb5f139ec992e58e560dd',1,'http_client.h']]],
+  ['httpc_5fresult_5ft_2',['httpc_result_t',['../group__httpc.html#gaeef5c7398d07b644c0d5593f3b7d1392',1,'http_client.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_5.js b/doc/doxygen/output/html/search/typedefs_5.js
index 199083f..52697d7 100644
--- a/doc/doxygen/output/html/search/typedefs_5.js
+++ b/doc/doxygen/output/html/search/typedefs_5.js
@@ -1,8 +1,6 @@
 var searchData=
 [
-  ['lwip_5fcyclic_5ftimer_5fhandler_0',['lwip_cyclic_timer_handler',['../timeouts_8h.html#a3835d5c43cf31662a2b9c99e72788e25',1,'timeouts.h']]],
-  ['lwip_5fthread_5ffn_1',['lwip_thread_fn',['../sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9',1,'sys.h']]],
-  ['lwiperf_5freport_5ffn_2',['lwiperf_report_fn',['../lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd',1,'lwiperf.h']]],
-  ['lwiperf_5fsettings_5ft_3',['lwiperf_settings_t',['../lwiperf_8c.html#a1e652bca1f12cfe6187a567d6b3be6a2',1,'lwiperf.c']]],
-  ['lwiperf_5fstate_5ftcp_5ft_4',['lwiperf_state_tcp_t',['../lwiperf_8c.html#a96ae8ebbc5d13657a641ed174ae22e5b',1,'lwiperf.c']]]
+  ['ip4_5faddr_5ft_0',['ip4_addr_t',['../ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e',1,'ip4_addr.h']]],
+  ['ip6_5faddr_5ft_1',['ip6_addr_t',['../ip6__addr_8h.html#aaca9e796e93a355294c4954c08d01762',1,'ip6_addr.h']]],
+  ['ip_5faddr_5ft_2',['ip_addr_t',['../group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e',1,'ip_addr.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_6.js b/doc/doxygen/output/html/search/typedefs_6.js
index 1fe20d6..199083f 100644
--- a/doc/doxygen/output/html/search/typedefs_6.js
+++ b/doc/doxygen/output/html/search/typedefs_6.js
@@ -1,8 +1,8 @@
 var searchData=
 [
-  ['mdns_5fname_5fresult_5fcb_5ft_0',['mdns_name_result_cb_t',['../mdns_8h.html#a19f12d7092de6fe90d5843e4ef8d4536',1,'mdns.h']]],
-  ['mqtt_5fconnection_5fcb_5ft_1',['mqtt_connection_cb_t',['../group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f',1,'mqtt.h']]],
-  ['mqtt_5fincoming_5fdata_5fcb_5ft_2',['mqtt_incoming_data_cb_t',['../group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81',1,'mqtt.h']]],
-  ['mqtt_5fincoming_5fpublish_5fcb_5ft_3',['mqtt_incoming_publish_cb_t',['../group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29',1,'mqtt.h']]],
-  ['mqtt_5frequest_5fcb_5ft_4',['mqtt_request_cb_t',['../group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd',1,'mqtt.h']]]
+  ['lwip_5fcyclic_5ftimer_5fhandler_0',['lwip_cyclic_timer_handler',['../timeouts_8h.html#a3835d5c43cf31662a2b9c99e72788e25',1,'timeouts.h']]],
+  ['lwip_5fthread_5ffn_1',['lwip_thread_fn',['../sys_8h.html#ae30a77bf6bd69bfcc5f235eaad54f2b9',1,'sys.h']]],
+  ['lwiperf_5freport_5ffn_2',['lwiperf_report_fn',['../lwiperf_8h.html#a248ea47a58a14c6aecf6525217a812fd',1,'lwiperf.h']]],
+  ['lwiperf_5fsettings_5ft_3',['lwiperf_settings_t',['../lwiperf_8c.html#a1e652bca1f12cfe6187a567d6b3be6a2',1,'lwiperf.c']]],
+  ['lwiperf_5fstate_5ftcp_5ft_4',['lwiperf_state_tcp_t',['../lwiperf_8c.html#a96ae8ebbc5d13657a641ed174ae22e5b',1,'lwiperf.c']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_7.js b/doc/doxygen/output/html/search/typedefs_7.js
index bf5d1f6..b25d20a 100644
--- a/doc/doxygen/output/html/search/typedefs_7.js
+++ b/doc/doxygen/output/html/search/typedefs_7.js
@@ -1,14 +1,8 @@
 var searchData=
 [
-  ['netconn_5fcallback_0',['netconn_callback',['../api_8h.html#ae9307baa49245990c8c4517bb4e8d47b',1,'api.h']]],
-  ['netif_5fext_5fcallback_5ffn_1',['netif_ext_callback_fn',['../group__netif.html#ga5ee213cea065424c89c66f138c008da1',1,'netif.h']]],
-  ['netif_5figmp_5fmac_5ffilter_5ffn_2',['netif_igmp_mac_filter_fn',['../netif_8h.html#a71cad3277efe29191eef3348f4bf21f7',1,'netif.h']]],
-  ['netif_5finit_5ffn_3',['netif_init_fn',['../netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5',1,'netif.h']]],
-  ['netif_5finput_5ffn_4',['netif_input_fn',['../netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e',1,'netif.h']]],
-  ['netif_5flinkoutput_5ffn_5',['netif_linkoutput_fn',['../netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed',1,'netif.h']]],
-  ['netif_5fmld_5fmac_5ffilter_5ffn_6',['netif_mld_mac_filter_fn',['../netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468',1,'netif.h']]],
-  ['netif_5fnsc_5freason_5ft_7',['netif_nsc_reason_t',['../group__netif.html#gab2b9387389513a02027c62e246723808',1,'netif.h']]],
-  ['netif_5foutput_5ffn_8',['netif_output_fn',['../netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067',1,'netif.h']]],
-  ['netif_5foutput_5fip6_5ffn_9',['netif_output_ip6_fn',['../netif_8h.html#a343a5b14136a51957d552527384674b3',1,'netif.h']]],
-  ['netif_5fstatus_5fcallback_5ffn_10',['netif_status_callback_fn',['../netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436',1,'netif.h']]]
+  ['mdns_5fname_5fresult_5fcb_5ft_0',['mdns_name_result_cb_t',['../mdns_8h.html#a6d658e2c5228b224b89488663d2b72f7',1,'mdns.h']]],
+  ['mqtt_5fconnection_5fcb_5ft_1',['mqtt_connection_cb_t',['../group__mqtt.html#ga8558743bdb7d599a93844fbc56c9029f',1,'mqtt.h']]],
+  ['mqtt_5fincoming_5fdata_5fcb_5ft_2',['mqtt_incoming_data_cb_t',['../group__mqtt.html#gafec7e75fe6a746eef9ca411463446c81',1,'mqtt.h']]],
+  ['mqtt_5fincoming_5fpublish_5fcb_5ft_3',['mqtt_incoming_publish_cb_t',['../group__mqtt.html#ga7116bb85255394cec4b1d9fa38842c29',1,'mqtt.h']]],
+  ['mqtt_5frequest_5fcb_5ft_4',['mqtt_request_cb_t',['../group__mqtt.html#gacad2bbe2cee76eaa120cc63e2f6094fd',1,'mqtt.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_8.js b/doc/doxygen/output/html/search/typedefs_8.js
index 73295ac..bf5d1f6 100644
--- a/doc/doxygen/output/html/search/typedefs_8.js
+++ b/doc/doxygen/output/html/search/typedefs_8.js
@@ -1,4 +1,14 @@
 var searchData=
 [
-  ['pbuf_5ffree_5fcustom_5ffn_0',['pbuf_free_custom_fn',['../pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce',1,'pbuf.h']]]
+  ['netconn_5fcallback_0',['netconn_callback',['../api_8h.html#ae9307baa49245990c8c4517bb4e8d47b',1,'api.h']]],
+  ['netif_5fext_5fcallback_5ffn_1',['netif_ext_callback_fn',['../group__netif.html#ga5ee213cea065424c89c66f138c008da1',1,'netif.h']]],
+  ['netif_5figmp_5fmac_5ffilter_5ffn_2',['netif_igmp_mac_filter_fn',['../netif_8h.html#a71cad3277efe29191eef3348f4bf21f7',1,'netif.h']]],
+  ['netif_5finit_5ffn_3',['netif_init_fn',['../netif_8h.html#a2b02a78a8769925ff8e4f83d34e5e1f5',1,'netif.h']]],
+  ['netif_5finput_5ffn_4',['netif_input_fn',['../netif_8h.html#ab2302b1b64ac7b95f24c6bab754a575e',1,'netif.h']]],
+  ['netif_5flinkoutput_5ffn_5',['netif_linkoutput_fn',['../netif_8h.html#ab75e9d808bc1b788bea84213e6a111ed',1,'netif.h']]],
+  ['netif_5fmld_5fmac_5ffilter_5ffn_6',['netif_mld_mac_filter_fn',['../netif_8h.html#af2ed0716122b65e7feb43e0dd99ae468',1,'netif.h']]],
+  ['netif_5fnsc_5freason_5ft_7',['netif_nsc_reason_t',['../group__netif.html#gab2b9387389513a02027c62e246723808',1,'netif.h']]],
+  ['netif_5foutput_5ffn_8',['netif_output_fn',['../netif_8h.html#a7b4893aa2ed8c606a0cd7aa932fe5067',1,'netif.h']]],
+  ['netif_5foutput_5fip6_5ffn_9',['netif_output_ip6_fn',['../netif_8h.html#a343a5b14136a51957d552527384674b3',1,'netif.h']]],
+  ['netif_5fstatus_5fcallback_5ffn_10',['netif_status_callback_fn',['../netif_8h.html#a447d0a7e7c6e2396557c287b8b8c9436',1,'netif.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_9.js b/doc/doxygen/output/html/search/typedefs_9.js
index 268e41c..73295ac 100644
--- a/doc/doxygen/output/html/search/typedefs_9.js
+++ b/doc/doxygen/output/html/search/typedefs_9.js
@@ -1,5 +1,4 @@
 var searchData=
 [
-  ['raw_5finput_5fstate_5ft_0',['raw_input_state_t',['../raw__priv_8h.html#a50dd44a4fb984a1975e15dd073d34e8d',1,'raw_priv.h']]],
-  ['raw_5frecv_5ffn_1',['raw_recv_fn',['../raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd',1,'raw.h']]]
+  ['pbuf_5ffree_5fcustom_5ffn_0',['pbuf_free_custom_fn',['../pbuf_8h.html#a6d285ce1d910f25e511c8c38532a1dce',1,'pbuf.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_a.js b/doc/doxygen/output/html/search/typedefs_a.js
index a37692c..268e41c 100644
--- a/doc/doxygen/output/html/search/typedefs_a.js
+++ b/doc/doxygen/output/html/search/typedefs_a.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['service_5fget_5ftxt_5ffn_5ft_0',['service_get_txt_fn_t',['../mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83',1,'mdns.h']]],
-  ['sys_5ftimeout_5fhandler_1',['sys_timeout_handler',['../timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25',1,'timeouts.h']]]
+  ['raw_5finput_5fstate_5ft_0',['raw_input_state_t',['../raw__priv_8h.html#a50dd44a4fb984a1975e15dd073d34e8d',1,'raw_priv.h']]],
+  ['raw_5frecv_5ffn_1',['raw_recv_fn',['../raw_8h.html#a17edd059f34f45a770fe2fa458ecf4dd',1,'raw.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_b.js b/doc/doxygen/output/html/search/typedefs_b.js
index 51889b5..a37692c 100644
--- a/doc/doxygen/output/html/search/typedefs_b.js
+++ b/doc/doxygen/output/html/search/typedefs_b.js
@@ -1,15 +1,5 @@
 var searchData=
 [
-  ['tcgihandler_0',['tCGIHandler',['../group__httpd.html#ga693032b00bb572d131de09116c822f3b',1,'httpd.h']]],
-  ['tcp_5faccept_5ffn_1',['tcp_accept_fn',['../tcp_8h.html#a00517abce6856d6c82f0efebdafb734d',1,'tcp.h']]],
-  ['tcp_5fconnected_5ffn_2',['tcp_connected_fn',['../tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8',1,'tcp.h']]],
-  ['tcp_5ferr_5ffn_3',['tcp_err_fn',['../tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55',1,'tcp.h']]],
-  ['tcp_5fextarg_5fcallback_5fpassive_5fopen_5ffn_4',['tcp_extarg_callback_passive_open_fn',['../tcp_8h.html#aba649c5bdf19d47e39643392b6d88588',1,'tcp.h']]],
-  ['tcp_5fextarg_5fcallback_5fpcb_5fdestroyed_5ffn_5',['tcp_extarg_callback_pcb_destroyed_fn',['../tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd',1,'tcp.h']]],
-  ['tcp_5fpoll_5ffn_6',['tcp_poll_fn',['../tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073',1,'tcp.h']]],
-  ['tcp_5frecv_5ffn_7',['tcp_recv_fn',['../tcp_8h.html#a780cfac08b02c66948ab94ea974202e8',1,'tcp.h']]],
-  ['tcp_5fsent_5ffn_8',['tcp_sent_fn',['../tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18',1,'tcp.h']]],
-  ['tcpip_5fcallback_5ffn_9',['tcpip_callback_fn',['../tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d',1,'tcpip.h']]],
-  ['tcpip_5finit_5fdone_5ffn_10',['tcpip_init_done_fn',['../tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992',1,'tcpip.h']]],
-  ['tssihandler_11',['tSSIHandler',['../group__httpd.html#gaf88dacc4f18d299084cab75252001319',1,'httpd.h']]]
+  ['service_5fget_5ftxt_5ffn_5ft_0',['service_get_txt_fn_t',['../mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83',1,'mdns.h']]],
+  ['sys_5ftimeout_5fhandler_1',['sys_timeout_handler',['../timeouts_8h.html#a1d3fe3fbdbddbb9e85f05c85d7181c25',1,'timeouts.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_c.js b/doc/doxygen/output/html/search/typedefs_c.js
index 97db451..51889b5 100644
--- a/doc/doxygen/output/html/search/typedefs_c.js
+++ b/doc/doxygen/output/html/search/typedefs_c.js
@@ -1,4 +1,15 @@
 var searchData=
 [
-  ['udp_5frecv_5ffn_0',['udp_recv_fn',['../udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b',1,'udp.h']]]
+  ['tcgihandler_0',['tCGIHandler',['../group__httpd.html#ga693032b00bb572d131de09116c822f3b',1,'httpd.h']]],
+  ['tcp_5faccept_5ffn_1',['tcp_accept_fn',['../tcp_8h.html#a00517abce6856d6c82f0efebdafb734d',1,'tcp.h']]],
+  ['tcp_5fconnected_5ffn_2',['tcp_connected_fn',['../tcp_8h.html#a939867106bd492caf2d85852fb7f6ae8',1,'tcp.h']]],
+  ['tcp_5ferr_5ffn_3',['tcp_err_fn',['../tcp_8h.html#a1b4f9e3551e575c0ef06d6daa7f06e55',1,'tcp.h']]],
+  ['tcp_5fextarg_5fcallback_5fpassive_5fopen_5ffn_4',['tcp_extarg_callback_passive_open_fn',['../tcp_8h.html#aba649c5bdf19d47e39643392b6d88588',1,'tcp.h']]],
+  ['tcp_5fextarg_5fcallback_5fpcb_5fdestroyed_5ffn_5',['tcp_extarg_callback_pcb_destroyed_fn',['../tcp_8h.html#a20881e537f5be7847d88fe2a0c8fd2cd',1,'tcp.h']]],
+  ['tcp_5fpoll_5ffn_6',['tcp_poll_fn',['../tcp_8h.html#a66deb97618a9cd9d57fca28c5245e073',1,'tcp.h']]],
+  ['tcp_5frecv_5ffn_7',['tcp_recv_fn',['../tcp_8h.html#a780cfac08b02c66948ab94ea974202e8',1,'tcp.h']]],
+  ['tcp_5fsent_5ffn_8',['tcp_sent_fn',['../tcp_8h.html#aa60622ffaa099e97f66fb56e437fca18',1,'tcp.h']]],
+  ['tcpip_5fcallback_5ffn_9',['tcpip_callback_fn',['../tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d',1,'tcpip.h']]],
+  ['tcpip_5finit_5fdone_5ffn_10',['tcpip_init_done_fn',['../tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992',1,'tcpip.h']]],
+  ['tssihandler_11',['tSSIHandler',['../group__httpd.html#gaf88dacc4f18d299084cab75252001319',1,'httpd.h']]]
 ];
diff --git a/doc/doxygen/output/html/search/typedefs_d.js b/doc/doxygen/output/html/search/typedefs_d.js
new file mode 100644
index 0000000..97db451
--- /dev/null
+++ b/doc/doxygen/output/html/search/typedefs_d.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['udp_5frecv_5ffn_0',['udp_recv_fn',['../udp_8h.html#af0ec7feb31acdb6e11b928f438c8a64b',1,'udp.h']]]
+];
diff --git a/doc/doxygen/output/html/search/variables_1.js b/doc/doxygen/output/html/search/variables_1.js
index c916826..bc4e709 100644
--- a/doc/doxygen/output/html/search/variables_1.js
+++ b/doc/doxygen/output/html/search/variables_1.js
@@ -2,17 +2,23 @@
 [
   ['acceptmbox_0',['acceptmbox',['../structnetconn.html#a9b59188f300828d2b5814e27ab27cad0',1,'netconn']]],
   ['access_1',['access',['../structsnmp__node__instance.html#a4af17d17a971f1d11a186e6e1fc4411c',1,'snmp_node_instance']]],
-  ['ad_2',['ad',['../structapi__msg.html#af9817721045b7ebe98ad484730e5e9cc',1,'api_msg']]],
-  ['additional_3',['additional',['../structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce',1,'mdns_outpacket']]],
-  ['addr_4',['addr',['../structdns__api__msg.html#a217814594564077d21b0f2696280b2a8',1,'dns_api_msg::addr'],['../structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d',1,'zepif_init::addr']]],
-  ['addr_5findex_5',['addr_index',['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd',1,'netif_ext_callback_args_t::ipv6_set_s::addr_index'],['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s::addr_index']]],
-  ['address_6',['address',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s']]],
-  ['answer_5fname_7',['answer_name',['../structnetbios__answer.html#abf746cd54add594216ddc3683c741406',1,'netbios_answer']]],
-  ['answer_5fname_5fflags_8',['answer_name_flags',['../structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4',1,'netbios_answer']]],
-  ['answers_9',['answers',['../structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7',1,'mdns_packet::answers'],['../structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad',1,'mdns_outpacket::answers']]],
-  ['answers_5fleft_10',['answers_left',['../structmdns__packet.html#a56ba495a1458a21982e65d746468849d',1,'mdns_packet']]],
-  ['asn1_5ftype_11',['asn1_type',['../structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9',1,'snmp_node_instance']]],
-  ['auth_5fplain_12',['auth_plain',['../structsmtp__session.html#a561389328fb1fefcb4d4d17fd0d43301',1,'smtp_session']]],
-  ['auth_5fplain_5flen_13',['auth_plain_len',['../structsmtp__session.html#a003dfd03ac58252b575a7c965e532461',1,'smtp_session']]],
-  ['authoritative_14',['authoritative',['../structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035',1,'mdns_outpacket']]]
+  ['acd_2',['acd',['../structautoip.html#a1965250cda881d229e2a1fe146a0bb9e',1,'autoip']]],
+  ['acd_5fconflict_5fcallback_3',['acd_conflict_callback',['../structacd.html#a3a03aa687716055a4f75f6e5e380e46e',1,'acd']]],
+  ['ad_4',['ad',['../structapi__msg.html#a1831a18bdfe88ca89a773fc477966894',1,'api_msg']]],
+  ['additional_5',['additional',['../structmdns__packet.html#ab7d1d004dcac3cb6761241c5fe58b0ab',1,'mdns_packet::additional'],['../structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce',1,'mdns_outpacket::additional']]],
+  ['additional_5fleft_6',['additional_left',['../structmdns__packet.html#ac47f5a84c173a1565c69673536537c89',1,'mdns_packet']]],
+  ['addr_7',['addr',['../structdns__api__msg.html#a217814594564077d21b0f2696280b2a8',1,'dns_api_msg::addr'],['../structzepif__init.html#a5a9a7ee6e687a7c1ae85b103d39de61d',1,'zepif_init::addr']]],
+  ['addr_5findex_8',['addr_index',['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html#ad44a5f52ad695ea90b15a1e29ff823dd',1,'netif_ext_callback_args_t::ipv6_set_s::addr_index'],['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#aebf2aa0b26b07ca1977c676a0404323f',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s::addr_index']]],
+  ['address_9',['address',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#acd24c243c866f8f9169b89af11974f17',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s']]],
+  ['alloc_10',['alloc',['../structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687',1,'altcp_allocator_s']]],
+  ['answer_5fname_11',['answer_name',['../structnetbios__answer.html#abf746cd54add594216ddc3683c741406',1,'netbios_answer']]],
+  ['answer_5fname_5fflags_12',['answer_name_flags',['../structnetbios__answer.html#a2729b7249e3d23309624cb19fa0dbfc4',1,'netbios_answer']]],
+  ['answers_13',['answers',['../structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7',1,'mdns_packet::answers'],['../structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad',1,'mdns_outpacket::answers']]],
+  ['answers_5fleft_14',['answers_left',['../structmdns__packet.html#a56ba495a1458a21982e65d746468849d',1,'mdns_packet']]],
+  ['arg_15',['arg',['../structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1',1,'altcp_allocator_s']]],
+  ['asn1_5ftype_16',['asn1_type',['../structsnmp__node__instance.html#af51206e0912a8402c395dcf3b623f8b9',1,'snmp_node_instance']]],
+  ['auth_5fplain_17',['auth_plain',['../structsmtp__session.html#a561389328fb1fefcb4d4d17fd0d43301',1,'smtp_session']]],
+  ['auth_5fplain_5flen_18',['auth_plain_len',['../structsmtp__session.html#a003dfd03ac58252b575a7c965e532461',1,'smtp_session']]],
+  ['authoritative_19',['authoritative',['../structmdns__packet.html#a01f2cd644ceda020d639290fe1c3ea1c',1,'mdns_packet::authoritative'],['../structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035',1,'mdns_outpacket::authoritative']]],
+  ['authoritative_5fleft_20',['authoritative_left',['../structmdns__packet.html#ade926269f6b1de2e51ee92a703068445',1,'mdns_packet']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_10.js b/doc/doxygen/output/html/search/variables_10.js
index 0e0e071..609fba2 100644
--- a/doc/doxygen/output/html/search/variables_10.js
+++ b/doc/doxygen/output/html/search/variables_10.js
@@ -16,8 +16,7 @@
   ['poll_5fnfds_13',['poll_nfds',['../structlwip__select__cb.html#a39c4980c261380481f79af2b536ebfba',1,'lwip_select_cb']]],
   ['port_14',['port',['../structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c',1,'mdns_service']]],
   ['prev_15',['prev',['../structmem.html#a9d7722ed10adf965fa98563d502f98ac',1,'mem::prev'],['../structsnmp__varbind.html#a365abcc1f80d28dc8ffd07193099c760',1,'snmp_varbind::prev'],['../structlwip__select__cb.html#a21a98e316bb7001d8750b20f5a7d0aa7',1,'lwip_select_cb::prev']]],
-  ['probes_5fsent_16',['probes_sent',['../structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922',1,'mdns_host']]],
-  ['probing_5fstate_17',['probing_state',['../structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61',1,'mdns_host']]],
-  ['proto_18',['proto',['../structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d',1,'mdns_service']]],
-  ['ptr_19',['ptr',['../structnetvector.html#a523362737ea7764f9aaa73a050a0b983',1,'netvector']]]
+  ['probe_5fquery_5frecv_16',['probe_query_recv',['../structmdns__outmsg.html#a4a3ee99f7c25e88f17ea912897617aa0',1,'mdns_outmsg']]],
+  ['proto_17',['proto',['../structmdns__request.html#a497e1b8f664dab9904a89e5f15f5bc60',1,'mdns_request::proto'],['../structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d',1,'mdns_service::proto']]],
+  ['ptr_18',['ptr',['../structnetvector.html#a523362737ea7764f9aaa73a050a0b983',1,'netvector']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_11.js b/doc/doxygen/output/html/search/variables_11.js
index a90dd28..5e025b3 100644
--- a/doc/doxygen/output/html/search/variables_11.js
+++ b/doc/doxygen/output/html/search/variables_11.js
@@ -1,7 +1,9 @@
 var searchData=
 [
   ['q_0',['q',['../structnd6__neighbor__cache__entry.html#a830674446a45eb200d38a45fbdd5c5df',1,'nd6_neighbor_cache_entry']]],
-  ['query_5fname_1',['query_name',['../structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b',1,'netbios_answer']]],
-  ['questions_2',['questions',['../structmdns__packet.html#a09211e78f7f773c492b5856d31423699',1,'mdns_packet::questions'],['../structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c',1,'mdns_outpacket::questions']]],
-  ['questions_5fleft_3',['questions_left',['../structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437',1,'mdns_packet']]]
+  ['qtype_1',['qtype',['../structmdns__request.html#a5a9261362213a1a790a0b3451916f669',1,'mdns_request']]],
+  ['query_2',['query',['../structmdns__outmsg.html#a3f6810fb1f2a989afcbc2fd852a20386',1,'mdns_outmsg']]],
+  ['query_5fname_3',['query_name',['../structnetbios__answer.html#aa024ce7e0e233c42393f5c3c378d3f9b',1,'netbios_answer']]],
+  ['questions_4',['questions',['../structmdns__packet.html#a09211e78f7f773c492b5856d31423699',1,'mdns_packet::questions'],['../structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c',1,'mdns_outpacket::questions']]],
+  ['questions_5fleft_5',['questions_left',['../structmdns__packet.html#afdb9c14dd0c915119b8adb584381a437',1,'mdns_packet']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_12.js b/doc/doxygen/output/html/search/variables_12.js
index 6881d53..6828458 100644
--- a/doc/doxygen/output/html/search/variables_12.js
+++ b/doc/doxygen/output/html/search/variables_12.js
@@ -1,22 +1,24 @@
 var searchData=
 [
-  ['r_0',['r',['../structapi__msg.html#a50e8d6dfa0ba30ae7e39c336bf68742c',1,'api_msg']]],
+  ['r_0',['r',['../structapi__msg.html#adbb33e03089db527b0af7e4b22f04e1c',1,'api_msg']]],
   ['ram_5fheap_1',['ram_heap',['../mem_8c.html#aeb811c25ce74d9ff398ccbb29874bba9',1,'mem.c']]],
-  ['rcvevent_2',['rcvevent',['../structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a',1,'lwip_sock']]],
-  ['reachability_3',['reachability',['../structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d',1,'sntp_server']]],
-  ['read_4',['read',['../structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c',1,'tftp_context']]],
-  ['readset_5',['readset',['../structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e',1,'lwip_select_cb']]],
-  ['reass_5flist_6',['reass_list',['../structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35',1,'lowpan6_ieee802154_data']]],
-  ['recv_7',['recv',['../structraw__pcb.html#a963b023239ad97c05536046ed7058a10',1,'raw_pcb::recv'],['../structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8',1,'udp_pcb::recv']]],
-  ['recv_5farg_8',['recv_arg',['../structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab',1,'udp_pcb']]],
-  ['recv_5favail_9',['recv_avail',['../structnetconn.html#a05b15a28b0803bea3729b1da2047541e',1,'netconn']]],
-  ['recv_5fbufsize_10',['recv_bufsize',['../structnetconn.html#a6febc9717418ddba16f16e988061cfac',1,'netconn']]],
-  ['recv_5funicast_11',['recv_unicast',['../structmdns__packet.html#a8659b4f582be0df84b6ae91308737377',1,'mdns_packet']]],
-  ['recvmbox_12',['recvmbox',['../structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da',1,'netconn']]],
-  ['ref_13',['ref',['../structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7',1,'pbuf']]],
-  ['reference_14',['reference',['../structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5',1,'snmp_node_instance']]],
-  ['reference_5flen_15',['reference_len',['../structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54',1,'snmp_node_instance']]],
-  ['release_5finstance_16',['release_instance',['../structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de',1,'snmp_node_instance']]],
-  ['remove_5fcallback_17',['remove_callback',['../structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07',1,'netif']]],
-  ['rs_5fcount_18',['rs_count',['../structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6',1,'netif']]]
+  ['rate_5flimit_5factivated_2',['rate_limit_activated',['../structmdns__host.html#a002e836a1888c7df4cf2b775c7fae557',1,'mdns_host']]],
+  ['rcvevent_3',['rcvevent',['../structlwip__sock.html#af40d67cbaef4318d26e560988b6e1b3a',1,'lwip_sock']]],
+  ['reachability_4',['reachability',['../structsntp__server.html#a2e9283bb8f94930fd2a2c3f24fc4b40d',1,'sntp_server']]],
+  ['read_5',['read',['../structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c',1,'tftp_context']]],
+  ['readset_6',['readset',['../structlwip__select__cb.html#a8694a2ce0dd5f91be84056982b96978e',1,'lwip_select_cb']]],
+  ['reass_5flist_7',['reass_list',['../structlowpan6__ieee802154__data.html#a8c33e7a2026e6e93a2085f3d14378d35',1,'lowpan6_ieee802154_data']]],
+  ['recv_8',['recv',['../structraw__pcb.html#a963b023239ad97c05536046ed7058a10',1,'raw_pcb::recv'],['../structudp__pcb.html#ac05dee75a3d6666267f7e626c2ec56a8',1,'udp_pcb::recv']]],
+  ['recv_5farg_9',['recv_arg',['../structudp__pcb.html#a11e4c40b8868aa40d923756a60598cab',1,'udp_pcb']]],
+  ['recv_5favail_10',['recv_avail',['../structnetconn.html#a05b15a28b0803bea3729b1da2047541e',1,'netconn']]],
+  ['recv_5fbufsize_11',['recv_bufsize',['../structnetconn.html#a6febc9717418ddba16f16e988061cfac',1,'netconn']]],
+  ['recv_5funicast_12',['recv_unicast',['../structmdns__packet.html#a8659b4f582be0df84b6ae91308737377',1,'mdns_packet']]],
+  ['recvmbox_13',['recvmbox',['../structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da',1,'netconn']]],
+  ['ref_14',['ref',['../structpbuf.html#a62fe38eb0cf31027dc1fb9cbe7b55ba7',1,'pbuf']]],
+  ['reference_15',['reference',['../structsnmp__node__instance.html#a55f53419cd5b369b771153ca2598ebc5',1,'snmp_node_instance']]],
+  ['reference_5flen_16',['reference_len',['../structsnmp__node__instance.html#ad289957b34b4e55915fa79f37c4d9d54',1,'snmp_node_instance']]],
+  ['release_5finstance_17',['release_instance',['../structsnmp__node__instance.html#a20a256c54fab19a455ecf6deff76c6de',1,'snmp_node_instance']]],
+  ['remove_5fcallback_18',['remove_callback',['../structnetif.html#ae06deb532ead2e3009ba4e58aae6ca07',1,'netif']]],
+  ['result_5ffn_19',['result_fn',['../structmdns__request.html#a4cc8a4e62ce71bc33f1e7cb24b198c1d',1,'mdns_request']]],
+  ['rs_5fcount_20',['rs_count',['../structnetif.html#a9c1f9f28bde60aa868bc3296bee7b1b6',1,'netif']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_13.js b/doc/doxygen/output/html/search/variables_13.js
index 785cb7d..85ce385 100644
--- a/doc/doxygen/output/html/search/variables_13.js
+++ b/doc/doxygen/output/html/search/variables_13.js
@@ -1,14 +1,14 @@
 var searchData=
 [
-  ['sd_0',['sd',['../structapi__msg.html#a5aa22dbd74fd7ba2fa5eb8bc8aae529f',1,'api_msg']]],
+  ['sd_0',['sd',['../structapi__msg.html#a8644758cd55e0891e43717711ae7b03b',1,'api_msg']]],
   ['select_5fwaiting_1',['select_waiting',['../structlwip__sock.html#aadbcf5ec3d50631d8821200163d88d38',1,'lwip_sock']]],
   ['sem_2',['sem',['../structdns__api__msg.html#a15e01e675ebc46b5aede42342be445e2',1,'dns_api_msg::sem'],['../structlwip__select__cb.html#ac9e790cac8b5eae607a8ef95dcc68482',1,'lwip_select_cb::sem']]],
   ['sem_5fsignalled_3',['sem_signalled',['../structlwip__select__cb.html#a1c00f1159e9e8eb7cca02c497605cd99',1,'lwip_select_cb']]],
   ['send_5ftimeout_4',['send_timeout',['../structnetconn.html#a44e55724482b8e447134f5ba4f01551a',1,'netconn']]],
   ['sendevent_5',['sendevent',['../structlwip__sock.html#a7e282776681ea4b7bd389950a8a64fa8',1,'lwip_sock']]],
-  ['sent_5fnum_6',['sent_num',['../structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25',1,'autoip']]],
+  ['sent_5fnum_6',['sent_num',['../structacd.html#a4ab002648d338ae33ffd3829e23703cb',1,'acd::sent_num'],['../structmdns__host.html#a9c09b5c58b3db64f78ce8eeb14952bea',1,'mdns_host::sent_num']]],
   ['sequence_5fnumber_7',['sequence_number',['../structieee__802154__hdr.html#a870001205f5a3ce45ce0b2f323275869',1,'ieee_802154_hdr']]],
-  ['service_8',['service',['../structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad',1,'mdns_service']]],
+  ['service_8',['service',['../structmdns__request.html#aace6ab8b7de73d61d02711f26de7b751',1,'mdns_request::service'],['../structmdns__service.html#a42583986e24b5a4a13b6d647c1a281ad',1,'mdns_service::service']]],
   ['services_9',['services',['../structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed',1,'mdns_host']]],
   ['session_5fdata_5fpacket_5fsize_10',['session_data_packet_size',['../structnetbios__answer.html#abec38f20bb460ddc2d6e8c9b9208608c',1,'netbios_answer']]],
   ['set_5ftest_11',['set_test',['../structsnmp__node__instance.html#a03c1fec3764f6b48337238b3355ee5bd',1,'snmp_node_instance::set_test'],['../structsnmp__table__node.html#acfbc5fa3361117fc4fa83642dde8aef0',1,'snmp_table_node::set_test']]],
@@ -18,16 +18,15 @@
   ['snmp_5fcommunity_5ftrap_15',['snmp_community_trap',['../snmp__msg_8c.html#a2e2007343d9492b8e31d363d2c6ad79b',1,'snmp_community_trap:&#160;snmp_msg.c'],['../snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b',1,'snmp_community_trap:&#160;snmp_msg.c']]],
   ['snmp_5fcommunity_5fwrite_16',['snmp_community_write',['../snmp__msg_8c.html#a2d77485bb0b640c8e5f569ca756d3b04',1,'snmp_community_write:&#160;snmp_msg.c'],['../snmp__msg_8h.html#a2d77485bb0b640c8e5f569ca756d3b04',1,'snmp_community_write:&#160;snmp_msg.c']]],
   ['snmp_5ftraps_5fhandle_17',['snmp_traps_handle',['../snmp__msg_8h.html#ade16efa80e2c2a20236d3cb96b19c79a',1,'snmp_traps_handle:&#160;snmp_traps.c'],['../snmp__traps_8c.html#ade16efa80e2c2a20236d3cb96b19c79a',1,'snmp_traps_handle:&#160;snmp_traps.c']]],
-  ['socket_18',['socket',['../structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36',1,'netconn']]],
-  ['source_5faddr_19',['source_addr',['../structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a',1,'mdns_packet']]],
-  ['source_5faddress_20',['source_address',['../structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937',1,'ieee_802154_hdr']]],
-  ['source_5fpan_5fid_21',['source_pan_id',['../structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2',1,'ieee_802154_hdr']]],
-  ['src_22',['src',['../structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef',1,'ip6_hdr']]],
-  ['state_23',['state',['../structsmtp__session.html#aed9c182738767279c2b58b1e3322db09',1,'smtp_session::state'],['../structnetconn.html#a936c33090ec35e5e8c0011be5515a589',1,'netconn::state'],['../structautoip.html#a51af55190548e378e310aeaddfa1fdef',1,'autoip::state'],['../structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3',1,'netif::state'],['../structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c',1,'netif_ext_callback_args_t::link_changed_s::state'],['../structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7',1,'netif_ext_callback_args_t::status_changed_s::state']]],
-  ['static_5fdata_24',['static_data',['../structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4',1,'smtp_send_request']]],
-  ['stats_25',['stats',['../structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500',1,'memp_desc']]],
-  ['status_5fcallback_26',['status_callback',['../structnetif.html#a1513e81d02557d2a950e965f18b53a45',1,'netif']]],
-  ['subject_27',['subject',['../structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7',1,'smtp_session']]],
-  ['subject_5flen_28',['subject_len',['../structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c',1,'smtp_session']]],
-  ['sys_29',['sys',['../structstats__.html#a317123da6c92aa9d2fa40e8060357035',1,'stats_']]]
+  ['source_5faddr_18',['source_addr',['../structmdns__packet.html#aaa64cc21495dc6bb76ed9125904dd07a',1,'mdns_packet']]],
+  ['source_5faddress_19',['source_address',['../structieee__802154__hdr.html#aa96c037381583756e79bc6ecede27937',1,'ieee_802154_hdr']]],
+  ['source_5fpan_5fid_20',['source_pan_id',['../structieee__802154__hdr.html#ab67fc612a7fd7dcaf46401e4719fa2b2',1,'ieee_802154_hdr']]],
+  ['src_21',['src',['../structip6__hdr.html#af0df3214134f29827c27e66b2970c6ef',1,'ip6_hdr']]],
+  ['state_22',['state',['../structsmtp__session.html#aed9c182738767279c2b58b1e3322db09',1,'smtp_session::state'],['../structacd.html#a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb',1,'acd::state'],['../structnetconn.html#a936c33090ec35e5e8c0011be5515a589',1,'netconn::state'],['../structmdns__host.html#a2ed51b16771590917e0eef5cf25ada71',1,'mdns_host::state'],['../structautoip.html#a51af55190548e378e310aeaddfa1fdef',1,'autoip::state'],['../structnetif.html#a809cc57c0dff09c5c9ae45b02c2002f3',1,'netif::state'],['../structnetif__ext__callback__args__t_1_1link__changed__s.html#a39870f966a2a64a7f51747b45977296c',1,'netif_ext_callback_args_t::link_changed_s::state'],['../structnetif__ext__callback__args__t_1_1status__changed__s.html#a207d3afdf0a37d16a61d1253e264d7a7',1,'netif_ext_callback_args_t::status_changed_s::state']]],
+  ['static_5fdata_23',['static_data',['../structsmtp__send__request.html#a4d517ae8b29caa4f0b371923379d9ef4',1,'smtp_send_request']]],
+  ['stats_24',['stats',['../structmemp__desc.html#a05cb67eb408e4736cc0f5e32b5db7500',1,'memp_desc']]],
+  ['status_5fcallback_25',['status_callback',['../structnetif.html#a1513e81d02557d2a950e965f18b53a45',1,'netif']]],
+  ['subject_26',['subject',['../structsmtp__session.html#ab8240801e229ee260f3feeaa270520c7',1,'smtp_session']]],
+  ['subject_5flen_27',['subject_len',['../structsmtp__session.html#aea48a6edd3ede02b26882c7b8d72646c',1,'smtp_session']]],
+  ['sys_28',['sys',['../structstats__.html#a317123da6c92aa9d2fa40e8060357035',1,'stats_']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_14.js b/doc/doxygen/output/html/search/variables_14.js
index 3cb68f6..97748f8 100644
--- a/doc/doxygen/output/html/search/variables_14.js
+++ b/doc/doxygen/output/html/search/variables_14.js
@@ -17,11 +17,11 @@
   ['total_5fnumber_5fof_5fcommand_5fblocks_14',['total_number_of_command_blocks',['../structnetbios__answer.html#a4c7ea5d1839fd27232877880e43485a2',1,'netbios_answer']]],
   ['tried_5fllipaddr_15',['tried_llipaddr',['../structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853',1,'autoip']]],
   ['ts_16',['ts',['../structnetif.html#a1bb4e3aed6e0fd4b6b31ee82d806f971',1,'netif']]],
-  ['ttw_17',['ttw',['../structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf',1,'autoip']]],
+  ['ttw_17',['ttw',['../structacd.html#aabde1967e37d685b19b9701af641a97c',1,'acd']]],
   ['tx_5fbuf_18',['tx_buf',['../structsmtp__session.html#a42cedb495f7423b9e28979ce1e460c61',1,'smtp_session']]],
   ['tx_5fdatagram_5ftag_19',['tx_datagram_tag',['../structlowpan6__ieee802154__data.html#a64560b289f86efe1d39ece603cd14b5c',1,'lowpan6_ieee802154_data']]],
   ['tx_5fframe_5fseq_5fnum_20',['tx_frame_seq_num',['../structlowpan6__ieee802154__data.html#ad9cd994385c4d1d8ef0a22686c17720c',1,'lowpan6_ieee802154_data']]],
-  ['tx_5fid_21',['tx_id',['../structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00',1,'mdns_packet::tx_id'],['../structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348',1,'mdns_outpacket::tx_id']]],
+  ['tx_5fid_21',['tx_id',['../structmdns__packet.html#a0cd71fd9af6d2529e6a41c451c037e00',1,'mdns_packet::tx_id'],['../structmdns__outmsg.html#a1d2d5f1d5d366f31d65ca18a239bfd4e',1,'mdns_outmsg::tx_id']]],
   ['txt_5ffn_22',['txt_fn',['../structmdns__service.html#a79bc4946c96a3b2d0713bc0897c4bd9c',1,'mdns_service']]],
   ['txtdata_23',['txtdata',['../structmdns__service.html#a35daff90a18d19b14f23fa02df424f94',1,'mdns_service']]],
   ['type_24',['type',['../structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6',1,'netconn::type'],['../structsnmp__varbind.html#ad63223e45e04c08ea97859b8ba767950',1,'snmp_varbind::type'],['../structip__addr.html#a66eaa8e9051e7102bf9f0c195fbe555a',1,'ip_addr::type']]],
diff --git a/doc/doxygen/output/html/search/variables_15.js b/doc/doxygen/output/html/search/variables_15.js
index 0b6baf1..a21a2e7 100644
--- a/doc/doxygen/output/html/search/variables_15.js
+++ b/doc/doxygen/output/html/search/variables_15.js
@@ -1,9 +1,10 @@
 var searchData=
 [
   ['udp_0',['udp',['../structstats__.html#a626e03d4bded6480582789cfd17d4063',1,'stats_']]],
-  ['unicast_5freply_1',['unicast_reply',['../structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d',1,'mdns_outpacket']]],
-  ['unit_5fid_2',['unit_id',['../structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787',1,'netbios_answer']]],
-  ['use_3',['use',['../structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852',1,'igmp_group::use'],['../structmld__group.html#addc67094f83c9352fe039c392c480f9e',1,'mld_group::use']]],
-  ['used_4',['used',['../structmem.html#aa76b6a39425617435978dce903f0d456',1,'mem']]],
-  ['username_5',['username',['../structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb',1,'smtp_session']]]
+  ['unicast_5fmsg_5fin_5fuse_1',['unicast_msg_in_use',['../structmdns__delayed__msg.html#abd5210624394fece45e57e16da85a47d',1,'mdns_delayed_msg']]],
+  ['unicast_5freply_5frequested_2',['unicast_reply_requested',['../structmdns__outmsg.html#a8abcd5b3e04c16a75752b36cf613ac6f',1,'mdns_outmsg']]],
+  ['unit_5fid_3',['unit_id',['../structnetbios__answer.html#aeed6aa8ba4f8bb107d141b3b3d0a1787',1,'netbios_answer']]],
+  ['use_4',['use',['../structigmp__group.html#ab3625aeb3689e3626f73138eb0e41852',1,'igmp_group::use'],['../structmld__group.html#addc67094f83c9352fe039c392c480f9e',1,'mld_group::use']]],
+  ['used_5',['used',['../structmem.html#aa76b6a39425617435978dce903f0d456',1,'mem']]],
+  ['username_6',['username',['../structsmtp__session.html#a568e3def9d0ec54e3c079f577717a6bb',1,'smtp_session']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_17.js b/doc/doxygen/output/html/search/variables_17.js
index e1f2642..7e07d05 100644
--- a/doc/doxygen/output/html/search/variables_17.js
+++ b/doc/doxygen/output/html/search/variables_17.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['w_0',['w',['../structapi__msg.html#ac0637c6f4dbb3f64f95d5181d55e663c',1,'api_msg']]],
+  ['w_0',['w',['../structapi__msg.html#a0abfc9bda0b00554628bc3169d8f21bf',1,'api_msg']]],
   ['will_5fmsg_1',['will_msg',['../structmqtt__connect__client__info__t.html#a925fcebd15555afdc0820e196e2fd3a7',1,'mqtt_connect_client_info_t']]],
   ['will_5fqos_2',['will_qos',['../structmqtt__connect__client__info__t.html#a07954934f4fecf54fa190997848229d9',1,'mqtt_connect_client_info_t']]],
   ['will_5fretain_3',['will_retain',['../structmqtt__connect__client__info__t.html#a49c10873f44d7534140a63eef2a6a4e3',1,'mqtt_connect_client_info_t']]],
diff --git a/doc/doxygen/output/html/search/variables_2.js b/doc/doxygen/output/html/search/variables_2.js
index 191c8fa..56ebce1 100644
--- a/doc/doxygen/output/html/search/variables_2.js
+++ b/doc/doxygen/output/html/search/variables_2.js
@@ -2,7 +2,7 @@
 [
   ['b_0',['b',['../structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05',1,'api_msg']]],
   ['base_1',['base',['../structmemp__desc.html#a9aec58adcbcd88167247296ca4346558',1,'memp_desc']]],
-  ['bc_2',['bc',['../structapi__msg.html#a87ce87e5931c8f748293946d3b250791',1,'api_msg']]],
+  ['bc_2',['bc',['../structapi__msg.html#a8e600d95eb044f8f7dc9ff921aaa05b1',1,'api_msg']]],
   ['body_3',['body',['../structsmtp__session.html#a7bb4bf5cc209e073341b56845e5cbd49',1,'smtp_session']]],
   ['body_5flen_4',['body_len',['../structsmtp__session.html#a0da8b775ddfe5f8891464037a6b4bb4d',1,'smtp_session']]],
   ['body_5fsent_5',['body_sent',['../structsmtp__session.html#a5893c61d863b4846a81d8a4bbcaebb5b',1,'smtp_session']]]
diff --git a/doc/doxygen/output/html/search/variables_3.js b/doc/doxygen/output/html/search/variables_3.js
index 7f80041..78490b0 100644
--- a/doc/doxygen/output/html/search/variables_3.js
+++ b/doc/doxygen/output/html/search/variables_3.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['cache_5fflush_0',['cache_flush',['../structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195',1,'mdns_outpacket']]],
+  ['cache_5fflush_0',['cache_flush',['../structmdns__outmsg.html#ab46f1589681a1abe826e8f6c58d10f1a',1,'mdns_outmsg']]],
   ['callback_1',['callback',['../structnetconn.html#abe796060bb06e585333ca9a87862b624',1,'netconn']]],
   ['callback_5farg_2',['callback_arg',['../structsmtp__session.html#af0544df7a935a092d825d8f2380f970f',1,'smtp_session']]],
   ['callback_5ffn_3',['callback_fn',['../structsmtp__session.html#a24c13d621e18311a613ab68b856a7f7b',1,'smtp_session']]],
@@ -10,17 +10,18 @@
   ['client_5fpass_7',['client_pass',['../structmqtt__connect__client__info__t.html#a8f68efe91c5311418151256c96102d4b',1,'mqtt_connect_client_info_t']]],
   ['client_5fuser_8',['client_user',['../structmqtt__connect__client__info__t.html#aec961673d5c3e8dc853c91f30d9333b5',1,'mqtt_connect_client_info_t']]],
   ['close_9',['close',['../structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65',1,'tftp_context']]],
-  ['conn_10',['conn',['../structapi__msg.html#abec5e33802d69f1b601543d60699f028',1,'api_msg::conn'],['../structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4',1,'lwip_sock::conn']]],
-  ['conn_5fstate_11',['conn_state',['../structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6',1,'mqtt_client_s']]],
-  ['connect_5farg_12',['connect_arg',['../structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a',1,'mqtt_client_s']]],
-  ['current_5finput_5fnetif_13',['current_input_netif',['../structip__globals.html#a7da899c663b1d560b61d92ba6d544701',1,'ip_globals']]],
-  ['current_5fip4_5fheader_14',['current_ip4_header',['../structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4',1,'ip_globals']]],
-  ['current_5fip6_5fheader_15',['current_ip6_header',['../structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41',1,'ip_globals']]],
-  ['current_5fip_5fheader_5ftot_5flen_16',['current_ip_header_tot_len',['../structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a',1,'ip_globals']]],
-  ['current_5fiphdr_5fdest_17',['current_iphdr_dest',['../structip__globals.html#a0b4e54250c692c638408de54593d2aa1',1,'ip_globals']]],
-  ['current_5fiphdr_5fsrc_18',['current_iphdr_src',['../structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0',1,'ip_globals']]],
-  ['current_5fmsg_19',['current_msg',['../structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9',1,'netconn']]],
-  ['current_5fnetif_20',['current_netif',['../structip__globals.html#a7803dc5950d143e4433a0df689989bab',1,'ip_globals']]],
-  ['custom_5ffree_5ffunction_21',['custom_free_function',['../structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9',1,'pbuf_custom']]],
-  ['cyclic_5ftick_22',['cyclic_tick',['../structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef',1,'mqtt_client_s']]]
+  ['conflict_5ftime_10',['conflict_time',['../structmdns__host.html#ab1ca90b282a4a6511fa87408b946f49a',1,'mdns_host']]],
+  ['conn_11',['conn',['../structapi__msg.html#abec5e33802d69f1b601543d60699f028',1,'api_msg::conn'],['../structlwip__sock.html#a3a3fee485b3361ed7054cde149355fb4',1,'lwip_sock::conn']]],
+  ['conn_5fstate_12',['conn_state',['../structmqtt__client__s.html#af4a07c1079e2e2a336f1939d8b9677e6',1,'mqtt_client_s']]],
+  ['connect_5farg_13',['connect_arg',['../structmqtt__client__s.html#ae6d53359ec6d70533dab7c0d2717ce1a',1,'mqtt_client_s']]],
+  ['current_5finput_5fnetif_14',['current_input_netif',['../structip__globals.html#a7da899c663b1d560b61d92ba6d544701',1,'ip_globals']]],
+  ['current_5fip4_5fheader_15',['current_ip4_header',['../structip__globals.html#a2e810f97cf3e8e855e3baafc3be8c0d4',1,'ip_globals']]],
+  ['current_5fip6_5fheader_16',['current_ip6_header',['../structip__globals.html#aa5cfc3ac29dc746a4cbe844206b0ed41',1,'ip_globals']]],
+  ['current_5fip_5fheader_5ftot_5flen_17',['current_ip_header_tot_len',['../structip__globals.html#a17004526e6f1a164c0bab01aeac5e34a',1,'ip_globals']]],
+  ['current_5fiphdr_5fdest_18',['current_iphdr_dest',['../structip__globals.html#a0b4e54250c692c638408de54593d2aa1',1,'ip_globals']]],
+  ['current_5fiphdr_5fsrc_19',['current_iphdr_src',['../structip__globals.html#a04d85a3dc2c417050b3e088fa58a74b0',1,'ip_globals']]],
+  ['current_5fmsg_20',['current_msg',['../structnetconn.html#a49ba09038b2f2563fd3a38e38f8b8ab9',1,'netconn']]],
+  ['current_5fnetif_21',['current_netif',['../structip__globals.html#a7803dc5950d143e4433a0df689989bab',1,'ip_globals']]],
+  ['custom_5ffree_5ffunction_22',['custom_free_function',['../structpbuf__custom.html#af614d17874746cbbf778dc4ca9eac2e9',1,'pbuf_custom']]],
+  ['cyclic_5ftick_23',['cyclic_tick',['../structmqtt__client__s.html#a6274ba2eb2fe6afa970b1c8a650d8cef',1,'mqtt_client_s']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_4.js b/doc/doxygen/output/html/search/variables_4.js
index 3c494f8..954c08d 100644
--- a/doc/doxygen/output/html/search/variables_4.js
+++ b/doc/doxygen/output/html/search/variables_4.js
@@ -1,14 +1,13 @@
 var searchData=
 [
   ['data_5fcb_0',['data_cb',['../structmqtt__client__s.html#a26dc9112351c042594a41703197925a7',1,'mqtt_client_s']]],
-  ['dest_5faddr_1',['dest_addr',['../structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4',1,'mdns_outpacket']]],
-  ['destination_5faddress_2',['destination_address',['../structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33',1,'ieee_802154_hdr']]],
-  ['destination_5fpan_5fid_3',['destination_pan_id',['../structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd',1,'ieee_802154_hdr']]],
-  ['destroy_4',['destroy',['../structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b',1,'tcp_ext_arg_callbacks']]],
-  ['dhcp6_5frx_5foptions_5',['dhcp6_rx_options',['../dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0',1,'dhcp6.c']]],
-  ['dhcp_5frx_5foptions_5fgiven_6',['dhcp_rx_options_given',['../dhcp_8c.html#a058b71e1d26b3758b29d16d9f892c8cc',1,'dhcp.c']]],
-  ['dhcp_5frx_5foptions_5fval_7',['dhcp_rx_options_val',['../dhcp_8c.html#a5abd232496063bddcbc6692c0e8f9c1f',1,'dhcp.c']]],
+  ['delayed_5fmsg_5fmulticast_1',['delayed_msg_multicast',['../structmdns__delayed__msg.html#a6f2ed8a51e6e249c3c72c3e31f23d20b',1,'mdns_delayed_msg']]],
+  ['delayed_5fmsg_5funicast_2',['delayed_msg_unicast',['../structmdns__delayed__msg.html#acaa15e086356be60b2a1bdd8fcc17edd',1,'mdns_delayed_msg']]],
+  ['dest_5faddr_3',['dest_addr',['../structmdns__outmsg.html#a187774c17294968998b6f12bb5834cd0',1,'mdns_outmsg']]],
+  ['destination_5faddress_4',['destination_address',['../structieee__802154__hdr.html#a87ce59d2804cacc5a58411c8b6c47f33',1,'ieee_802154_hdr']]],
+  ['destination_5fpan_5fid_5',['destination_pan_id',['../structieee__802154__hdr.html#ac1ad9159d3bb70b1a7223060c6c81efd',1,'ieee_802154_hdr']]],
+  ['destroy_6',['destroy',['../structtcp__ext__arg__callbacks.html#ace586d5d376b42465927a4fd8688c24b',1,'tcp_ext_arg_callbacks']]],
+  ['dhcp6_5frx_5foptions_7',['dhcp6_rx_options',['../dhcp6_8c.html#abcce06f078da4b03265d20c0bc1bdce0',1,'dhcp6.c']]],
   ['dns_5faddrtype_8',['dns_addrtype',['../structdns__api__msg.html#afb2536a6c342bed4c4ad9d75982f7493',1,'dns_api_msg']]],
-  ['dns_5fttl_9',['dns_ttl',['../structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14',1,'mdns_service::dns_ttl'],['../structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b',1,'mdns_host::dns_ttl']]],
-  ['domain_5foffsets_10',['domain_offsets',['../structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f',1,'mdns_outpacket']]]
+  ['domain_5foffsets_9',['domain_offsets',['../structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f',1,'mdns_outpacket']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_5.js b/doc/doxygen/output/html/search/variables_5.js
index 8060414..6d49061 100644
--- a/doc/doxygen/output/html/search/variables_5.js
+++ b/doc/doxygen/output/html/search/variables_5.js
@@ -2,7 +2,8 @@
 [
   ['err_0',['err',['../structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f',1,'api_msg::err'],['../structdns__api__msg.html#a6536d91adb146555461359bd451b30de',1,'dns_api_msg::err']]],
   ['errevent_1',['errevent',['../structlwip__sock.html#a9245a7ab9471bfb6fac94c66d26fba5e',1,'lwip_sock']]],
-  ['ethaddr_2',['ethaddr',['../structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc',1,'bridgeif_initdata_s']]],
-  ['etharp_3',['etharp',['../structstats__.html#aa52547cb08dc828927494dc485bb69f3',1,'stats_']]],
-  ['exceptset_4',['exceptset',['../structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed',1,'lwip_select_cb']]]
+  ['error_2',['error',['../structtftp__context.html#a39cbb84a9c0eaa8ea62d183ba8214519',1,'tftp_context']]],
+  ['ethaddr_3',['ethaddr',['../structbridgeif__initdata__s.html#a8e0048db5e021f5d79411492dc9330bc',1,'bridgeif_initdata_s']]],
+  ['etharp_4',['etharp',['../structstats__.html#aa52547cb08dc828927494dc485bb69f3',1,'stats_']]],
+  ['exceptset_5',['exceptset',['../structlwip__select__cb.html#a2a1e68993ed887fca326d1373ea6caed',1,'lwip_select_cb']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_6.js b/doc/doxygen/output/html/search/variables_6.js
index aa01892..b1ed6ec 100644
--- a/doc/doxygen/output/html/search/variables_6.js
+++ b/doc/doxygen/output/html/search/variables_6.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['flags_0',['flags',['../structnetconn.html#a96cb9a3830248699bd07a1a447e5630c',1,'netconn::flags'],['../structnetif.html#a1c171db6097bbb6f09f63549a66e00ea',1,'netif::flags'],['../structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a',1,'pbuf::flags']]],
+  ['flags_0',['flags',['../structnetconn.html#a96cb9a3830248699bd07a1a447e5630c',1,'netconn::flags'],['../structmdns__outmsg.html#a8118f6c263f6f8727552620deac2b7c2',1,'mdns_outmsg::flags'],['../structnetif.html#a1c171db6097bbb6f09f63549a66e00ea',1,'netif::flags'],['../structpbuf.html#aa4d1af2cab3d9280d29212095b5b872a',1,'pbuf::flags']]],
   ['frame_5fcontrol_1',['frame_control',['../structieee__802154__hdr.html#a1d1e2cef0e0c1b1e1fd02a8a5f07fb10',1,'ieee_802154_hdr']]],
   ['from_2',['from',['../structsmtp__session.html#a8dc4651c67618e33c56dc66790bc12ee',1,'smtp_session']]],
   ['from_5flen_3',['from_len',['../structsmtp__session.html#a191b09e7142414a671da82fece888e65',1,'smtp_session']]]
diff --git a/doc/doxygen/output/html/search/variables_9.js b/doc/doxygen/output/html/search/variables_9.js
index 404f903..499f4d8 100644
--- a/doc/doxygen/output/html/search/variables_9.js
+++ b/doc/doxygen/output/html/search/variables_9.js
@@ -18,17 +18,21 @@
   ['igmp_15',['igmp',['../structstats__.html#a877e369c2abef97f13492faa838e2271',1,'stats_']]],
   ['igmp_5fmac_5ffilter_16',['igmp_mac_filter',['../structnetif.html#ae64e56581bf0f136601f24c5395c19f0',1,'netif']]],
   ['in6addr_5fany_17',['in6addr_any',['../inet6_8c.html#af8c97553060738d9edd6bfeab13ef7c3',1,'in6addr_any:&#160;inet6.c'],['../lwip_2inet_8h.html#af8c97553060738d9edd6bfeab13ef7c3',1,'in6addr_any:&#160;inet6.c']]],
-  ['inpub_5fpkt_5fid_18',['inpub_pkt_id',['../structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824',1,'mqtt_client_s']]],
-  ['input_19',['input',['../structnetif.html#a8fe4f1b7b0d710216287da9615164a5c',1,'netif']]],
-  ['instance_5foid_20',['instance_oid',['../structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23',1,'snmp_node_instance']]],
-  ['ip_21',['ip',['../structstats__.html#a40f5b637d083896a07a3482ede23b7ed',1,'stats_']]],
-  ['ip6_22',['ip6',['../structstats__.html#afc0942a5bc26735cf059099636b85336',1,'stats_']]],
-  ['ip6_5faddr_23',['ip6_addr',['../structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4',1,'netif']]],
-  ['ip6_5faddr_5fstate_24',['ip6_addr_state',['../structnetif.html#a54e81344084e9840a51cc4abab3b059b',1,'netif']]],
-  ['ip6_5faddr_5fvalid_5flife_25',['ip6_addr_valid_life',['../structnetif.html#a26f6e26d4a54c998716c10b7b85c8230',1,'netif']]],
-  ['ip6_5fautoconfig_5fenabled_26',['ip6_autoconfig_enabled',['../structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f',1,'netif']]],
-  ['ip6_5ffrag_27',['ip6_frag',['../structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf',1,'stats_']]],
-  ['ip_5faddr_28',['ip_addr',['../structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866',1,'netif']]],
-  ['ip_5fdata_29',['ip_data',['../ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data:&#160;ip.c'],['../ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data:&#160;ip.c']]],
-  ['ip_5ffrag_30',['ip_frag',['../structstats__.html#a81fcccf03ab0d4e31423f39d0c880302',1,'stats_']]]
+  ['index_18',['index',['../structmdns__host.html#ab5099b1bfe27698f6cc7ac36a80111a0',1,'mdns_host']]],
+  ['inpub_5fpkt_5fid_19',['inpub_pkt_id',['../structmqtt__client__s.html#a6c81d0dd14e786222425ea04fd060824',1,'mqtt_client_s']]],
+  ['input_20',['input',['../structnetif.html#a8fe4f1b7b0d710216287da9615164a5c',1,'netif']]],
+  ['instance_5foid_21',['instance_oid',['../structsnmp__node__instance.html#aedb358729c310c8e5b391dd256726a23',1,'snmp_node_instance']]],
+  ['ip_22',['ip',['../structstats__.html#a40f5b637d083896a07a3482ede23b7ed',1,'stats_']]],
+  ['ip6_23',['ip6',['../structstats__.html#afc0942a5bc26735cf059099636b85336',1,'stats_']]],
+  ['ip6_5faddr_24',['ip6_addr',['../structnetif.html#ab7ef575d4ab398a182bc6e592f4d53a4',1,'netif']]],
+  ['ip6_5faddr_5fstate_25',['ip6_addr_state',['../structnetif.html#a54e81344084e9840a51cc4abab3b059b',1,'netif']]],
+  ['ip6_5faddr_5fvalid_5flife_26',['ip6_addr_valid_life',['../structnetif.html#a26f6e26d4a54c998716c10b7b85c8230',1,'netif']]],
+  ['ip6_5fautoconfig_5fenabled_27',['ip6_autoconfig_enabled',['../structnetif.html#ad98bafb7733b40ef898e53d91fbfa20f',1,'netif']]],
+  ['ip6_5ffrag_28',['ip6_frag',['../structstats__.html#a7373df7bc44bb9913a42c0bc7b3039cf',1,'stats_']]],
+  ['ip_5faddr_29',['ip_addr',['../structnetif.html#a9776aaee37ea8f07b9ddc0f8b4e7e866',1,'netif']]],
+  ['ip_5fdata_30',['ip_data',['../ip_8c.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data:&#160;ip.c'],['../ip_8h.html#ac944fb6564f181bc90bc7c2b8b00d94c',1,'ip_data:&#160;ip.c']]],
+  ['ip_5ffrag_31',['ip_frag',['../structstats__.html#a81fcccf03ab0d4e31423f39d0c880302',1,'stats_']]],
+  ['ipaddr_32',['ipaddr',['../structacd.html#af2c795ee5b09085bca592d830a388448',1,'acd']]],
+  ['ipv4_33',['ipv4',['../structmdns__host.html#a9d0df33231cd8b50e25aa1fa4ebdc291',1,'mdns_host']]],
+  ['ipv6_34',['ipv6',['../structmdns__host.html#a16016021ddabb1dc182f36c7185bf283',1,'mdns_host']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_a.js b/doc/doxygen/output/html/search/variables_a.js
index 7b50839..0a36a17 100644
--- a/doc/doxygen/output/html/search/variables_a.js
+++ b/doc/doxygen/output/html/search/variables_a.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['jl_0',['jl',['../structapi__msg.html#aa3d64205c25e953b168447e6aa21ee9e',1,'api_msg']]],
+  ['jl_0',['jl',['../structapi__msg.html#a718b0166a9956c608188e8f99c663203',1,'api_msg']]],
   ['jumpers_1',['jumpers',['../structnetbios__answer.html#a69cd3e8b8265531a7ce3e5cbd4911683',1,'netbios_answer']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_c.js b/doc/doxygen/output/html/search/variables_c.js
index de506ea..ccd3d25 100644
--- a/doc/doxygen/output/html/search/variables_c.js
+++ b/doc/doxygen/output/html/search/variables_c.js
@@ -1,9 +1,9 @@
 var searchData=
 [
   ['last_5freporter_5fflag_0',['last_reporter_flag',['../structigmp__group.html#a8fa72062d168d81c1c5ae5209eb0a874',1,'igmp_group::last_reporter_flag'],['../structmld__group.html#aa8eb75f4dfaefbf0d2853b0e31ceb53b',1,'mld_group::last_reporter_flag']]],
-  ['lastconflict_1',['lastconflict',['../structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55',1,'autoip']]],
+  ['lastconflict_1',['lastconflict',['../structacd.html#a9dd4e1b82dd3e97717f011dbf862a58e',1,'acd']]],
   ['lastdata_2',['lastdata',['../structlwip__sock.html#aa487ac16b7e5b6a2a618b7b5060247e1',1,'lwip_sock']]],
-  ['legacy_5fquery_3',['legacy_query',['../structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65',1,'mdns_outpacket']]],
+  ['legacy_5fquery_3',['legacy_query',['../structmdns__outmsg.html#aab2d5c566dcd83874d9cc77cd5fc7253',1,'mdns_outmsg']]],
   ['len_4',['len',['../structnetvector.html#a8a95e6dcf57067e4354b9c2b6b391dbd',1,'netvector::len'],['../structpbuf.html#a6f82449625e36e294f5d210268c0703f',1,'pbuf::len'],['../structapi__msg.html#a40624c398d1939bfee54bffa708a363e',1,'api_msg::len']]],
   ['linger_5',['linger',['../structnetconn.html#a25ed06d944da0b0b9e7db5265be3fa3d',1,'netconn']]],
   ['link_6',['link',['../structstats__.html#a67759c9b0059bf569f9f771df23924eb',1,'stats_']]],
diff --git a/doc/doxygen/output/html/search/variables_d.js b/doc/doxygen/output/html/search/variables_d.js
index 9b92839..7b98d1f 100644
--- a/doc/doxygen/output/html/search/variables_d.js
+++ b/doc/doxygen/output/html/search/variables_d.js
@@ -15,8 +15,12 @@
   ['mib2_5fcounters_12',['mib2_counters',['../structnetif.html#ab32cbe1851154fd020bac4be558f5fd5',1,'netif']]],
   ['mld6_13',['mld6',['../structstats__.html#ab0ad1d07dff25cd3e4a8e5be607497f8',1,'stats_']]],
   ['mld_5fmac_5ffilter_14',['mld_mac_filter',['../structnetif.html#abc67963ff9f574e98ef9c50138a3e470',1,'netif']]],
-  ['msg_15',['msg',['../structapi__msg.html#a01eaa41b1bbdc92e78ba3712d28cb613',1,'api_msg']]],
+  ['msg_15',['msg',['../structapi__msg.html#a7c67466a08e96f57f5cc8a41beb883b3',1,'api_msg']]],
   ['msg_5fidx_16',['msg_idx',['../structmqtt__client__s.html#aae7bd1da3461efef9616934feb166aa5',1,'mqtt_client_s']]],
   ['mtu_17',['mtu',['../structnetif.html#aca7d56b4e0f822b0ced2885f222b8d48',1,'netif']]],
-  ['mtu6_18',['mtu6',['../structnetif.html#acd78fca5dad6468605f38e327b3a5e72',1,'netif']]]
+  ['mtu6_18',['mtu6',['../structnetif.html#acd78fca5dad6468605f38e327b3a5e72',1,'netif']]],
+  ['multicast_5fmsg_5fwaiting_19',['multicast_msg_waiting',['../structmdns__delayed__msg.html#a641abcf692a99e2c969048432b3c6adf',1,'mdns_delayed_msg']]],
+  ['multicast_5fprobe_5ftimeout_20',['multicast_probe_timeout',['../structmdns__delayed__msg.html#a5ca9fccc523b7820f8e67c9ccf921da8',1,'mdns_delayed_msg']]],
+  ['multicast_5ftimeout_21',['multicast_timeout',['../structmdns__delayed__msg.html#a6c7e581f1cf67daf039ffcaa31580e60',1,'mdns_delayed_msg']]],
+  ['multicast_5ftimeout_5f25ttl_22',['multicast_timeout_25TTL',['../structmdns__delayed__msg.html#a7052387506ef48b1db099c48f4ec5736',1,'mdns_delayed_msg']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_e.js b/doc/doxygen/output/html/search/variables_e.js
index 490e14d..6ebe342 100644
--- a/doc/doxygen/output/html/search/variables_e.js
+++ b/doc/doxygen/output/html/search/variables_e.js
@@ -1,25 +1,27 @@
 var searchData=
 [
-  ['n_0',['n',['../structapi__msg.html#a46007ce4f08d3e396f068ab80c9a9ae1',1,'api_msg']]],
-  ['name_1',['name',['../structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784',1,'mdns_service::name'],['../structmdns__host.html#a560447b364854eb5480e137e09d3cd24',1,'mdns_host::name'],['../structnetif.html#a32fca6ffd28bb9af3f891a378827a67e',1,'netif::name'],['../structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53',1,'dns_api_msg::name']]],
+  ['n_0',['n',['../structapi__msg.html#a9b0c707835838c2ffe55b85c2902d7ad',1,'api_msg']]],
+  ['name_1',['name',['../structmdns__request.html#a3ed18dad500125e0d63274c797bd52f5',1,'mdns_request::name'],['../structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784',1,'mdns_service::name'],['../structmdns__host.html#a560447b364854eb5480e137e09d3cd24',1,'mdns_host::name'],['../structnetif.html#a32fca6ffd28bb9af3f891a378827a67e',1,'netif::name'],['../structdns__api__msg.html#ada44a0eb6c9181cac80cfbbee01d3b53',1,'dns_api_msg::name']]],
   ['name_5fsize_2',['name_size',['../structnetbios__answer.html#a5828dc04e01a1f7b734019db428fd46d',1,'netbios_answer']]],
   ['nd6_3',['nd6',['../structstats__.html#ab348a3a4b593b05d7df1293a06af8adf',1,'stats_']]],
-  ['netif_4',['netif',['../structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989',1,'mdns_packet::netif'],['../structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430',1,'mdns_outpacket::netif']]],
-  ['netif_5fdefault_5',['netif_default',['../netif_8c.html#a3d0925cbce550ed461907aee816713ba',1,'netif_default:&#160;netif.c'],['../netif_8h.html#a3d0925cbce550ed461907aee816713ba',1,'netif_default:&#160;netif.c']]],
-  ['netif_5flist_6',['netif_list',['../netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list:&#160;netif.c'],['../netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list:&#160;netif.c']]],
-  ['next_7',['next',['../structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf',1,'mem::next'],['../structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b',1,'mqtt_request_t::next'],['../structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e',1,'snmp_varbind::next'],['../structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78',1,'igmp_group::next'],['../structmld__group.html#a9273a345a5754241bf26ddc835d27ddc',1,'mld_group::next'],['../structnetif.html#ae77736b64df442242795220d76be6b86',1,'netif::next'],['../structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341',1,'pbuf::next'],['../structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7',1,'pbuf_rom::next'],['../structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a',1,'lwip_select_cb::next'],['../structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34',1,'tcp_pcb_listen::next'],['../structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260',1,'tcp_pcb::next']]],
-  ['node_8',['node',['../structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac',1,'snmp_node_instance::node'],['../structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386',1,'snmp_tree_node::node'],['../structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992',1,'snmp_leaf_node::node'],['../structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1',1,'snmp_scalar_node::node'],['../structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b',1,'snmp_scalar_array_node::node'],['../structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18',1,'snmp_table_node::node']]],
-  ['node_5ftype_9',['node_type',['../structsnmp__node.html#a1af8e20a688943a419b307bf123b1851',1,'snmp_node']]],
-  ['num_10',['num',['../structnetif.html#ab7ef01e505dd2feb781fe86756b1c973',1,'netif::num'],['../structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7',1,'memp_desc::num']]],
-  ['number_5fof_5falignment_5ferrors_11',['number_of_alignment_errors',['../structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2',1,'netbios_answer']]],
-  ['number_5fof_5fcollisions_12',['number_of_collisions',['../structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e',1,'netbios_answer']]],
-  ['number_5fof_5fcrcs_13',['number_of_crcs',['../structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8',1,'netbios_answer']]],
-  ['number_5fof_5ffree_5fcommand_5fblocks_14',['number_of_free_command_blocks',['../structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219',1,'netbios_answer']]],
-  ['number_5fof_5fgood_5freceives_15',['number_of_good_receives',['../structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea',1,'netbios_answer']]],
-  ['number_5fof_5fgood_5fsends_16',['number_of_good_sends',['../structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd',1,'netbios_answer']]],
-  ['number_5fof_5fnames_17',['number_of_names',['../structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491',1,'netbios_answer']]],
-  ['number_5fof_5fno_5fresource_5fcondition_18',['number_of_no_resource_condition',['../structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42',1,'netbios_answer']]],
-  ['number_5fof_5fpending_5fsessions_19',['number_of_pending_sessions',['../structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d',1,'netbios_answer']]],
-  ['number_5fof_5fretransmits_20',['number_of_retransmits',['../structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321',1,'netbios_answer']]],
-  ['number_5fof_5fsend_5faborts_21',['number_of_send_aborts',['../structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408',1,'netbios_answer']]]
+  ['netif_5fdefault_4',['netif_default',['../netif_8c.html#a3d0925cbce550ed461907aee816713ba',1,'netif_default:&#160;netif.c'],['../netif_8h.html#a3d0925cbce550ed461907aee816713ba',1,'netif_default:&#160;netif.c']]],
+  ['netif_5flist_5',['netif_list',['../netif_8c.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list:&#160;netif.c'],['../netif_8h.html#a1c8141eaa98f6dc6dfddbb23a706656c',1,'netif_list:&#160;netif.c']]],
+  ['next_6',['next',['../structmem.html#a5abf13a11156e92c417f7ff66ef0b5cf',1,'mem::next'],['../structacd.html#aa14c2b88cd471839d5b5de80bb46a9aa',1,'acd::next'],['../structmqtt__request__t.html#aca8de21579f51e7742076a4975a4177b',1,'mqtt_request_t::next'],['../structsnmp__varbind.html#a7388422ffb0607b209a39d6d3fcad40e',1,'snmp_varbind::next'],['../structigmp__group.html#a95c41b9e7de6a14bb8a7910913395e78',1,'igmp_group::next'],['../structmld__group.html#a9273a345a5754241bf26ddc835d27ddc',1,'mld_group::next'],['../structnetif.html#ae77736b64df442242795220d76be6b86',1,'netif::next'],['../structpbuf.html#a5e5763c94fd18d78937b0b58ce7df341',1,'pbuf::next'],['../structpbuf__rom.html#a5ffdf590ed65b217e2d96f648e1bd3e7',1,'pbuf_rom::next'],['../structlwip__select__cb.html#a94128f0e164f895226f20fe75fddd35a',1,'lwip_select_cb::next'],['../structtcp__pcb__listen.html#a0483d0c2a2758dcef18689be2efbdf34',1,'tcp_pcb_listen::next'],['../structtcp__pcb.html#a2aed7ffb5fb83aabe68b36f097d99260',1,'tcp_pcb::next']]],
+  ['next_5fanswer_7',['next_answer',['../structmdns__packet.html#a1ff4547d0866f338d1c58fc1dadf43f1',1,'mdns_packet']]],
+  ['next_5ftc_5fquestion_8',['next_tc_question',['../structmdns__packet.html#afdb78218c1775073762d9560986c119b',1,'mdns_packet']]],
+  ['node_9',['node',['../structsnmp__node__instance.html#a4136f44404b25f4d4dacc6b6b76e77ac',1,'snmp_node_instance::node'],['../structsnmp__tree__node.html#ad851f80c809606947c99cb26a9163386',1,'snmp_tree_node::node'],['../structsnmp__leaf__node.html#aa9e43030b5229d8425082c595c576992',1,'snmp_leaf_node::node'],['../structsnmp__scalar__node.html#a3c9e5cc0a5e22ececeeb3c512d25e3a1',1,'snmp_scalar_node::node'],['../structsnmp__scalar__array__node.html#a34753e75ec873c92381bf9b6d00d411b',1,'snmp_scalar_array_node::node'],['../structsnmp__table__node.html#a3f12334e8d1556c36ce3e2206001ab18',1,'snmp_table_node::node']]],
+  ['node_5ftype_10',['node_type',['../structsnmp__node.html#a1af8e20a688943a419b307bf123b1851',1,'snmp_node']]],
+  ['num_11',['num',['../structnetif.html#ab7ef01e505dd2feb781fe86756b1c973',1,'netif::num'],['../structmemp__desc.html#a2c32db78e565b8812ca0e20fe929a8a7',1,'memp_desc::num']]],
+  ['num_5fconflicts_12',['num_conflicts',['../structacd.html#ab40b6b3cf57634135753f2426207f84a',1,'acd::num_conflicts'],['../structmdns__host.html#a07aadf9f308eee16a99041635df38123',1,'mdns_host::num_conflicts']]],
+  ['number_5fof_5falignment_5ferrors_13',['number_of_alignment_errors',['../structnetbios__answer.html#ab4f9ff63bd5529418c07762506189ad2',1,'netbios_answer']]],
+  ['number_5fof_5fcollisions_14',['number_of_collisions',['../structnetbios__answer.html#a45b7aec200434d3aaabc3ea6ebc46c1e',1,'netbios_answer']]],
+  ['number_5fof_5fcrcs_15',['number_of_crcs',['../structnetbios__answer.html#ab23a11db86a170b46aa8f8af434534d8',1,'netbios_answer']]],
+  ['number_5fof_5ffree_5fcommand_5fblocks_16',['number_of_free_command_blocks',['../structnetbios__answer.html#af41cbffb0ac6a9db3305b3fc64646219',1,'netbios_answer']]],
+  ['number_5fof_5fgood_5freceives_17',['number_of_good_receives',['../structnetbios__answer.html#a0eab7dbe733cc50f515126649de596ea',1,'netbios_answer']]],
+  ['number_5fof_5fgood_5fsends_18',['number_of_good_sends',['../structnetbios__answer.html#aa6088bca2a59ffcd077a474330511abd',1,'netbios_answer']]],
+  ['number_5fof_5fnames_19',['number_of_names',['../structnetbios__answer.html#ac4a95ccabbb945c9470e0cfd470be491',1,'netbios_answer']]],
+  ['number_5fof_5fno_5fresource_5fcondition_20',['number_of_no_resource_condition',['../structnetbios__answer.html#a62946dd0f27e9f9b9f295dcde4d3ea42',1,'netbios_answer']]],
+  ['number_5fof_5fpending_5fsessions_21',['number_of_pending_sessions',['../structnetbios__answer.html#a66098747155d5bd56f1c92aa8da10c1d',1,'netbios_answer']]],
+  ['number_5fof_5fretransmits_22',['number_of_retransmits',['../structnetbios__answer.html#ab175ad0f89102b3b3f81a41b5a72b321',1,'netbios_answer']]],
+  ['number_5fof_5fsend_5faborts_23',['number_of_send_aborts',['../structnetbios__answer.html#a1560e3864a0821acea9410e8c1d21408',1,'netbios_answer']]]
 ];
diff --git a/doc/doxygen/output/html/search/variables_f.js b/doc/doxygen/output/html/search/variables_f.js
index 2cc0cd9..7a65cdc 100644
--- a/doc/doxygen/output/html/search/variables_f.js
+++ b/doc/doxygen/output/html/search/variables_f.js
@@ -4,9 +4,10 @@
   ['oid_1',['oid',['../structsnmp__varbind.html#ace3a9e4dcdc9a5ec79a20c84946418a4',1,'snmp_varbind::oid'],['../structsnmp__node.html#ae7a3bb0eb49ac527d461be414937f271',1,'snmp_node::oid']]],
   ['old_5faddress_2',['old_address',['../structnetif__ext__callback__args__t_1_1ipv4__changed__s.html#a0f6e5c1318218d95f1d3dc8c29c30ade',1,'netif_ext_callback_args_t::ipv4_changed_s::old_address'],['../structnetif__ext__callback__args__t_1_1ipv6__set__s.html#aafda237ad0c20d25fa2ad83d63051226',1,'netif_ext_callback_args_t::ipv6_set_s::old_address']]],
   ['old_5fstate_3',['old_state',['../structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html#a9b58712e82a73803391523324e19a776',1,'netif_ext_callback_args_t::ipv6_addr_state_changed_s']]],
-  ['op_5fcompleted_4',['op_completed',['../structnetconn.html#a982506698a59f185ff3f16d1675ea4ae',1,'netconn']]],
-  ['open_5',['open',['../structtftp__context.html#a65d6359e2aac571813c05c61676c01a1',1,'tftp_context']]],
-  ['original_6',['original',['../structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d',1,'pbuf_custom_ref']]],
-  ['output_7',['output',['../structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c',1,'mqtt_client_s::output'],['../structnetif.html#a8e1dcfe65db487feecd244355f39215e',1,'netif::output']]],
-  ['output_5fip6_8',['output_ip6',['../structnetif.html#ac38383379cff22c402156fec71c19617',1,'netif']]]
+  ['only_5fptr_4',['only_ptr',['../structmdns__request.html#a1080b561c8dcb322fb2af64217b13f64',1,'mdns_request']]],
+  ['op_5fcompleted_5',['op_completed',['../structnetconn.html#a982506698a59f185ff3f16d1675ea4ae',1,'netconn']]],
+  ['open_6',['open',['../structtftp__context.html#a65d6359e2aac571813c05c61676c01a1',1,'tftp_context']]],
+  ['original_7',['original',['../structpbuf__custom__ref.html#a135a1476908337d8073241fd7f68fa1d',1,'pbuf_custom_ref']]],
+  ['output_8',['output',['../structmqtt__client__s.html#a667c1dc7a6008055b63877acb06f333c',1,'mqtt_client_s::output'],['../structnetif.html#a8e1dcfe65db487feecd244355f39215e',1,'netif::output']]],
+  ['output_5fip6_9',['output_ip6',['../structnetif.html#ac38383379cff22c402156fec71c19617',1,'netif']]]
 ];
diff --git a/doc/doxygen/output/html/slipif_8c.html b/doc/doxygen/output/html/slipif_8c.html
index 37f5bed..9e3384d 100644
--- a/doc/doxygen/output/html/slipif_8c.html
+++ b/doc/doxygen/output/html/slipif_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/slipif_8h.html b/doc/doxygen/output/html/slipif_8h.html
index 63b070c..8a539c9 100644
--- a/doc/doxygen/output/html/slipif_8h.html
+++ b/doc/doxygen/output/html/slipif_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/smtp_8c.html b/doc/doxygen/output/html/smtp_8c.html
index 3bf9707..6a95a34 100644
--- a/doc/doxygen/output/html/smtp_8c.html
+++ b/doc/doxygen/output/html/smtp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp_8h.html b/doc/doxygen/output/html/snmp_8h.html
index 1a016e8..cc9f3da 100644
--- a/doc/doxygen/output/html/snmp_8h.html
+++ b/doc/doxygen/output/html/snmp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__asn1_8c.html b/doc/doxygen/output/html/snmp__asn1_8c.html
index f547822..90fcf44 100644
--- a/doc/doxygen/output/html/snmp__asn1_8c.html
+++ b/doc/doxygen/output/html/snmp__asn1_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__asn1_8h.html b/doc/doxygen/output/html/snmp__asn1_8h.html
index 95078d9..cdf843d 100644
--- a/doc/doxygen/output/html/snmp__asn1_8h.html
+++ b/doc/doxygen/output/html/snmp__asn1_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__core_8c.html b/doc/doxygen/output/html/snmp__core_8c.html
index 5650174..bede236 100644
--- a/doc/doxygen/output/html/snmp__core_8c.html
+++ b/doc/doxygen/output/html/snmp__core_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -260,9 +260,9 @@
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">buf</td><td>points to a buffer where the resulting ASN1 octet string is stored to </td></tr>
-    <tr><td class="paramname">buf_len</td><td>max length of the bufffer </td></tr>
+    <tr><td class="paramname">buf_len</td><td>max length of the buffer </td></tr>
     <tr><td class="paramname">bit_value</td><td>Bit value to encode with Bit0 == LSB </td></tr>
-    <tr><td class="paramname">bit_count</td><td>Number of possible bits for the bit value (according to rfc we have to send all bits independant from their truth value) </td></tr>
+    <tr><td class="paramname">bit_count</td><td>Number of possible bits for the bit value (according to rfc we have to send all bits independent from their truth value) </td></tr>
   </table>
   </dd>
 </dl>
@@ -514,7 +514,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>checks if the passed incomplete OID may be a possible candidate for <a class="el" href="#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check()</a>; this methid is intended if the complete OID is not yet known but it is very expensive to build it up, so it is possible to test the starting part before building up the complete oid and pass it to <a class="el" href="#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check()</a> </p>
+<p>checks if the passed incomplete OID may be a possible candidate for <a class="el" href="#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check()</a>; this method is intended if the complete OID is not yet known but it is very expensive to build it up, so it is possible to test the starting part before building up the complete oid and pass it to <a class="el" href="#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check()</a> </p>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/snmp__core_8h.html b/doc/doxygen/output/html/snmp__core_8h.html
index c38fd2e..27ceff3 100644
--- a/doc/doxygen/output/html/snmp__core_8h.html
+++ b/doc/doxygen/output/html/snmp__core_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -331,9 +331,9 @@
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">buf</td><td>points to a buffer where the resulting ASN1 octet string is stored to </td></tr>
-    <tr><td class="paramname">buf_len</td><td>max length of the bufffer </td></tr>
+    <tr><td class="paramname">buf_len</td><td>max length of the buffer </td></tr>
     <tr><td class="paramname">bit_value</td><td>Bit value to encode with Bit0 == LSB </td></tr>
-    <tr><td class="paramname">bit_count</td><td>Number of possible bits for the bit value (according to rfc we have to send all bits independant from their truth value) </td></tr>
+    <tr><td class="paramname">bit_count</td><td>Number of possible bits for the bit value (according to rfc we have to send all bits independent from their truth value) </td></tr>
   </table>
   </dd>
 </dl>
@@ -553,7 +553,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>checks if the passed incomplete OID may be a possible candidate for <a class="el" href="snmp__core_8c.html#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check()</a>; this methid is intended if the complete OID is not yet known but it is very expensive to build it up, so it is possible to test the starting part before building up the complete oid and pass it to <a class="el" href="snmp__core_8c.html#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check()</a> </p>
+<p>checks if the passed incomplete OID may be a possible candidate for <a class="el" href="snmp__core_8c.html#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check()</a>; this method is intended if the complete OID is not yet known but it is very expensive to build it up, so it is possible to test the starting part before building up the complete oid and pass it to <a class="el" href="snmp__core_8c.html#a18126b2b13f267306c27e851e9379983">snmp_next_oid_check()</a> </p>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/snmp__mib2_8c.html b/doc/doxygen/output/html/snmp__mib2_8c.html
index a421d7b..63514fe 100644
--- a/doc/doxygen/output/html/snmp__mib2_8c.html
+++ b/doc/doxygen/output/html/snmp__mib2_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__mib2_8h.html b/doc/doxygen/output/html/snmp__mib2_8h.html
index 1fad286..db69611 100644
--- a/doc/doxygen/output/html/snmp__mib2_8h.html
+++ b/doc/doxygen/output/html/snmp__mib2_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__mib2__icmp_8c.html b/doc/doxygen/output/html/snmp__mib2__icmp_8c.html
index e2df991..3e7dc36 100644
--- a/doc/doxygen/output/html/snmp__mib2__icmp_8c.html
+++ b/doc/doxygen/output/html/snmp__mib2__icmp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__mib2__interfaces_8c.html b/doc/doxygen/output/html/snmp__mib2__interfaces_8c.html
index 65fb660..9a17a88 100644
--- a/doc/doxygen/output/html/snmp__mib2__interfaces_8c.html
+++ b/doc/doxygen/output/html/snmp__mib2__interfaces_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__mib2__ip_8c.html b/doc/doxygen/output/html/snmp__mib2__ip_8c.html
index c5fc84a..c22184f 100644
--- a/doc/doxygen/output/html/snmp__mib2__ip_8c.html
+++ b/doc/doxygen/output/html/snmp__mib2__ip_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__mib2__snmp_8c.html b/doc/doxygen/output/html/snmp__mib2__snmp_8c.html
index 74ed462..ebc5f56 100644
--- a/doc/doxygen/output/html/snmp__mib2__snmp_8c.html
+++ b/doc/doxygen/output/html/snmp__mib2__snmp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__mib2__system_8c.html b/doc/doxygen/output/html/snmp__mib2__system_8c.html
index 80186a5..dee4915 100644
--- a/doc/doxygen/output/html/snmp__mib2__system_8c.html
+++ b/doc/doxygen/output/html/snmp__mib2__system_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__mib2__tcp_8c.html b/doc/doxygen/output/html/snmp__mib2__tcp_8c.html
index 5473ae2..a11a2a8 100644
--- a/doc/doxygen/output/html/snmp__mib2__tcp_8c.html
+++ b/doc/doxygen/output/html/snmp__mib2__tcp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__mib2__udp_8c.html b/doc/doxygen/output/html/snmp__mib2__udp_8c.html
index fb4bba7..fe7d6fa 100644
--- a/doc/doxygen/output/html/snmp__mib2__udp_8c.html
+++ b/doc/doxygen/output/html/snmp__mib2__udp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__msg_8c.html b/doc/doxygen/output/html/snmp__msg_8c.html
index 6a195cb..26fd9dd 100644
--- a/doc/doxygen/output/html/snmp__msg_8c.html
+++ b/doc/doxygen/output/html/snmp__msg_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -127,6 +127,8 @@
 <tr class="separator:ga5631711f357b6610be7e93b1c6d87760"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaff6a6b39322e92862ab55cfcddfe254b" id="r_gaff6a6b39322e92862ab55cfcddfe254b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b">snmp_set_write_callback</a> (snmp_write_callback_fct write_callback, void *callback_arg)</td></tr>
 <tr class="separator:gaff6a6b39322e92862ab55cfcddfe254b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga323ed081cc9903ceb6ebb26a046e0838" id="r_ga323ed081cc9903ceb6ebb26a046e0838"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838">snmp_set_inform_callback</a> (snmp_inform_callback_fct inform_callback, void *callback_arg)</td></tr>
+<tr class="separator:ga323ed081cc9903ceb6ebb26a046e0838"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ac1f684dada963f68b71a04a702f28fe5" id="r_ac1f684dada963f68b71a04a702f28fe5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac1f684dada963f68b71a04a702f28fe5">snmp_varbind_length</a> (struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbind, struct <a class="el" href="structsnmp__varbind__len.html">snmp_varbind_len</a> *len)</td></tr>
 <tr class="separator:ac1f684dada963f68b71a04a702f28fe5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
diff --git a/doc/doxygen/output/html/snmp__msg_8c.js b/doc/doxygen/output/html/snmp__msg_8c.js
index 342803f..6a07469 100644
--- a/doc/doxygen/output/html/snmp__msg_8c.js
+++ b/doc/doxygen/output/html/snmp__msg_8c.js
@@ -6,6 +6,7 @@
     [ "snmp_set_community", "group__snmp__core.html#ga30cc587a260757fdb2b81d462f430ef1", null ],
     [ "snmp_set_community_trap", "group__snmp__traps.html#ga5631711f357b6610be7e93b1c6d87760", null ],
     [ "snmp_set_community_write", "group__snmp__core.html#ga341461766863cff46a44e5f431f2da01", null ],
+    [ "snmp_set_inform_callback", "group__snmp__core.html#ga323ed081cc9903ceb6ebb26a046e0838", null ],
     [ "snmp_set_write_callback", "group__snmp__core.html#gaff6a6b39322e92862ab55cfcddfe254b", null ],
     [ "snmp_varbind_length", "snmp__msg_8c.html#ac1f684dada963f68b71a04a702f28fe5", null ],
     [ "snmp_community", "snmp__msg_8c.html#ac6f810ab812c44c6ca1df1fdf926a9f6", null ],
diff --git a/doc/doxygen/output/html/snmp__msg_8h.html b/doc/doxygen/output/html/snmp__msg_8h.html
index 689cc6d..83ba5ad 100644
--- a/doc/doxygen/output/html/snmp__msg_8h.html
+++ b/doc/doxygen/output/html/snmp__msg_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__netconn_8c.html b/doc/doxygen/output/html/snmp__netconn_8c.html
index 342dd7c..fc78fb5 100644
--- a/doc/doxygen/output/html/snmp__netconn_8c.html
+++ b/doc/doxygen/output/html/snmp__netconn_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__opts_8h.html b/doc/doxygen/output/html/snmp__opts_8h.html
index b73fa17..692b79e 100644
--- a/doc/doxygen/output/html/snmp__opts_8h.html
+++ b/doc/doxygen/output/html/snmp__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__pbuf__stream_8c.html b/doc/doxygen/output/html/snmp__pbuf__stream_8c.html
index 5c2747d..6320f81 100644
--- a/doc/doxygen/output/html/snmp__pbuf__stream_8c.html
+++ b/doc/doxygen/output/html/snmp__pbuf__stream_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__pbuf__stream_8h.html b/doc/doxygen/output/html/snmp__pbuf__stream_8h.html
index 5293f15..05510b0 100644
--- a/doc/doxygen/output/html/snmp__pbuf__stream_8h.html
+++ b/doc/doxygen/output/html/snmp__pbuf__stream_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__raw_8c.html b/doc/doxygen/output/html/snmp__raw_8c.html
index 5597fc7..1880ed5 100644
--- a/doc/doxygen/output/html/snmp__raw_8c.html
+++ b/doc/doxygen/output/html/snmp__raw_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__scalar_8c.html b/doc/doxygen/output/html/snmp__scalar_8c.html
index 33c5157..27196e5 100644
--- a/doc/doxygen/output/html/snmp__scalar_8c.html
+++ b/doc/doxygen/output/html/snmp__scalar_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__scalar_8h.html b/doc/doxygen/output/html/snmp__scalar_8h.html
index 0ad0810..342d539 100644
--- a/doc/doxygen/output/html/snmp__scalar_8h.html
+++ b/doc/doxygen/output/html/snmp__scalar_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__table_8c.html b/doc/doxygen/output/html/snmp__table_8c.html
index 86f6097..0674fe4 100644
--- a/doc/doxygen/output/html/snmp__table_8c.html
+++ b/doc/doxygen/output/html/snmp__table_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__table_8h.html b/doc/doxygen/output/html/snmp__table_8h.html
index 4269e56..380979a 100644
--- a/doc/doxygen/output/html/snmp__table_8h.html
+++ b/doc/doxygen/output/html/snmp__table_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__threadsync_8c.html b/doc/doxygen/output/html/snmp__threadsync_8c.html
index 6fd78e0..0095fcf 100644
--- a/doc/doxygen/output/html/snmp__threadsync_8c.html
+++ b/doc/doxygen/output/html/snmp__threadsync_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__threadsync_8h.html b/doc/doxygen/output/html/snmp__threadsync_8h.html
index 6c609f7..601e73a 100644
--- a/doc/doxygen/output/html/snmp__threadsync_8h.html
+++ b/doc/doxygen/output/html/snmp__threadsync_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmp__traps_8c.html b/doc/doxygen/output/html/snmp__traps_8c.html
index e438311..34c5cdd 100644
--- a/doc/doxygen/output/html/snmp__traps_8c.html
+++ b/doc/doxygen/output/html/snmp__traps_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -124,8 +124,12 @@
 <tr class="separator:gacaf816ff917f7b7e5d00ed6c9f79b51c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga7804a22615bd9b3a323a3f48a9fb8cb7" id="r_ga7804a22615bd9b3a323a3f48a9fb8cb7"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7">snmp_get_auth_traps_enabled</a> (void)</td></tr>
 <tr class="separator:ga7804a22615bd9b3a323a3f48a9fb8cb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga96cc7af0118d75049609872ea41187cd" id="r_ga96cc7af0118d75049609872ea41187cd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd">snmp_send_trap</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *eoid, s32_t generic_trap, s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds)</td></tr>
-<tr class="separator:ga96cc7af0118d75049609872ea41187cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga6d411c0ba7a8fb1ed3777ebde5b5f455" id="r_ga6d411c0ba7a8fb1ed3777ebde5b5f455"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455">snmp_set_default_trap_version</a> (u8_t snmp_version)</td></tr>
+<tr class="separator:ga6d411c0ba7a8fb1ed3777ebde5b5f455"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf6d83aae6464852427a812f573a40359" id="r_gaf6d83aae6464852427a812f573a40359"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359">snmp_get_default_trap_version</a> (void)</td></tr>
+<tr class="separator:gaf6d83aae6464852427a812f573a40359"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga21974b1f6b626bce1e006f09db712e9c" id="r_ga21974b1f6b626bce1e006f09db712e9c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c">snmp_send_trap</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *oid, s32_t generic_trap, s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds)</td></tr>
+<tr class="separator:ga21974b1f6b626bce1e006f09db712e9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga0e044259289cb690197173f93c17607d" id="r_ga0e044259289cb690197173f93c17607d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga0e044259289cb690197173f93c17607d">snmp_send_trap_generic</a> (s32_t generic_trap)</td></tr>
 <tr class="separator:ga0e044259289cb690197173f93c17607d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga56bdce04e9e77cb3f8a872718cd273d1" id="r_ga56bdce04e9e77cb3f8a872718cd273d1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1">snmp_send_trap_specific</a> (s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds)</td></tr>
@@ -134,6 +138,12 @@
 <tr class="separator:gaa8a49d1a6a207740ba44e27b5bbc22be"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaf6d0a95a3a406d8ea00849c07aca05ee" id="r_gaf6d0a95a3a406d8ea00849c07aca05ee"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee">snmp_authfail_trap</a> (void)</td></tr>
 <tr class="separator:gaf6d0a95a3a406d8ea00849c07aca05ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7492bb861ba73923221a8ab49ea79210" id="r_ga7492bb861ba73923221a8ab49ea79210"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210">snmp_send_inform_specific</a> (s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds, s32_t *ptr_request_id)</td></tr>
+<tr class="separator:ga7492bb861ba73923221a8ab49ea79210"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab7e4b943a9758010b02371b876abc275" id="r_gab7e4b943a9758010b02371b876abc275"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275">snmp_send_inform_generic</a> (s32_t generic_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds, s32_t *ptr_request_id)</td></tr>
+<tr class="separator:gab7e4b943a9758010b02371b876abc275"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gae450dd71ad91f6c0bc243493a913f692" id="r_gae450dd71ad91f6c0bc243493a913f692"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692">snmp_send_inform</a> (const struct <a class="el" href="structsnmp__obj__id.html">snmp_obj_id</a> *oid, s32_t generic_trap, s32_t specific_trap, struct <a class="el" href="structsnmp__varbind.html">snmp_varbind</a> *varbinds, s32_t *ptr_request_id)</td></tr>
+<tr class="separator:gae450dd71ad91f6c0bc243493a913f692"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="var-members" name="var-members"></a>
 Variables</h2></td></tr>
@@ -143,7 +153,7 @@
 <tr class="separator:ade16efa80e2c2a20236d3cb96b19c79a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>SNMPv1 traps implementation. </p>
+<div class="textblock"><p>SNMPv1 and SNMPv2 traps implementation. </p>
 </div><h2 class="groupheader">Variable Documentation</h2>
 <a id="a2e2007343d9492b8e31d363d2c6ad79b" name="a2e2007343d9492b8e31d363d2c6ad79b"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a2e2007343d9492b8e31d363d2c6ad79b">&#9670;&#160;</a></span>snmp_community_trap</h2>
diff --git a/doc/doxygen/output/html/snmp__traps_8c.js b/doc/doxygen/output/html/snmp__traps_8c.js
index be7fdd9..f7aa457 100644
--- a/doc/doxygen/output/html/snmp__traps_8c.js
+++ b/doc/doxygen/output/html/snmp__traps_8c.js
@@ -3,10 +3,15 @@
     [ "snmp_authfail_trap", "group__snmp__traps.html#gaf6d0a95a3a406d8ea00849c07aca05ee", null ],
     [ "snmp_coldstart_trap", "group__snmp__traps.html#gaa8a49d1a6a207740ba44e27b5bbc22be", null ],
     [ "snmp_get_auth_traps_enabled", "group__snmp__traps.html#ga7804a22615bd9b3a323a3f48a9fb8cb7", null ],
-    [ "snmp_send_trap", "group__snmp__traps.html#ga96cc7af0118d75049609872ea41187cd", null ],
+    [ "snmp_get_default_trap_version", "group__snmp__traps.html#gaf6d83aae6464852427a812f573a40359", null ],
+    [ "snmp_send_inform", "group__snmp__traps.html#gae450dd71ad91f6c0bc243493a913f692", null ],
+    [ "snmp_send_inform_generic", "group__snmp__traps.html#gab7e4b943a9758010b02371b876abc275", null ],
+    [ "snmp_send_inform_specific", "group__snmp__traps.html#ga7492bb861ba73923221a8ab49ea79210", null ],
+    [ "snmp_send_trap", "group__snmp__traps.html#ga21974b1f6b626bce1e006f09db712e9c", null ],
     [ "snmp_send_trap_generic", "group__snmp__traps.html#ga0e044259289cb690197173f93c17607d", null ],
     [ "snmp_send_trap_specific", "group__snmp__traps.html#ga56bdce04e9e77cb3f8a872718cd273d1", null ],
     [ "snmp_set_auth_traps_enabled", "group__snmp__traps.html#gacaf816ff917f7b7e5d00ed6c9f79b51c", null ],
+    [ "snmp_set_default_trap_version", "group__snmp__traps.html#ga6d411c0ba7a8fb1ed3777ebde5b5f455", null ],
     [ "snmp_trap_dst_enable", "group__snmp__traps.html#gab101505be59778cf0f2f1ac40bcf3f32", null ],
     [ "snmp_trap_dst_ip_set", "group__snmp__traps.html#ga15e4afbf80ed2260850842e6608c6d86", null ],
     [ "snmp_community_trap", "snmp__traps_8c.html#a2e2007343d9492b8e31d363d2c6ad79b", null ],
diff --git a/doc/doxygen/output/html/snmpv3_8c.html b/doc/doxygen/output/html/snmpv3_8c.html
index 5a97170..c7d9657 100644
--- a/doc/doxygen/output/html/snmpv3_8c.html
+++ b/doc/doxygen/output/html/snmpv3_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmpv3_8h.html b/doc/doxygen/output/html/snmpv3_8h.html
index a4cf5a9..ebcf227 100644
--- a/doc/doxygen/output/html/snmpv3_8h.html
+++ b/doc/doxygen/output/html/snmpv3_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmpv3__mbedtls_8c.html b/doc/doxygen/output/html/snmpv3__mbedtls_8c.html
index d6172eb..3d2080e 100644
--- a/doc/doxygen/output/html/snmpv3__mbedtls_8c.html
+++ b/doc/doxygen/output/html/snmpv3__mbedtls_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/snmpv3__priv_8h.html b/doc/doxygen/output/html/snmpv3__priv_8h.html
index f06870e..4742051 100644
--- a/doc/doxygen/output/html/snmpv3__priv_8h.html
+++ b/doc/doxygen/output/html/snmpv3__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/sntp_8c.html b/doc/doxygen/output/html/sntp_8c.html
index a93fa6f..1c3634e 100644
--- a/doc/doxygen/output/html/sntp_8c.html
+++ b/doc/doxygen/output/html/sntp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -151,6 +151,8 @@
 <tr class="separator:ga4fa038dcea66349fafdbe1cc3e52ff3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gab114c12154cf2c3e3a733724c6a77429" id="r_gab114c12154cf2c3e3a733724c6a77429"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#gab114c12154cf2c3e3a733724c6a77429">sntp_getserver</a> (u8_t idx)</td></tr>
 <tr class="separator:gab114c12154cf2c3e3a733724c6a77429"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga68146d2ee1bba10e5aa01f098b597d9e" id="r_ga68146d2ee1bba10e5aa01f098b597d9e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e">sntp_getkodreceived</a> (u8_t idx)</td></tr>
+<tr class="separator:ga68146d2ee1bba10e5aa01f098b597d9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>SNTP client module </p>
diff --git a/doc/doxygen/output/html/sntp_8c.js b/doc/doxygen/output/html/sntp_8c.js
index ecaa2f2..d3b6409 100644
--- a/doc/doxygen/output/html/sntp_8c.js
+++ b/doc/doxygen/output/html/sntp_8c.js
@@ -6,6 +6,7 @@
     [ "sntp_server", "structsntp__server.html", "structsntp__server" ],
     [ "SNTP_FRAC_TO_US", "sntp_8c.html#aebe74c93643ac9b8c8a9c7d223192c8f", null ],
     [ "sntp_enabled", "group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5", null ],
+    [ "sntp_getkodreceived", "group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e", null ],
     [ "sntp_getoperatingmode", "group__sntp.html#gae66404a551d5cef420cf844a71356fae", null ],
     [ "sntp_getreachability", "group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e", null ],
     [ "sntp_getserver", "group__sntp.html#gab114c12154cf2c3e3a733724c6a77429", null ],
diff --git a/doc/doxygen/output/html/sntp_8h.html b/doc/doxygen/output/html/sntp_8h.html
index dd19f0e..b76aae4 100644
--- a/doc/doxygen/output/html/sntp_8h.html
+++ b/doc/doxygen/output/html/sntp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -121,6 +121,8 @@
 <tr class="separator:ga4fa038dcea66349fafdbe1cc3e52ff3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gab114c12154cf2c3e3a733724c6a77429" id="r_gab114c12154cf2c3e3a733724c6a77429"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#gab114c12154cf2c3e3a733724c6a77429">sntp_getserver</a> (u8_t idx)</td></tr>
 <tr class="separator:gab114c12154cf2c3e3a733724c6a77429"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga68146d2ee1bba10e5aa01f098b597d9e" id="r_ga68146d2ee1bba10e5aa01f098b597d9e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e">sntp_getkodreceived</a> (u8_t idx)</td></tr>
+<tr class="separator:ga68146d2ee1bba10e5aa01f098b597d9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gac8097829a81cb6f37d9acf8efb2cc82e" id="r_gac8097829a81cb6f37d9acf8efb2cc82e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e">sntp_getreachability</a> (u8_t idx)</td></tr>
 <tr class="separator:gac8097829a81cb6f37d9acf8efb2cc82e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
diff --git a/doc/doxygen/output/html/sntp_8h.js b/doc/doxygen/output/html/sntp_8h.js
index 03d26a1..99b20fc 100644
--- a/doc/doxygen/output/html/sntp_8h.js
+++ b/doc/doxygen/output/html/sntp_8h.js
@@ -1,6 +1,7 @@
 var sntp_8h =
 [
     [ "sntp_enabled", "group__sntp.html#ga3fe5254e5a056fca80802d9f26b9c3c5", null ],
+    [ "sntp_getkodreceived", "group__sntp.html#ga68146d2ee1bba10e5aa01f098b597d9e", null ],
     [ "sntp_getoperatingmode", "group__sntp.html#gae66404a551d5cef420cf844a71356fae", null ],
     [ "sntp_getreachability", "group__sntp.html#gac8097829a81cb6f37d9acf8efb2cc82e", null ],
     [ "sntp_getserver", "group__sntp.html#gab114c12154cf2c3e3a733724c6a77429", null ],
diff --git a/doc/doxygen/output/html/sntp__opts_8h.html b/doc/doxygen/output/html/sntp__opts_8h.html
index 0d23800..2dedb8a 100644
--- a/doc/doxygen/output/html/sntp__opts_8h.html
+++ b/doc/doxygen/output/html/sntp__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/socket_8h.html b/doc/doxygen/output/html/socket_8h.html
index a13488d..53b4721 100644
--- a/doc/doxygen/output/html/socket_8h.html
+++ b/doc/doxygen/output/html/socket_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/sockets_8c.html b/doc/doxygen/output/html/sockets_8c.html
index 1b7aa90..dcc36b8 100644
--- a/doc/doxygen/output/html/sockets_8c.html
+++ b/doc/doxygen/output/html/sockets_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/sockets_8h.html b/doc/doxygen/output/html/sockets_8h.html
index 90ff661..45f57c6 100644
--- a/doc/doxygen/output/html/sockets_8h.html
+++ b/doc/doxygen/output/html/sockets_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/sockets__priv_8h.html b/doc/doxygen/output/html/sockets__priv_8h.html
index 45f8457..8fd3a2c 100644
--- a/doc/doxygen/output/html/sockets__priv_8h.html
+++ b/doc/doxygen/output/html/sockets__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/stats_8c.html b/doc/doxygen/output/html/stats_8c.html
index f805b92..c1bbe41 100644
--- a/doc/doxygen/output/html/stats_8c.html
+++ b/doc/doxygen/output/html/stats_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/stats_8h.html b/doc/doxygen/output/html/stats_8h.html
index 8b32103..d8cfa21 100644
--- a/doc/doxygen/output/html/stats_8h.html
+++ b/doc/doxygen/output/html/stats_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/struct__lwiperf__settings.html b/doc/doxygen/output/html/struct__lwiperf__settings.html
index 242f662..d72c1f8 100644
--- a/doc/doxygen/output/html/struct__lwiperf__settings.html
+++ b/doc/doxygen/output/html/struct__lwiperf__settings.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/struct__lwiperf__state__tcp.html b/doc/doxygen/output/html/struct__lwiperf__state__tcp.html
index 974841c..a5c8bd6 100644
--- a/doc/doxygen/output/html/struct__lwiperf__state__tcp.html
+++ b/doc/doxygen/output/html/struct__lwiperf__state__tcp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structacd.html b/doc/doxygen/output/html/structacd.html
new file mode 100644
index 0000000..cf49176
--- /dev/null
+++ b/doc/doxygen/output/html/structacd.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: acd Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('structacd.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle"><div class="title">acd Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;acd.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aa14c2b88cd471839d5b5de80bb46a9aa" id="r_aa14c2b88cd471839d5b5de80bb46a9aa"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structacd.html">acd</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa14c2b88cd471839d5b5de80bb46a9aa">next</a></td></tr>
+<tr class="separator:aa14c2b88cd471839d5b5de80bb46a9aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2c795ee5b09085bca592d830a388448" id="r_af2c795ee5b09085bca592d830a388448"><td class="memItemLeft" align="right" valign="top"><a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af2c795ee5b09085bca592d830a388448">ipaddr</a></td></tr>
+<tr class="separator:af2c795ee5b09085bca592d830a388448"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb" id="r_a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb"><td class="memItemLeft" align="right" valign="top">acd_state_enum_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb">state</a></td></tr>
+<tr class="separator:a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ab002648d338ae33ffd3829e23703cb" id="r_a4ab002648d338ae33ffd3829e23703cb"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a4ab002648d338ae33ffd3829e23703cb">sent_num</a></td></tr>
+<tr class="separator:a4ab002648d338ae33ffd3829e23703cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aabde1967e37d685b19b9701af641a97c" id="r_aabde1967e37d685b19b9701af641a97c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aabde1967e37d685b19b9701af641a97c">ttw</a></td></tr>
+<tr class="separator:aabde1967e37d685b19b9701af641a97c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9dd4e1b82dd3e97717f011dbf862a58e" id="r_a9dd4e1b82dd3e97717f011dbf862a58e"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9dd4e1b82dd3e97717f011dbf862a58e">lastconflict</a></td></tr>
+<tr class="separator:a9dd4e1b82dd3e97717f011dbf862a58e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab40b6b3cf57634135753f2426207f84a" id="r_ab40b6b3cf57634135753f2426207f84a"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab40b6b3cf57634135753f2426207f84a">num_conflicts</a></td></tr>
+<tr class="separator:ab40b6b3cf57634135753f2426207f84a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a03aa687716055a4f75f6e5e380e46e" id="r_a3a03aa687716055a4f75f6e5e380e46e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="acd_8h.html#abb446404752f56b028eafa8302db955f">acd_conflict_callback_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a3a03aa687716055a4f75f6e5e380e46e">acd_conflict_callback</a></td></tr>
+<tr class="separator:a3a03aa687716055a4f75f6e5e380e46e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>ACD state information per netif </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a3a03aa687716055a4f75f6e5e380e46e" name="a3a03aa687716055a4f75f6e5e380e46e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a03aa687716055a4f75f6e5e380e46e">&#9670;&#160;</a></span>acd_conflict_callback</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="acd_8h.html#abb446404752f56b028eafa8302db955f">acd_conflict_callback_t</a> acd::acd_conflict_callback</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>callback function -&gt; let's the acd user know if the address is good or if a conflict is detected </p>
+
+</div>
+</div>
+<a id="af2c795ee5b09085bca592d830a388448" name="af2c795ee5b09085bca592d830a388448"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2c795ee5b09085bca592d830a388448">&#9670;&#160;</a></span>ipaddr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="ip4__addr_8h.html#a3d3b45daffbc15d65da236e31e621b7e">ip4_addr_t</a> acd::ipaddr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>the currently selected, probed, announced or used IP-Address </p>
+
+</div>
+</div>
+<a id="a9dd4e1b82dd3e97717f011dbf862a58e" name="a9dd4e1b82dd3e97717f011dbf862a58e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9dd4e1b82dd3e97717f011dbf862a58e">&#9670;&#160;</a></span>lastconflict</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t acd::lastconflict</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ticks until a conflict can again be solved by defending </p>
+
+</div>
+</div>
+<a id="aa14c2b88cd471839d5b5de80bb46a9aa" name="aa14c2b88cd471839d5b5de80bb46a9aa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa14c2b88cd471839d5b5de80bb46a9aa">&#9670;&#160;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structacd.html">acd</a>* acd::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>next acd module </p>
+
+</div>
+</div>
+<a id="ab40b6b3cf57634135753f2426207f84a" name="ab40b6b3cf57634135753f2426207f84a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab40b6b3cf57634135753f2426207f84a">&#9670;&#160;</a></span>num_conflicts</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t acd::num_conflicts</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>total number of probed/used IP-Addresses that resulted in a conflict </p>
+
+</div>
+</div>
+<a id="a4ab002648d338ae33ffd3829e23703cb" name="a4ab002648d338ae33ffd3829e23703cb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ab002648d338ae33ffd3829e23703cb">&#9670;&#160;</a></span>sent_num</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t acd::sent_num</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>sent number of probes or announces, dependent on state </p>
+
+</div>
+</div>
+<a id="a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb" name="a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb">&#9670;&#160;</a></span>state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">acd_state_enum_t acd::state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>current ACD state machine state </p>
+
+</div>
+</div>
+<a id="aabde1967e37d685b19b9701af641a97c" name="aabde1967e37d685b19b9701af641a97c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aabde1967e37d685b19b9701af641a97c">&#9670;&#160;</a></span>ttw</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t acd::ttw</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>ticks to wait, tick is ACD_TMR_INTERVAL long </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="acd_8h.html">acd.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="structacd.html">acd</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structacd.js b/doc/doxygen/output/html/structacd.js
new file mode 100644
index 0000000..310baea
--- /dev/null
+++ b/doc/doxygen/output/html/structacd.js
@@ -0,0 +1,11 @@
+var structacd =
+[
+    [ "acd_conflict_callback", "structacd.html#a3a03aa687716055a4f75f6e5e380e46e", null ],
+    [ "ipaddr", "structacd.html#af2c795ee5b09085bca592d830a388448", null ],
+    [ "lastconflict", "structacd.html#a9dd4e1b82dd3e97717f011dbf862a58e", null ],
+    [ "next", "structacd.html#aa14c2b88cd471839d5b5de80bb46a9aa", null ],
+    [ "num_conflicts", "structacd.html#ab40b6b3cf57634135753f2426207f84a", null ],
+    [ "sent_num", "structacd.html#a4ab002648d338ae33ffd3829e23703cb", null ],
+    [ "state", "structacd.html#a4eb0fe6d6f5dbc49b6b9b8bb5aa214bb", null ],
+    [ "ttw", "structacd.html#aabde1967e37d685b19b9701af641a97c", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structaltcp__allocator__s.html b/doc/doxygen/output/html/structaltcp__allocator__s.html
new file mode 100644
index 0000000..85e34e8
--- /dev/null
+++ b/doc/doxygen/output/html/structaltcp__allocator__s.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: altcp_allocator_s Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('structaltcp__allocator__s.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle"><div class="title">altcp_allocator_s Struct Reference<div class="ingroups"><a class="el" href="group__api.html">APIs</a> &raquo; <a class="el" href="group__callbackstyle__api.html">&quot;raw&quot; APIs</a> &raquo; <a class="el" href="group__altcp__api.html">Application layered TCP Introduction</a> &raquo; <a class="el" href="group__altcp.html">Application layered TCP Functions</a></div></div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;altcp.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aaf07ebf181a11d0320381ef46d40e687" id="r_aaf07ebf181a11d0320381ef46d40e687"><td class="memItemLeft" align="right" valign="top">altcp_new_fn&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aaf07ebf181a11d0320381ef46d40e687">alloc</a></td></tr>
+<tr class="separator:aaf07ebf181a11d0320381ef46d40e687"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d8aa48e9a105e9d25ad4b90d259d0b1" id="r_a8d8aa48e9a105e9d25ad4b90d259d0b1"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8d8aa48e9a105e9d25ad4b90d259d0b1">arg</a></td></tr>
+<tr class="separator:a8d8aa48e9a105e9d25ad4b90d259d0b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Struct containing an allocator and its state. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="aaf07ebf181a11d0320381ef46d40e687" name="aaf07ebf181a11d0320381ef46d40e687"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf07ebf181a11d0320381ef46d40e687">&#9670;&#160;</a></span>alloc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">altcp_new_fn altcp_allocator_s::alloc</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Allocator function </p>
+
+</div>
+</div>
+<a id="a8d8aa48e9a105e9d25ad4b90d259d0b1" name="a8d8aa48e9a105e9d25ad4b90d259d0b1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d8aa48e9a105e9d25ad4b90d259d0b1">&#9670;&#160;</a></span>arg</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* altcp_allocator_s::arg</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Argument to allocator function </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/<a class="el" href="altcp_8h.html">altcp.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="structaltcp__allocator__s.html">altcp_allocator_s</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structaltcp__allocator__s.js b/doc/doxygen/output/html/structaltcp__allocator__s.js
new file mode 100644
index 0000000..e28e5a9
--- /dev/null
+++ b/doc/doxygen/output/html/structaltcp__allocator__s.js
@@ -0,0 +1,5 @@
+var structaltcp__allocator__s =
+[
+    [ "alloc", "structaltcp__allocator__s.html#aaf07ebf181a11d0320381ef46d40e687", null ],
+    [ "arg", "structaltcp__allocator__s.html#a8d8aa48e9a105e9d25ad4b90d259d0b1", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structapi__msg.html b/doc/doxygen/output/html/structapi__msg.html
index fdfd61f..fc99d1b 100644
--- a/doc/doxygen/output/html/structapi__msg.html
+++ b/doc/doxygen/output/html/structapi__msg.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -111,56 +111,56 @@
 <tr class="separator:abec5e33802d69f1b601543d60699f028"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a8c66bd95217fa627f13f2f0847bbb25f" id="r_a8c66bd95217fa627f13f2f0847bbb25f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8c66bd95217fa627f13f2f0847bbb25f">err</a></td></tr>
 <tr class="separator:a8c66bd95217fa627f13f2f0847bbb25f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a01eaa41b1bbdc92e78ba3712d28cb613" id="r_a01eaa41b1bbdc92e78ba3712d28cb613"><td class="memItemLeft" >union {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="memitem:a7c67466a08e96f57f5cc8a41beb883b3" id="r_a7c67466a08e96f57f5cc8a41beb883b3"><td class="memItemLeft" >union {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a4b3f4b921f7d95aace6d59656f6423d5" id="r_a4b3f4b921f7d95aace6d59656f6423d5"><td class="memItemLeft" >&#160;&#160;&#160;struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;&#160;&#160;<a class="el" href="#ab0abd60527e96cc24c2c20c835cdac05">b</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a4b3f4b921f7d95aace6d59656f6423d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac607492a18e5e60e0ca13bf0a0e1bc58" id="r_ac607492a18e5e60e0ca13bf0a0e1bc58"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a46007ce4f08d3e396f068ab80c9a9ae1"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac607492a18e5e60e0ca13bf0a0e1bc58" id="r_ac607492a18e5e60e0ca13bf0a0e1bc58"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a46007ce4f08d3e396f068ab80c9a9ae1">n</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:ac607492a18e5e60e0ca13bf0a0e1bc58"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac4fee57135784aa018a94338189cee38" id="r_ac4fee57135784aa018a94338189cee38"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a87ce87e5931c8f748293946d3b250791"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac4fee57135784aa018a94338189cee38" id="r_ac4fee57135784aa018a94338189cee38"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a87ce87e5931c8f748293946d3b250791">bc</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:ac4fee57135784aa018a94338189cee38"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a535bab1259b67cf7203ddf539a9be0bf" id="r_a535bab1259b67cf7203ddf539a9be0bf"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:af9817721045b7ebe98ad484730e5e9cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a535bab1259b67cf7203ddf539a9be0bf" id="r_a535bab1259b67cf7203ddf539a9be0bf"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#af9817721045b7ebe98ad484730e5e9cc">ad</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a535bab1259b67cf7203ddf539a9be0bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a993c7bb19428680b40a6c9003f177a91" id="r_a993c7bb19428680b40a6c9003f177a91"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:ac0637c6f4dbb3f64f95d5181d55e663c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a20e17a02c95bf44d80a92aaf3a8bf95e" id="r_a20e17a02c95bf44d80a92aaf3a8bf95e"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;const struct <a class="el" href="structnetvector.html">netvector</a> *&#160;&#160;&#160;<a class="el" href="#a1ceb9822ba49ba439e30d98492593612">vector</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a20e17a02c95bf44d80a92aaf3a8bf95e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a96c09ae2234151a29c3f6a4a9aa16a53" id="r_a96c09ae2234151a29c3f6a4a9aa16a53"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;u16_t&#160;&#160;&#160;<a class="el" href="#ab6f14157a3e6735b69a569249d3286a2">vector_cnt</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a96c09ae2234151a29c3f6a4a9aa16a53"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:afa1b53759c1b1a4b27ca3d2aa4395443" id="r_afa1b53759c1b1a4b27ca3d2aa4395443"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;size_t&#160;&#160;&#160;<a class="el" href="#a6896ae78ebddefdf2d8358ab5f21f444">vector_off</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:afa1b53759c1b1a4b27ca3d2aa4395443"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa117e5e841efeedc4a904e1e92d69700" id="r_aa117e5e841efeedc4a904e1e92d69700"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;size_t&#160;&#160;&#160;<a class="el" href="#a40624c398d1939bfee54bffa708a363e">len</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:aa117e5e841efeedc4a904e1e92d69700"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a756b5c1fec59e5cc4a9f7394b5f1676f" id="r_a756b5c1fec59e5cc4a9f7394b5f1676f"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;size_t&#160;&#160;&#160;<a class="el" href="#a4bd9382dd42b18120803e246a0203353">offset</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a756b5c1fec59e5cc4a9f7394b5f1676f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a993c7bb19428680b40a6c9003f177a91" id="r_a993c7bb19428680b40a6c9003f177a91"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#ac0637c6f4dbb3f64f95d5181d55e663c">w</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a993c7bb19428680b40a6c9003f177a91"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a755be88af2f7b540e2f573080ec1c29e" id="r_a755be88af2f7b540e2f573080ec1c29e"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a50e8d6dfa0ba30ae7e39c336bf68742c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a755be88af2f7b540e2f573080ec1c29e" id="r_a755be88af2f7b540e2f573080ec1c29e"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a50e8d6dfa0ba30ae7e39c336bf68742c">r</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a755be88af2f7b540e2f573080ec1c29e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a120c7b556d51249b5785d1399da66031" id="r_a120c7b556d51249b5785d1399da66031"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a5aa22dbd74fd7ba2fa5eb8bc8aae529f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a120c7b556d51249b5785d1399da66031" id="r_a120c7b556d51249b5785d1399da66031"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a5aa22dbd74fd7ba2fa5eb8bc8aae529f">sd</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a120c7b556d51249b5785d1399da66031"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5fe967f1dab150df2b7412ef0ffc56f3" id="r_a5fe967f1dab150df2b7412ef0ffc56f3"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:aa3d64205c25e953b168447e6aa21ee9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5fe967f1dab150df2b7412ef0ffc56f3" id="r_a5fe967f1dab150df2b7412ef0ffc56f3"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#aa3d64205c25e953b168447e6aa21ee9e">jl</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a5fe967f1dab150df2b7412ef0ffc56f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a01eaa41b1bbdc92e78ba3712d28cb613" id="r_a01eaa41b1bbdc92e78ba3712d28cb613"><td class="memItemLeft" valign="top">}&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a01eaa41b1bbdc92e78ba3712d28cb613">msg</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
-<tr class="separator:a01eaa41b1bbdc92e78ba3712d28cb613"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13b5fc928123f4e4e7f44aa809ae6dc8" id="r_a13b5fc928123f4e4e7f44aa809ae6dc8"><td class="memItemLeft" >&#160;&#160;&#160;struct <a class="el" href="structnetbuf.html">netbuf</a> *&#160;&#160;&#160;<a class="el" href="#ab0abd60527e96cc24c2c20c835cdac05">b</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a13b5fc928123f4e4e7f44aa809ae6dc8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3b859d2de66c6bb9a38c18de7c37267" id="r_ae3b859d2de66c6bb9a38c18de7c37267"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a9b0c707835838c2ffe55b85c2902d7ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3b859d2de66c6bb9a38c18de7c37267" id="r_ae3b859d2de66c6bb9a38c18de7c37267"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a9b0c707835838c2ffe55b85c2902d7ad">n</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:ae3b859d2de66c6bb9a38c18de7c37267"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75dc273750876c92beb45f42553f8599" id="r_a75dc273750876c92beb45f42553f8599"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a8e600d95eb044f8f7dc9ff921aaa05b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75dc273750876c92beb45f42553f8599" id="r_a75dc273750876c92beb45f42553f8599"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a8e600d95eb044f8f7dc9ff921aaa05b1">bc</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a75dc273750876c92beb45f42553f8599"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a37204cd863cb06301f2e0f92d45fd091" id="r_a37204cd863cb06301f2e0f92d45fd091"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a1831a18bdfe88ca89a773fc477966894"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a37204cd863cb06301f2e0f92d45fd091" id="r_a37204cd863cb06301f2e0f92d45fd091"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a1831a18bdfe88ca89a773fc477966894">ad</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a37204cd863cb06301f2e0f92d45fd091"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d5e8e30c36aa0d11e82a10107e476d0" id="r_a1d5e8e30c36aa0d11e82a10107e476d0"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a0abfc9bda0b00554628bc3169d8f21bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1690d70d3ca8fbc159c123c036ee480" id="r_af1690d70d3ca8fbc159c123c036ee480"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;const struct <a class="el" href="structnetvector.html">netvector</a> *&#160;&#160;&#160;<a class="el" href="#a1ceb9822ba49ba439e30d98492593612">vector</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:af1690d70d3ca8fbc159c123c036ee480"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad11f0d586e1239be6410e2296cf8b8ea" id="r_ad11f0d586e1239be6410e2296cf8b8ea"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;u16_t&#160;&#160;&#160;<a class="el" href="#ab6f14157a3e6735b69a569249d3286a2">vector_cnt</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:ad11f0d586e1239be6410e2296cf8b8ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d13b92627931cac75ea70f4806253f5" id="r_a2d13b92627931cac75ea70f4806253f5"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;size_t&#160;&#160;&#160;<a class="el" href="#a6896ae78ebddefdf2d8358ab5f21f444">vector_off</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a2d13b92627931cac75ea70f4806253f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad1c5e0fcde8950af74340784a9cd7d10" id="r_ad1c5e0fcde8950af74340784a9cd7d10"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;size_t&#160;&#160;&#160;<a class="el" href="#a40624c398d1939bfee54bffa708a363e">len</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:ad1c5e0fcde8950af74340784a9cd7d10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d9e7391b96c30a3557008ea8c5673f9" id="r_a9d9e7391b96c30a3557008ea8c5673f9"><td class="memItemLeft" >&#160;&#160;&#160;&#160;&#160;&#160;size_t&#160;&#160;&#160;<a class="el" href="#a4bd9382dd42b18120803e246a0203353">offset</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a9d9e7391b96c30a3557008ea8c5673f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d5e8e30c36aa0d11e82a10107e476d0" id="r_a1d5e8e30c36aa0d11e82a10107e476d0"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a0abfc9bda0b00554628bc3169d8f21bf">w</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a1d5e8e30c36aa0d11e82a10107e476d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae7bedfc1158bc112b8954712f5411d2" id="r_aae7bedfc1158bc112b8954712f5411d2"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:adbb33e03089db527b0af7e4b22f04e1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae7bedfc1158bc112b8954712f5411d2" id="r_aae7bedfc1158bc112b8954712f5411d2"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#adbb33e03089db527b0af7e4b22f04e1c">r</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:aae7bedfc1158bc112b8954712f5411d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33843f8fef060f8247719d47613c5576" id="r_a33843f8fef060f8247719d47613c5576"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a8644758cd55e0891e43717711ae7b03b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33843f8fef060f8247719d47613c5576" id="r_a33843f8fef060f8247719d47613c5576"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a8644758cd55e0891e43717711ae7b03b">sd</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a33843f8fef060f8247719d47613c5576"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84897bc7a7dce399130fba13975108a8" id="r_a84897bc7a7dce399130fba13975108a8"><td class="memItemLeft" >&#160;&#160;&#160;struct {&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a718b0166a9956c608188e8f99c663203"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84897bc7a7dce399130fba13975108a8" id="r_a84897bc7a7dce399130fba13975108a8"><td class="memItemLeft" valign="top">&#160;&#160;&#160;}&#160;&#160;&#160;<a class="el" href="#a718b0166a9956c608188e8f99c663203">jl</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a84897bc7a7dce399130fba13975108a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c67466a08e96f57f5cc8a41beb883b3" id="r_a7c67466a08e96f57f5cc8a41beb883b3"><td class="memItemLeft" valign="top">}&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7c67466a08e96f57f5cc8a41beb883b3">msg</a>&#160;</td><td class="memItemRight" valign="bottom"></td></tr>
+<tr class="separator:a7c67466a08e96f57f5cc8a41beb883b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>This struct includes everything that is necessary to execute a function for a netconn in another thread context (mainly used to process netconns in the tcpip_thread context to be thread safe). </p>
 </div><h2 class="groupheader">Field Documentation</h2>
-<a id="af9817721045b7ebe98ad484730e5e9cc" name="af9817721045b7ebe98ad484730e5e9cc"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#af9817721045b7ebe98ad484730e5e9cc">&#9670;&#160;</a></span>[struct]</h2>
+<a id="a1831a18bdfe88ca89a773fc477966894" name="a1831a18bdfe88ca89a773fc477966894"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1831a18bdfe88ca89a773fc477966894">&#9670;&#160;</a></span>[struct]</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -189,8 +189,8 @@
 
 </div>
 </div>
-<a id="a87ce87e5931c8f748293946d3b250791" name="a87ce87e5931c8f748293946d3b250791"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a87ce87e5931c8f748293946d3b250791">&#9670;&#160;</a></span>[struct]</h2>
+<a id="a8e600d95eb044f8f7dc9ff921aaa05b1" name="a8e600d95eb044f8f7dc9ff921aaa05b1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8e600d95eb044f8f7dc9ff921aaa05b1">&#9670;&#160;</a></span>[struct]</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -234,8 +234,8 @@
 
 </div>
 </div>
-<a id="aa3d64205c25e953b168447e6aa21ee9e" name="aa3d64205c25e953b168447e6aa21ee9e"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aa3d64205c25e953b168447e6aa21ee9e">&#9670;&#160;</a></span>[struct]</h2>
+<a id="a718b0166a9956c608188e8f99c663203" name="a718b0166a9956c608188e8f99c663203"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a718b0166a9956c608188e8f99c663203">&#9670;&#160;</a></span>[struct]</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -264,8 +264,8 @@
 
 </div>
 </div>
-<a id="a01eaa41b1bbdc92e78ba3712d28cb613" name="a01eaa41b1bbdc92e78ba3712d28cb613"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a01eaa41b1bbdc92e78ba3712d28cb613">&#9670;&#160;</a></span>[union]</h2>
+<a id="a7c67466a08e96f57f5cc8a41beb883b3" name="a7c67466a08e96f57f5cc8a41beb883b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7c67466a08e96f57f5cc8a41beb883b3">&#9670;&#160;</a></span>[union]</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -279,8 +279,8 @@
 
 </div>
 </div>
-<a id="a46007ce4f08d3e396f068ab80c9a9ae1" name="a46007ce4f08d3e396f068ab80c9a9ae1"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a46007ce4f08d3e396f068ab80c9a9ae1">&#9670;&#160;</a></span>[struct]</h2>
+<a id="a9b0c707835838c2ffe55b85c2902d7ad" name="a9b0c707835838c2ffe55b85c2902d7ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9b0c707835838c2ffe55b85c2902d7ad">&#9670;&#160;</a></span>[struct]</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -309,8 +309,8 @@
 
 </div>
 </div>
-<a id="a50e8d6dfa0ba30ae7e39c336bf68742c" name="a50e8d6dfa0ba30ae7e39c336bf68742c"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a50e8d6dfa0ba30ae7e39c336bf68742c">&#9670;&#160;</a></span>[struct]</h2>
+<a id="adbb33e03089db527b0af7e4b22f04e1c" name="adbb33e03089db527b0af7e4b22f04e1c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbb33e03089db527b0af7e4b22f04e1c">&#9670;&#160;</a></span>[struct]</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -324,8 +324,8 @@
 
 </div>
 </div>
-<a id="a5aa22dbd74fd7ba2fa5eb8bc8aae529f" name="a5aa22dbd74fd7ba2fa5eb8bc8aae529f"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a5aa22dbd74fd7ba2fa5eb8bc8aae529f">&#9670;&#160;</a></span>[struct]</h2>
+<a id="a8644758cd55e0891e43717711ae7b03b" name="a8644758cd55e0891e43717711ae7b03b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8644758cd55e0891e43717711ae7b03b">&#9670;&#160;</a></span>[struct]</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -384,8 +384,8 @@
 
 </div>
 </div>
-<a id="ac0637c6f4dbb3f64f95d5181d55e663c" name="ac0637c6f4dbb3f64f95d5181d55e663c"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ac0637c6f4dbb3f64f95d5181d55e663c">&#9670;&#160;</a></span>[struct]</h2>
+<a id="a0abfc9bda0b00554628bc3169d8f21bf" name="a0abfc9bda0b00554628bc3169d8f21bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0abfc9bda0b00554628bc3169d8f21bf">&#9670;&#160;</a></span>[struct]</h2>
 
 <div class="memitem">
 <div class="memproto">
diff --git a/doc/doxygen/output/html/structapi__msg.js b/doc/doxygen/output/html/structapi__msg.js
index 341bcee..76cb288 100644
--- a/doc/doxygen/output/html/structapi__msg.js
+++ b/doc/doxygen/output/html/structapi__msg.js
@@ -1,19 +1,19 @@
 var structapi__msg =
 [
-    [ "ad", "structapi__msg.html#af9817721045b7ebe98ad484730e5e9cc", null ],
+    [ "ad", "structapi__msg.html#a1831a18bdfe88ca89a773fc477966894", null ],
     [ "b", "structapi__msg.html#ab0abd60527e96cc24c2c20c835cdac05", null ],
-    [ "bc", "structapi__msg.html#a87ce87e5931c8f748293946d3b250791", null ],
+    [ "bc", "structapi__msg.html#a8e600d95eb044f8f7dc9ff921aaa05b1", null ],
     [ "conn", "structapi__msg.html#abec5e33802d69f1b601543d60699f028", null ],
     [ "err", "structapi__msg.html#a8c66bd95217fa627f13f2f0847bbb25f", null ],
-    [ "jl", "structapi__msg.html#aa3d64205c25e953b168447e6aa21ee9e", null ],
+    [ "jl", "structapi__msg.html#a718b0166a9956c608188e8f99c663203", null ],
     [ "len", "structapi__msg.html#a40624c398d1939bfee54bffa708a363e", null ],
-    [ "msg", "structapi__msg.html#a01eaa41b1bbdc92e78ba3712d28cb613", null ],
-    [ "n", "structapi__msg.html#a46007ce4f08d3e396f068ab80c9a9ae1", null ],
+    [ "msg", "structapi__msg.html#a7c67466a08e96f57f5cc8a41beb883b3", null ],
+    [ "n", "structapi__msg.html#a9b0c707835838c2ffe55b85c2902d7ad", null ],
     [ "offset", "structapi__msg.html#a4bd9382dd42b18120803e246a0203353", null ],
-    [ "r", "structapi__msg.html#a50e8d6dfa0ba30ae7e39c336bf68742c", null ],
-    [ "sd", "structapi__msg.html#a5aa22dbd74fd7ba2fa5eb8bc8aae529f", null ],
+    [ "r", "structapi__msg.html#adbb33e03089db527b0af7e4b22f04e1c", null ],
+    [ "sd", "structapi__msg.html#a8644758cd55e0891e43717711ae7b03b", null ],
     [ "vector", "structapi__msg.html#a1ceb9822ba49ba439e30d98492593612", null ],
     [ "vector_cnt", "structapi__msg.html#ab6f14157a3e6735b69a569249d3286a2", null ],
     [ "vector_off", "structapi__msg.html#a6896ae78ebddefdf2d8358ab5f21f444", null ],
-    [ "w", "structapi__msg.html#ac0637c6f4dbb3f64f95d5181d55e663c", null ]
+    [ "w", "structapi__msg.html#a0abfc9bda0b00554628bc3169d8f21bf", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structautoip.html b/doc/doxygen/output/html/structautoip.html
index e4eaebf..ea7c544 100644
--- a/doc/doxygen/output/html/structautoip.html
+++ b/doc/doxygen/output/html/structautoip.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -111,30 +111,26 @@
 <tr class="separator:a13b5da8a86839b4cd9bd9f5400ac9dc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a51af55190548e378e310aeaddfa1fdef" id="r_a51af55190548e378e310aeaddfa1fdef"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a51af55190548e378e310aeaddfa1fdef">state</a></td></tr>
 <tr class="separator:a51af55190548e378e310aeaddfa1fdef"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9d3e3bab2f12b7c7283177fbf039fb25" id="r_a9d3e3bab2f12b7c7283177fbf039fb25"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9d3e3bab2f12b7c7283177fbf039fb25">sent_num</a></td></tr>
-<tr class="separator:a9d3e3bab2f12b7c7283177fbf039fb25"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a7510d9a2961ea7c28ebfcde6390284bf" id="r_a7510d9a2961ea7c28ebfcde6390284bf"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7510d9a2961ea7c28ebfcde6390284bf">ttw</a></td></tr>
-<tr class="separator:a7510d9a2961ea7c28ebfcde6390284bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a2f51d8cde73e20d6e0ae3ec8053afb55" id="r_a2f51d8cde73e20d6e0ae3ec8053afb55"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2f51d8cde73e20d6e0ae3ec8053afb55">lastconflict</a></td></tr>
-<tr class="separator:a2f51d8cde73e20d6e0ae3ec8053afb55"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a472f3d18c07b3df024a0cde8f4ffa853" id="r_a472f3d18c07b3df024a0cde8f4ffa853"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a472f3d18c07b3df024a0cde8f4ffa853">tried_llipaddr</a></td></tr>
 <tr class="separator:a472f3d18c07b3df024a0cde8f4ffa853"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1965250cda881d229e2a1fe146a0bb9e" id="r_a1965250cda881d229e2a1fe146a0bb9e"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structacd.html">acd</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1965250cda881d229e2a1fe146a0bb9e">acd</a></td></tr>
+<tr class="separator:a1965250cda881d229e2a1fe146a0bb9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>AutoIP state information per netif </p>
 </div><h2 class="groupheader">Field Documentation</h2>
-<a id="a2f51d8cde73e20d6e0ae3ec8053afb55" name="a2f51d8cde73e20d6e0ae3ec8053afb55"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a2f51d8cde73e20d6e0ae3ec8053afb55">&#9670;&#160;</a></span>lastconflict</h2>
+<a id="a1965250cda881d229e2a1fe146a0bb9e" name="a1965250cda881d229e2a1fe146a0bb9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1965250cda881d229e2a1fe146a0bb9e">&#9670;&#160;</a></span>acd</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">u8_t autoip::lastconflict</td>
+          <td class="memname">struct <a class="el" href="structacd.html">acd</a> autoip::acd</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>ticks until a conflict can be solved by defending </p>
+<p>acd struct </p>
 
 </div>
 </div>
@@ -153,21 +149,6 @@
 
 </div>
 </div>
-<a id="a9d3e3bab2f12b7c7283177fbf039fb25" name="a9d3e3bab2f12b7c7283177fbf039fb25"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a9d3e3bab2f12b7c7283177fbf039fb25">&#9670;&#160;</a></span>sent_num</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u8_t autoip::sent_num</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>sent number of probes or announces, dependent on state </p>
-
-</div>
-</div>
 <a id="a51af55190548e378e310aeaddfa1fdef" name="a51af55190548e378e310aeaddfa1fdef"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a51af55190548e378e310aeaddfa1fdef">&#9670;&#160;</a></span>state</h2>
 
@@ -198,21 +179,6 @@
 
 </div>
 </div>
-<a id="a7510d9a2961ea7c28ebfcde6390284bf" name="a7510d9a2961ea7c28ebfcde6390284bf"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a7510d9a2961ea7c28ebfcde6390284bf">&#9670;&#160;</a></span>ttw</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u16_t autoip::ttw</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>ticks to wait, tick is AUTOIP_TMR_INTERVAL long </p>
-
-</div>
-</div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
 <li>src/include/lwip/<a class="el" href="autoip_8h.html">autoip.h</a></li>
 </ul>
diff --git a/doc/doxygen/output/html/structautoip.js b/doc/doxygen/output/html/structautoip.js
index efcee3b..21033f6 100644
--- a/doc/doxygen/output/html/structautoip.js
+++ b/doc/doxygen/output/html/structautoip.js
@@ -1,9 +1,7 @@
 var structautoip =
 [
-    [ "lastconflict", "structautoip.html#a2f51d8cde73e20d6e0ae3ec8053afb55", null ],
+    [ "acd", "structautoip.html#a1965250cda881d229e2a1fe146a0bb9e", null ],
     [ "llipaddr", "structautoip.html#a13b5da8a86839b4cd9bd9f5400ac9dc7", null ],
-    [ "sent_num", "structautoip.html#a9d3e3bab2f12b7c7283177fbf039fb25", null ],
     [ "state", "structautoip.html#a51af55190548e378e310aeaddfa1fdef", null ],
-    [ "tried_llipaddr", "structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853", null ],
-    [ "ttw", "structautoip.html#a7510d9a2961ea7c28ebfcde6390284bf", null ]
+    [ "tried_llipaddr", "structautoip.html#a472f3d18c07b3df024a0cde8f4ffa853", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structbridgeif__initdata__s.html b/doc/doxygen/output/html/structbridgeif__initdata__s.html
index abc4294..344eefc 100644
--- a/doc/doxygen/output/html/structbridgeif__initdata__s.html
+++ b/doc/doxygen/output/html/structbridgeif__initdata__s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structdhcp6__msg.html b/doc/doxygen/output/html/structdhcp6__msg.html
index adafb4a..9949309 100644
--- a/doc/doxygen/output/html/structdhcp6__msg.html
+++ b/doc/doxygen/output/html/structdhcp6__msg.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structdhcp__msg.html b/doc/doxygen/output/html/structdhcp__msg.html
index ba2ade5..92cfb10 100644
--- a/doc/doxygen/output/html/structdhcp__msg.html
+++ b/doc/doxygen/output/html/structdhcp__msg.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structdns__answer.html b/doc/doxygen/output/html/structdns__answer.html
index ca0698d..f972c58 100644
--- a/doc/doxygen/output/html/structdns__answer.html
+++ b/doc/doxygen/output/html/structdns__answer.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structdns__api__msg.html b/doc/doxygen/output/html/structdns__api__msg.html
index 9461bf3..dbc2664 100644
--- a/doc/doxygen/output/html/structdns__api__msg.html
+++ b/doc/doxygen/output/html/structdns__api__msg.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structdns__hdr.html b/doc/doxygen/output/html/structdns__hdr.html
index 84cf5a2..825e19a 100644
--- a/doc/doxygen/output/html/structdns__hdr.html
+++ b/doc/doxygen/output/html/structdns__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structdns__query.html b/doc/doxygen/output/html/structdns__query.html
index c5ff711..1e931b1 100644
--- a/doc/doxygen/output/html/structdns__query.html
+++ b/doc/doxygen/output/html/structdns__query.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structdns__req__entry.html b/doc/doxygen/output/html/structdns__req__entry.html
index 2c1a8f9..18cb2be 100644
--- a/doc/doxygen/output/html/structdns__req__entry.html
+++ b/doc/doxygen/output/html/structdns__req__entry.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structdns__table__entry.html b/doc/doxygen/output/html/structdns__table__entry.html
index 660320a..d0d4319 100644
--- a/doc/doxygen/output/html/structdns__table__entry.html
+++ b/doc/doxygen/output/html/structdns__table__entry.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structeth__addr.html b/doc/doxygen/output/html/structeth__addr.html
index f4e66ea..3318d95 100644
--- a/doc/doxygen/output/html/structeth__addr.html
+++ b/doc/doxygen/output/html/structeth__addr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structeth__hdr.html b/doc/doxygen/output/html/structeth__hdr.html
index e460870..7d042f1 100644
--- a/doc/doxygen/output/html/structeth__hdr.html
+++ b/doc/doxygen/output/html/structeth__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structeth__vlan__hdr.html b/doc/doxygen/output/html/structeth__vlan__hdr.html
index 1b556a6..fd61326 100644
--- a/doc/doxygen/output/html/structeth__vlan__hdr.html
+++ b/doc/doxygen/output/html/structeth__vlan__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structetharp__hdr.html b/doc/doxygen/output/html/structetharp__hdr.html
index f95b109..0a41b83 100644
--- a/doc/doxygen/output/html/structetharp__hdr.html
+++ b/doc/doxygen/output/html/structetharp__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structetharp__q__entry.html b/doc/doxygen/output/html/structetharp__q__entry.html
index 6c21b1a..6cbea99 100644
--- a/doc/doxygen/output/html/structetharp__q__entry.html
+++ b/doc/doxygen/output/html/structetharp__q__entry.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structgethostbyname__r__helper.html b/doc/doxygen/output/html/structgethostbyname__r__helper.html
index 7d505e6..94dd0a0 100644
--- a/doc/doxygen/output/html/structgethostbyname__r__helper.html
+++ b/doc/doxygen/output/html/structgethostbyname__r__helper.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structicmp6__echo__hdr.html b/doc/doxygen/output/html/structicmp6__echo__hdr.html
index 3db1275..3d810c7 100644
--- a/doc/doxygen/output/html/structicmp6__echo__hdr.html
+++ b/doc/doxygen/output/html/structicmp6__echo__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structicmp6__hdr.html b/doc/doxygen/output/html/structicmp6__hdr.html
index f1589c7..542cdb6 100644
--- a/doc/doxygen/output/html/structicmp6__hdr.html
+++ b/doc/doxygen/output/html/structicmp6__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structicmp__echo__hdr.html b/doc/doxygen/output/html/structicmp__echo__hdr.html
index bdde518..d6ce425 100644
--- a/doc/doxygen/output/html/structicmp__echo__hdr.html
+++ b/doc/doxygen/output/html/structicmp__echo__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -103,7 +103,7 @@
 
 <p><code>#include &lt;icmp.h&gt;</code></p>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>This is the standard ICMP header only that the u32_t data is split to two u16_t like ICMP echo needs it. This header is also used for other ICMP types that do not use the data part. </p>
+<div class="textblock"><p>This is the standard ICMP header only that the u32_t data is split to two u16_t like ICMP echo needs it. </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
 <li>src/include/lwip/prot/<a class="el" href="prot_2icmp_8h.html">icmp.h</a></li>
 </ul>
diff --git a/doc/doxygen/output/html/structicmp__hdr.html b/doc/doxygen/output/html/structicmp__hdr.html
new file mode 100644
index 0000000..db7ea13
--- /dev/null
+++ b/doc/doxygen/output/html/structicmp__hdr.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: icmp_hdr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('structicmp__hdr.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="headertitle"><div class="title">icmp_hdr Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;icmp.h&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>The standard ICMP header (unspecified 32 bit data) </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/prot/<a class="el" href="prot_2icmp_8h.html">icmp.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="structicmp__hdr.html">icmp_hdr</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structieee__802154__hdr.html b/doc/doxygen/output/html/structieee__802154__hdr.html
index fee96a9..82d9757 100644
--- a/doc/doxygen/output/html/structieee__802154__hdr.html
+++ b/doc/doxygen/output/html/structieee__802154__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structigmp__group.html b/doc/doxygen/output/html/structigmp__group.html
index 9c0c0fb..8e5039c 100644
--- a/doc/doxygen/output/html/structigmp__group.html
+++ b/doc/doxygen/output/html/structigmp__group.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structigmp__msg.html b/doc/doxygen/output/html/structigmp__msg.html
index 5ad94b6..fb1bdf7 100644
--- a/doc/doxygen/output/html/structigmp__msg.html
+++ b/doc/doxygen/output/html/structigmp__msg.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip4__addr.html b/doc/doxygen/output/html/structip4__addr.html
index 772d525..c5d13ad 100644
--- a/doc/doxygen/output/html/structip4__addr.html
+++ b/doc/doxygen/output/html/structip4__addr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip4__addr__packed.html b/doc/doxygen/output/html/structip4__addr__packed.html
index 1b24e42..be25080 100644
--- a/doc/doxygen/output/html/structip4__addr__packed.html
+++ b/doc/doxygen/output/html/structip4__addr__packed.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip4__addr__wordaligned.html b/doc/doxygen/output/html/structip4__addr__wordaligned.html
index e1da77e..762f672 100644
--- a/doc/doxygen/output/html/structip4__addr__wordaligned.html
+++ b/doc/doxygen/output/html/structip4__addr__wordaligned.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip6__addr.html b/doc/doxygen/output/html/structip6__addr.html
index ea1e625..0794413 100644
--- a/doc/doxygen/output/html/structip6__addr.html
+++ b/doc/doxygen/output/html/structip6__addr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip6__addr__packed.html b/doc/doxygen/output/html/structip6__addr__packed.html
index a5b3552..f6f89e0 100644
--- a/doc/doxygen/output/html/structip6__addr__packed.html
+++ b/doc/doxygen/output/html/structip6__addr__packed.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip6__hdr.html b/doc/doxygen/output/html/structip6__hdr.html
index 93fb9e1..03d1722 100644
--- a/doc/doxygen/output/html/structip6__hdr.html
+++ b/doc/doxygen/output/html/structip6__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip6__reass__helper.html b/doc/doxygen/output/html/structip6__reass__helper.html
index b674e15..04f3875 100644
--- a/doc/doxygen/output/html/structip6__reass__helper.html
+++ b/doc/doxygen/output/html/structip6__reass__helper.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip6__reassdata.html b/doc/doxygen/output/html/structip6__reassdata.html
index 7e86989..2b06469 100644
--- a/doc/doxygen/output/html/structip6__reassdata.html
+++ b/doc/doxygen/output/html/structip6__reassdata.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip__addr.html b/doc/doxygen/output/html/structip__addr.html
index 82b1b44..412999d 100644
--- a/doc/doxygen/output/html/structip__addr.html
+++ b/doc/doxygen/output/html/structip__addr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip__globals.html b/doc/doxygen/output/html/structip__globals.html
index 1c79ea5..d496689 100644
--- a/doc/doxygen/output/html/structip__globals.html
+++ b/doc/doxygen/output/html/structip__globals.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip__reass__helper.html b/doc/doxygen/output/html/structip__reass__helper.html
index 79913a4..95cb938 100644
--- a/doc/doxygen/output/html/structip__reass__helper.html
+++ b/doc/doxygen/output/html/structip__reass__helper.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structip__reassdata.html b/doc/doxygen/output/html/structip__reassdata.html
index 3bde829..8edbb1e 100644
--- a/doc/doxygen/output/html/structip__reassdata.html
+++ b/doc/doxygen/output/html/structip__reassdata.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structlowpan6__ieee802154__data.html b/doc/doxygen/output/html/structlowpan6__ieee802154__data.html
index 368e08c..7ce558d 100644
--- a/doc/doxygen/output/html/structlowpan6__ieee802154__data.html
+++ b/doc/doxygen/output/html/structlowpan6__ieee802154__data.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structlowpan6__link__addr.html b/doc/doxygen/output/html/structlowpan6__link__addr.html
index 8085ca4..9408a3a 100644
--- a/doc/doxygen/output/html/structlowpan6__link__addr.html
+++ b/doc/doxygen/output/html/structlowpan6__link__addr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structlowpan6__reass__helper.html b/doc/doxygen/output/html/structlowpan6__reass__helper.html
index 195ef0d..ec46479 100644
--- a/doc/doxygen/output/html/structlowpan6__reass__helper.html
+++ b/doc/doxygen/output/html/structlowpan6__reass__helper.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structlwip__cyclic__timer.html b/doc/doxygen/output/html/structlwip__cyclic__timer.html
index 75956b8..104ae48 100644
--- a/doc/doxygen/output/html/structlwip__cyclic__timer.html
+++ b/doc/doxygen/output/html/structlwip__cyclic__timer.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structlwip__select__cb.html b/doc/doxygen/output/html/structlwip__select__cb.html
index ce61950..2d59c5b 100644
--- a/doc/doxygen/output/html/structlwip__select__cb.html
+++ b/doc/doxygen/output/html/structlwip__select__cb.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structlwip__sock.html b/doc/doxygen/output/html/structlwip__sock.html
index 7bbabd5..c4ae6bc 100644
--- a/doc/doxygen/output/html/structlwip__sock.html
+++ b/doc/doxygen/output/html/structlwip__sock.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structmdns__delayed__msg.html b/doc/doxygen/output/html/structmdns__delayed__msg.html
new file mode 100644
index 0000000..89997f1
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__delayed__msg.html
@@ -0,0 +1,246 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mdns_delayed_msg Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('structmdns__delayed__msg.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle"><div class="title">mdns_delayed_msg Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;mdns_priv.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a641abcf692a99e2c969048432b3c6adf" id="r_a641abcf692a99e2c969048432b3c6adf"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a641abcf692a99e2c969048432b3c6adf">multicast_msg_waiting</a></td></tr>
+<tr class="separator:a641abcf692a99e2c969048432b3c6adf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c7e581f1cf67daf039ffcaa31580e60" id="r_a6c7e581f1cf67daf039ffcaa31580e60"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a6c7e581f1cf67daf039ffcaa31580e60">multicast_timeout</a></td></tr>
+<tr class="separator:a6c7e581f1cf67daf039ffcaa31580e60"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ca9fccc523b7820f8e67c9ccf921da8" id="r_a5ca9fccc523b7820f8e67c9ccf921da8"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5ca9fccc523b7820f8e67c9ccf921da8">multicast_probe_timeout</a></td></tr>
+<tr class="separator:a5ca9fccc523b7820f8e67c9ccf921da8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f2ed8a51e6e249c3c72c3e31f23d20b" id="r_a6f2ed8a51e6e249c3c72c3e31f23d20b"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a6f2ed8a51e6e249c3c72c3e31f23d20b">delayed_msg_multicast</a></td></tr>
+<tr class="separator:a6f2ed8a51e6e249c3c72c3e31f23d20b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7052387506ef48b1db099c48f4ec5736" id="r_a7052387506ef48b1db099c48f4ec5736"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7052387506ef48b1db099c48f4ec5736">multicast_timeout_25TTL</a></td></tr>
+<tr class="separator:a7052387506ef48b1db099c48f4ec5736"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd5210624394fece45e57e16da85a47d" id="r_abd5210624394fece45e57e16da85a47d"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#abd5210624394fece45e57e16da85a47d">unicast_msg_in_use</a></td></tr>
+<tr class="separator:abd5210624394fece45e57e16da85a47d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acaa15e086356be60b2a1bdd8fcc17edd" id="r_acaa15e086356be60b2a1bdd8fcc17edd"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#acaa15e086356be60b2a1bdd8fcc17edd">delayed_msg_unicast</a></td></tr>
+<tr class="separator:acaa15e086356be60b2a1bdd8fcc17edd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Delayed msg info </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a6f2ed8a51e6e249c3c72c3e31f23d20b" name="a6f2ed8a51e6e249c3c72c3e31f23d20b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6f2ed8a51e6e249c3c72c3e31f23d20b">&#9670;&#160;</a></span>delayed_msg_multicast</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> mdns_delayed_msg::delayed_msg_multicast</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Output msg used for delayed multicast responses </p>
+
+</div>
+</div>
+<a id="acaa15e086356be60b2a1bdd8fcc17edd" name="acaa15e086356be60b2a1bdd8fcc17edd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acaa15e086356be60b2a1bdd8fcc17edd">&#9670;&#160;</a></span>delayed_msg_unicast</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmdns__outmsg.html">mdns_outmsg</a> mdns_delayed_msg::delayed_msg_unicast</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Output msg used for delayed unicast responses </p>
+
+</div>
+</div>
+<a id="a641abcf692a99e2c969048432b3c6adf" name="a641abcf692a99e2c969048432b3c6adf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a641abcf692a99e2c969048432b3c6adf">&#9670;&#160;</a></span>multicast_msg_waiting</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_delayed_msg::multicast_msg_waiting</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Signals if a multicast msg needs to be send out </p>
+
+</div>
+</div>
+<a id="a5ca9fccc523b7820f8e67c9ccf921da8" name="a5ca9fccc523b7820f8e67c9ccf921da8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ca9fccc523b7820f8e67c9ccf921da8">&#9670;&#160;</a></span>multicast_probe_timeout</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_delayed_msg::multicast_probe_timeout</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Multicast timeout only for probe answers </p>
+
+</div>
+</div>
+<a id="a6c7e581f1cf67daf039ffcaa31580e60" name="a6c7e581f1cf67daf039ffcaa31580e60"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c7e581f1cf67daf039ffcaa31580e60">&#9670;&#160;</a></span>multicast_timeout</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_delayed_msg::multicast_timeout</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Multicast timeout for all multicast traffic except probe answers </p>
+
+</div>
+</div>
+<a id="a7052387506ef48b1db099c48f4ec5736" name="a7052387506ef48b1db099c48f4ec5736"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7052387506ef48b1db099c48f4ec5736">&#9670;&#160;</a></span>multicast_timeout_25TTL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_delayed_msg::multicast_timeout_25TTL</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Prefer multicast over unicast timeout -&gt; 25% of TTL = we take 30s as general delay. </p>
+
+</div>
+</div>
+<a id="abd5210624394fece45e57e16da85a47d" name="abd5210624394fece45e57e16da85a47d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd5210624394fece45e57e16da85a47d">&#9670;&#160;</a></span>unicast_msg_in_use</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_delayed_msg::unicast_msg_in_use</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Only send out new unicast message if previous was send </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/apps/<a class="el" href="mdns__priv_8h.html">mdns_priv.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="structmdns__delayed__msg.html">mdns_delayed_msg</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmdns__delayed__msg.js b/doc/doxygen/output/html/structmdns__delayed__msg.js
new file mode 100644
index 0000000..9719a96
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__delayed__msg.js
@@ -0,0 +1,10 @@
+var structmdns__delayed__msg =
+[
+    [ "delayed_msg_multicast", "structmdns__delayed__msg.html#a6f2ed8a51e6e249c3c72c3e31f23d20b", null ],
+    [ "delayed_msg_unicast", "structmdns__delayed__msg.html#acaa15e086356be60b2a1bdd8fcc17edd", null ],
+    [ "multicast_msg_waiting", "structmdns__delayed__msg.html#a641abcf692a99e2c969048432b3c6adf", null ],
+    [ "multicast_probe_timeout", "structmdns__delayed__msg.html#a5ca9fccc523b7820f8e67c9ccf921da8", null ],
+    [ "multicast_timeout", "structmdns__delayed__msg.html#a6c7e581f1cf67daf039ffcaa31580e60", null ],
+    [ "multicast_timeout_25TTL", "structmdns__delayed__msg.html#a7052387506ef48b1db099c48f4ec5736", null ],
+    [ "unicast_msg_in_use", "structmdns__delayed__msg.html#abd5210624394fece45e57e16da85a47d", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmdns__host.html b/doc/doxygen/output/html/structmdns__host.html
index 6190a50..2142e74 100644
--- a/doc/doxygen/output/html/structmdns__host.html
+++ b/doc/doxygen/output/html/structmdns__host.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,6 +102,8 @@
   <div class="headertitle"><div class="title">mdns_host Struct Reference</div></div>
 </div><!--header-->
 <div class="contents">
+
+<p><code>#include &lt;mdns_priv.h&gt;</code></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
 Data Fields</h2></td></tr>
@@ -109,28 +111,83 @@
 <tr class="separator:a560447b364854eb5480e137e09d3cd24"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a750c31340c22e51375e4dc3e6e94f2ed" id="r_a750c31340c22e51375e4dc3e6e94f2ed"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__service.html">mdns_service</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a750c31340c22e51375e4dc3e6e94f2ed">services</a> [1]</td></tr>
 <tr class="separator:a750c31340c22e51375e4dc3e6e94f2ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a4547e5a8375fc1f1372546268a80d51b" id="r_a4547e5a8375fc1f1372546268a80d51b"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a4547e5a8375fc1f1372546268a80d51b">dns_ttl</a></td></tr>
-<tr class="separator:a4547e5a8375fc1f1372546268a80d51b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac8f6e3c6e1251bf73f043e489c840922" id="r_ac8f6e3c6e1251bf73f043e489c840922"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac8f6e3c6e1251bf73f043e489c840922">probes_sent</a></td></tr>
-<tr class="separator:ac8f6e3c6e1251bf73f043e489c840922"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:af9ced31c35de6a281e5b13f01e5aae61" id="r_af9ced31c35de6a281e5b13f01e5aae61"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#af9ced31c35de6a281e5b13f01e5aae61">probing_state</a></td></tr>
-<tr class="separator:af9ced31c35de6a281e5b13f01e5aae61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c09b5c58b3db64f78ce8eeb14952bea" id="r_a9c09b5c58b3db64f78ce8eeb14952bea"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9c09b5c58b3db64f78ce8eeb14952bea">sent_num</a></td></tr>
+<tr class="separator:a9c09b5c58b3db64f78ce8eeb14952bea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ed51b16771590917e0eef5cf25ada71" id="r_a2ed51b16771590917e0eef5cf25ada71"><td class="memItemLeft" align="right" valign="top">mdns_resp_state_enum_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2ed51b16771590917e0eef5cf25ada71">state</a></td></tr>
+<tr class="separator:a2ed51b16771590917e0eef5cf25ada71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d0df33231cd8b50e25aa1fa4ebdc291" id="r_a9d0df33231cd8b50e25aa1fa4ebdc291"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__delayed__msg.html">mdns_delayed_msg</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9d0df33231cd8b50e25aa1fa4ebdc291">ipv4</a></td></tr>
+<tr class="separator:a9d0df33231cd8b50e25aa1fa4ebdc291"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a16016021ddabb1dc182f36c7185bf283" id="r_a16016021ddabb1dc182f36c7185bf283"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__delayed__msg.html">mdns_delayed_msg</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a16016021ddabb1dc182f36c7185bf283">ipv6</a></td></tr>
+<tr class="separator:a16016021ddabb1dc182f36c7185bf283"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1ca90b282a4a6511fa87408b946f49a" id="r_ab1ca90b282a4a6511fa87408b946f49a"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab1ca90b282a4a6511fa87408b946f49a">conflict_time</a> [15]</td></tr>
+<tr class="separator:ab1ca90b282a4a6511fa87408b946f49a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a002e836a1888c7df4cf2b775c7fae557" id="r_a002e836a1888c7df4cf2b775c7fae557"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a002e836a1888c7df4cf2b775c7fae557">rate_limit_activated</a></td></tr>
+<tr class="separator:a002e836a1888c7df4cf2b775c7fae557"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5099b1bfe27698f6cc7ac36a80111a0" id="r_ab5099b1bfe27698f6cc7ac36a80111a0"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab5099b1bfe27698f6cc7ac36a80111a0">index</a></td></tr>
+<tr class="separator:ab5099b1bfe27698f6cc7ac36a80111a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07aadf9f308eee16a99041635df38123" id="r_a07aadf9f308eee16a99041635df38123"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a07aadf9f308eee16a99041635df38123">num_conflicts</a></td></tr>
+<tr class="separator:a07aadf9f308eee16a99041635df38123"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Description of a host/netif </p>
 </div><h2 class="groupheader">Field Documentation</h2>
-<a id="a4547e5a8375fc1f1372546268a80d51b" name="a4547e5a8375fc1f1372546268a80d51b"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a4547e5a8375fc1f1372546268a80d51b">&#9670;&#160;</a></span>dns_ttl</h2>
+<a id="ab1ca90b282a4a6511fa87408b946f49a" name="ab1ca90b282a4a6511fa87408b946f49a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab1ca90b282a4a6511fa87408b946f49a">&#9670;&#160;</a></span>conflict_time</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">u32_t mdns_host::dns_ttl</td>
+          <td class="memname">u32_t mdns_host::conflict_time[15]</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>TTL in seconds of A/AAAA/PTR replies </p>
+<p>Timestamp of probe conflict saved in list </p>
+
+</div>
+</div>
+<a id="ab5099b1bfe27698f6cc7ac36a80111a0" name="ab5099b1bfe27698f6cc7ac36a80111a0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5099b1bfe27698f6cc7ac36a80111a0">&#9670;&#160;</a></span>index</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_host::index</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>List index for timestamps </p>
+
+</div>
+</div>
+<a id="a9d0df33231cd8b50e25aa1fa4ebdc291" name="a9d0df33231cd8b50e25aa1fa4ebdc291"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d0df33231cd8b50e25aa1fa4ebdc291">&#9670;&#160;</a></span>ipv4</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmdns__delayed__msg.html">mdns_delayed_msg</a> mdns_host::ipv4</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>delayed msg struct for IPv4 </p>
+
+</div>
+</div>
+<a id="a16016021ddabb1dc182f36c7185bf283" name="a16016021ddabb1dc182f36c7185bf283"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a16016021ddabb1dc182f36c7185bf283">&#9670;&#160;</a></span>ipv6</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmdns__delayed__msg.html">mdns_delayed_msg</a> mdns_host::ipv6</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>delayed msg struct for IPv6 </p>
 
 </div>
 </div>
@@ -149,33 +206,48 @@
 
 </div>
 </div>
-<a id="ac8f6e3c6e1251bf73f043e489c840922" name="ac8f6e3c6e1251bf73f043e489c840922"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ac8f6e3c6e1251bf73f043e489c840922">&#9670;&#160;</a></span>probes_sent</h2>
+<a id="a07aadf9f308eee16a99041635df38123" name="a07aadf9f308eee16a99041635df38123"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a07aadf9f308eee16a99041635df38123">&#9670;&#160;</a></span>num_conflicts</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">u8_t mdns_host::probes_sent</td>
+          <td class="memname">u8_t mdns_host::num_conflicts</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Number of probes sent for the current name </p>
+<p>number of conflicts since startup </p>
 
 </div>
 </div>
-<a id="af9ced31c35de6a281e5b13f01e5aae61" name="af9ced31c35de6a281e5b13f01e5aae61"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#af9ced31c35de6a281e5b13f01e5aae61">&#9670;&#160;</a></span>probing_state</h2>
+<a id="a002e836a1888c7df4cf2b775c7fae557" name="a002e836a1888c7df4cf2b775c7fae557"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a002e836a1888c7df4cf2b775c7fae557">&#9670;&#160;</a></span>rate_limit_activated</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">u8_t mdns_host::probing_state</td>
+          <td class="memname">u8_t mdns_host::rate_limit_activated</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>State in probing sequence </p>
+<p>Rate limit flag </p>
+
+</div>
+</div>
+<a id="a9c09b5c58b3db64f78ce8eeb14952bea" name="a9c09b5c58b3db64f78ce8eeb14952bea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9c09b5c58b3db64f78ce8eeb14952bea">&#9670;&#160;</a></span>sent_num</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_host::sent_num</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of probes/announces sent for the current name </p>
 
 </div>
 </div>
@@ -194,8 +266,23 @@
 
 </div>
 </div>
+<a id="a2ed51b16771590917e0eef5cf25ada71" name="a2ed51b16771590917e0eef5cf25ada71"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2ed51b16771590917e0eef5cf25ada71">&#9670;&#160;</a></span>state</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">mdns_resp_state_enum_t mdns_host::state</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>State of the mdns responder </p>
+
+</div>
+</div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li>src/apps/mdns/<a class="el" href="mdns_8c.html">mdns.c</a></li>
+<li>src/include/lwip/apps/<a class="el" href="mdns__priv_8h.html">mdns_priv.h</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/structmdns__host.js b/doc/doxygen/output/html/structmdns__host.js
index 0099119..3424e16 100644
--- a/doc/doxygen/output/html/structmdns__host.js
+++ b/doc/doxygen/output/html/structmdns__host.js
@@ -1,8 +1,13 @@
 var structmdns__host =
 [
-    [ "dns_ttl", "structmdns__host.html#a4547e5a8375fc1f1372546268a80d51b", null ],
+    [ "conflict_time", "structmdns__host.html#ab1ca90b282a4a6511fa87408b946f49a", null ],
+    [ "index", "structmdns__host.html#ab5099b1bfe27698f6cc7ac36a80111a0", null ],
+    [ "ipv4", "structmdns__host.html#a9d0df33231cd8b50e25aa1fa4ebdc291", null ],
+    [ "ipv6", "structmdns__host.html#a16016021ddabb1dc182f36c7185bf283", null ],
     [ "name", "structmdns__host.html#a560447b364854eb5480e137e09d3cd24", null ],
-    [ "probes_sent", "structmdns__host.html#ac8f6e3c6e1251bf73f043e489c840922", null ],
-    [ "probing_state", "structmdns__host.html#af9ced31c35de6a281e5b13f01e5aae61", null ],
-    [ "services", "structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed", null ]
+    [ "num_conflicts", "structmdns__host.html#a07aadf9f308eee16a99041635df38123", null ],
+    [ "rate_limit_activated", "structmdns__host.html#a002e836a1888c7df4cf2b775c7fae557", null ],
+    [ "sent_num", "structmdns__host.html#a9c09b5c58b3db64f78ce8eeb14952bea", null ],
+    [ "services", "structmdns__host.html#a750c31340c22e51375e4dc3e6e94f2ed", null ],
+    [ "state", "structmdns__host.html#a2ed51b16771590917e0eef5cf25ada71", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmdns__outmsg.html b/doc/doxygen/output/html/structmdns__outmsg.html
new file mode 100644
index 0000000..58c7e1f
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__outmsg.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mdns_outmsg Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('structmdns__outmsg.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle"><div class="title">mdns_outmsg Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;mdns_priv.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a1d2d5f1d5d366f31d65ca18a239bfd4e" id="r_a1d2d5f1d5d366f31d65ca18a239bfd4e"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1d2d5f1d5d366f31d65ca18a239bfd4e">tx_id</a></td></tr>
+<tr class="separator:a1d2d5f1d5d366f31d65ca18a239bfd4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8118f6c263f6f8727552620deac2b7c2" id="r_a8118f6c263f6f8727552620deac2b7c2"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8118f6c263f6f8727552620deac2b7c2">flags</a></td></tr>
+<tr class="separator:a8118f6c263f6f8727552620deac2b7c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a187774c17294968998b6f12bb5834cd0" id="r_a187774c17294968998b6f12bb5834cd0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a187774c17294968998b6f12bb5834cd0">dest_addr</a></td></tr>
+<tr class="separator:a187774c17294968998b6f12bb5834cd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab46f1589681a1abe826e8f6c58d10f1a" id="r_ab46f1589681a1abe826e8f6c58d10f1a"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab46f1589681a1abe826e8f6c58d10f1a">cache_flush</a></td></tr>
+<tr class="separator:ab46f1589681a1abe826e8f6c58d10f1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8abcd5b3e04c16a75752b36cf613ac6f" id="r_a8abcd5b3e04c16a75752b36cf613ac6f"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8abcd5b3e04c16a75752b36cf613ac6f">unicast_reply_requested</a></td></tr>
+<tr class="separator:a8abcd5b3e04c16a75752b36cf613ac6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab2d5c566dcd83874d9cc77cd5fc7253" id="r_aab2d5c566dcd83874d9cc77cd5fc7253"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aab2d5c566dcd83874d9cc77cd5fc7253">legacy_query</a></td></tr>
+<tr class="separator:aab2d5c566dcd83874d9cc77cd5fc7253"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a3ee99f7c25e88f17ea912897617aa0" id="r_a4a3ee99f7c25e88f17ea912897617aa0"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a4a3ee99f7c25e88f17ea912897617aa0">probe_query_recv</a></td></tr>
+<tr class="separator:a4a3ee99f7c25e88f17ea912897617aa0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3f6810fb1f2a989afcbc2fd852a20386" id="r_a3f6810fb1f2a989afcbc2fd852a20386"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__request.html">mdns_request</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a3f6810fb1f2a989afcbc2fd852a20386">query</a></td></tr>
+<tr class="separator:a3f6810fb1f2a989afcbc2fd852a20386"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>mDNS output message </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ab46f1589681a1abe826e8f6c58d10f1a" name="ab46f1589681a1abe826e8f6c58d10f1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab46f1589681a1abe826e8f6c58d10f1a">&#9670;&#160;</a></span>cache_flush</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_outmsg::cache_flush</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If all answers in packet should set cache_flush bit </p>
+
+</div>
+</div>
+<a id="a187774c17294968998b6f12bb5834cd0" name="a187774c17294968998b6f12bb5834cd0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a187774c17294968998b6f12bb5834cd0">&#9670;&#160;</a></span>dest_addr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> mdns_outmsg::dest_addr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Destination IP/port if sent unicast </p>
+
+</div>
+</div>
+<a id="a8118f6c263f6f8727552620deac2b7c2" name="a8118f6c263f6f8727552620deac2b7c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8118f6c263f6f8727552620deac2b7c2">&#9670;&#160;</a></span>flags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_outmsg::flags</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>dns flags </p>
+
+</div>
+</div>
+<a id="aab2d5c566dcd83874d9cc77cd5fc7253" name="aab2d5c566dcd83874d9cc77cd5fc7253"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab2d5c566dcd83874d9cc77cd5fc7253">&#9670;&#160;</a></span>legacy_query</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_outmsg::legacy_query</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If legacy query. (tx_id needed, and write question again in reply before answer) </p>
+
+</div>
+</div>
+<a id="a4a3ee99f7c25e88f17ea912897617aa0" name="a4a3ee99f7c25e88f17ea912897617aa0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a3ee99f7c25e88f17ea912897617aa0">&#9670;&#160;</a></span>probe_query_recv</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_outmsg::probe_query_recv</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If the query is a probe msg we need to respond immediately. Independent of the QU or QM flag. </p>
+
+</div>
+</div>
+<a id="a3f6810fb1f2a989afcbc2fd852a20386" name="a3f6810fb1f2a989afcbc2fd852a20386"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3f6810fb1f2a989afcbc2fd852a20386">&#9670;&#160;</a></span>query</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmdns__request.html">mdns_request</a>* mdns_outmsg::query</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Search query to send </p>
+
+</div>
+</div>
+<a id="a1d2d5f1d5d366f31d65ca18a239bfd4e" name="a1d2d5f1d5d366f31d65ca18a239bfd4e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d2d5f1d5d366f31d65ca18a239bfd4e">&#9670;&#160;</a></span>tx_id</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_outmsg::tx_id</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Identifier. Used in legacy queries </p>
+
+</div>
+</div>
+<a id="a8abcd5b3e04c16a75752b36cf613ac6f" name="a8abcd5b3e04c16a75752b36cf613ac6f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8abcd5b3e04c16a75752b36cf613ac6f">&#9670;&#160;</a></span>unicast_reply_requested</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_outmsg::unicast_reply_requested</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>If reply should be sent unicast (as requested) </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/apps/<a class="el" href="mdns__priv_8h.html">mdns_priv.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="structmdns__outmsg.html">mdns_outmsg</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmdns__outmsg.js b/doc/doxygen/output/html/structmdns__outmsg.js
new file mode 100644
index 0000000..ce42b16
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__outmsg.js
@@ -0,0 +1,11 @@
+var structmdns__outmsg =
+[
+    [ "cache_flush", "structmdns__outmsg.html#ab46f1589681a1abe826e8f6c58d10f1a", null ],
+    [ "dest_addr", "structmdns__outmsg.html#a187774c17294968998b6f12bb5834cd0", null ],
+    [ "flags", "structmdns__outmsg.html#a8118f6c263f6f8727552620deac2b7c2", null ],
+    [ "legacy_query", "structmdns__outmsg.html#aab2d5c566dcd83874d9cc77cd5fc7253", null ],
+    [ "probe_query_recv", "structmdns__outmsg.html#a4a3ee99f7c25e88f17ea912897617aa0", null ],
+    [ "query", "structmdns__outmsg.html#a3f6810fb1f2a989afcbc2fd852a20386", null ],
+    [ "tx_id", "structmdns__outmsg.html#a1d2d5f1d5d366f31d65ca18a239bfd4e", null ],
+    [ "unicast_reply_requested", "structmdns__outmsg.html#a8abcd5b3e04c16a75752b36cf613ac6f", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmdns__outpacket.html b/doc/doxygen/output/html/structmdns__outpacket.html
index 2e40ba7..df603d6 100644
--- a/doc/doxygen/output/html/structmdns__outpacket.html
+++ b/doc/doxygen/output/html/structmdns__outpacket.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,19 +102,15 @@
   <div class="headertitle"><div class="title">mdns_outpacket Struct Reference</div></div>
 </div><!--header-->
 <div class="contents">
+
+<p><code>#include &lt;mdns_priv.h&gt;</code></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
 Data Fields</h2></td></tr>
-<tr class="memitem:ad0bd066f127d35a0ce67193e1cd07430" id="r_ad0bd066f127d35a0ce67193e1cd07430"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ad0bd066f127d35a0ce67193e1cd07430">netif</a></td></tr>
-<tr class="separator:ad0bd066f127d35a0ce67193e1cd07430"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a83d4504736f2bf315fc8b712c6a446e9" id="r_a83d4504736f2bf315fc8b712c6a446e9"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a83d4504736f2bf315fc8b712c6a446e9">pbuf</a></td></tr>
 <tr class="separator:a83d4504736f2bf315fc8b712c6a446e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a8ead21e392b21c3e872c0cab874cdcf5" id="r_a8ead21e392b21c3e872c0cab874cdcf5"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8ead21e392b21c3e872c0cab874cdcf5">write_offset</a></td></tr>
 <tr class="separator:a8ead21e392b21c3e872c0cab874cdcf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac470f02a9f332f18e027437dc293d348" id="r_ac470f02a9f332f18e027437dc293d348"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac470f02a9f332f18e027437dc293d348">tx_id</a></td></tr>
-<tr class="separator:ac470f02a9f332f18e027437dc293d348"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a1fdc90b48d8cf1fc24895f0c7a5798e4" id="r_a1fdc90b48d8cf1fc24895f0c7a5798e4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1fdc90b48d8cf1fc24895f0c7a5798e4">dest_addr</a></td></tr>
-<tr class="separator:a1fdc90b48d8cf1fc24895f0c7a5798e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a0d402cde040728d361dec8f7d86f504c" id="r_a0d402cde040728d361dec8f7d86f504c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a0d402cde040728d361dec8f7d86f504c">questions</a></td></tr>
 <tr class="separator:a0d402cde040728d361dec8f7d86f504c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aad2c24d4d5a935a209966ceace82f9ad" id="r_aad2c24d4d5a935a209966ceace82f9ad"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aad2c24d4d5a935a209966ceace82f9ad">answers</a></td></tr>
@@ -125,15 +121,9 @@
 <tr class="separator:acda83121a9bb785d20f979a0a3a312ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aee97e98c4869aa63ffe348d38d87221f" id="r_aee97e98c4869aa63ffe348d38d87221f"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aee97e98c4869aa63ffe348d38d87221f">domain_offsets</a> [10]</td></tr>
 <tr class="separator:aee97e98c4869aa63ffe348d38d87221f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9bd0fd91dda48baa2938dddd747d3195" id="r_a9bd0fd91dda48baa2938dddd747d3195"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9bd0fd91dda48baa2938dddd747d3195">cache_flush</a></td></tr>
-<tr class="separator:a9bd0fd91dda48baa2938dddd747d3195"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a68255725575af086a3afa76bc5c8e64d" id="r_a68255725575af086a3afa76bc5c8e64d"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a68255725575af086a3afa76bc5c8e64d">unicast_reply</a></td></tr>
-<tr class="separator:a68255725575af086a3afa76bc5c8e64d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aff8c520bffa87c78e0ee2440571bbd65" id="r_aff8c520bffa87c78e0ee2440571bbd65"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aff8c520bffa87c78e0ee2440571bbd65">legacy_query</a></td></tr>
-<tr class="separator:aff8c520bffa87c78e0ee2440571bbd65"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Information about outgoing packet </p>
+<div class="textblock"><p>mDNS output packet </p>
 </div><h2 class="groupheader">Field Documentation</h2>
 <a id="acda83121a9bb785d20f979a0a3a312ce" name="acda83121a9bb785d20f979a0a3a312ce"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#acda83121a9bb785d20f979a0a3a312ce">&#9670;&#160;</a></span>additional</h2>
@@ -180,36 +170,6 @@
 
 </div>
 </div>
-<a id="a9bd0fd91dda48baa2938dddd747d3195" name="a9bd0fd91dda48baa2938dddd747d3195"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a9bd0fd91dda48baa2938dddd747d3195">&#9670;&#160;</a></span>cache_flush</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u8_t mdns_outpacket::cache_flush</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>If all answers in packet should set cache_flush bit </p>
-
-</div>
-</div>
-<a id="a1fdc90b48d8cf1fc24895f0c7a5798e4" name="a1fdc90b48d8cf1fc24895f0c7a5798e4"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a1fdc90b48d8cf1fc24895f0c7a5798e4">&#9670;&#160;</a></span>dest_addr</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> mdns_outpacket::dest_addr</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Destination IP/port if sent unicast </p>
-
-</div>
-</div>
 <a id="aee97e98c4869aa63ffe348d38d87221f" name="aee97e98c4869aa63ffe348d38d87221f"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aee97e98c4869aa63ffe348d38d87221f">&#9670;&#160;</a></span>domain_offsets</h2>
 
@@ -225,36 +185,6 @@
 
 </div>
 </div>
-<a id="aff8c520bffa87c78e0ee2440571bbd65" name="aff8c520bffa87c78e0ee2440571bbd65"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aff8c520bffa87c78e0ee2440571bbd65">&#9670;&#160;</a></span>legacy_query</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u8_t mdns_outpacket::legacy_query</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>If legacy query. (tx_id needed, and write question again in reply before answer) </p>
-
-</div>
-</div>
-<a id="ad0bd066f127d35a0ce67193e1cd07430" name="ad0bd066f127d35a0ce67193e1cd07430"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ad0bd066f127d35a0ce67193e1cd07430">&#9670;&#160;</a></span>netif</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* mdns_outpacket::netif</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Netif to send the packet on </p>
-
-</div>
-</div>
 <a id="a83d4504736f2bf315fc8b712c6a446e9" name="a83d4504736f2bf315fc8b712c6a446e9"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a83d4504736f2bf315fc8b712c6a446e9">&#9670;&#160;</a></span>pbuf</h2>
 
@@ -285,36 +215,6 @@
 
 </div>
 </div>
-<a id="ac470f02a9f332f18e027437dc293d348" name="ac470f02a9f332f18e027437dc293d348"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ac470f02a9f332f18e027437dc293d348">&#9670;&#160;</a></span>tx_id</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u16_t mdns_outpacket::tx_id</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Identifier. Used in legacy queries </p>
-
-</div>
-</div>
-<a id="a68255725575af086a3afa76bc5c8e64d" name="a68255725575af086a3afa76bc5c8e64d"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a68255725575af086a3afa76bc5c8e64d">&#9670;&#160;</a></span>unicast_reply</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u8_t mdns_outpacket::unicast_reply</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>If reply should be sent unicast </p>
-
-</div>
-</div>
 <a id="a8ead21e392b21c3e872c0cab874cdcf5" name="a8ead21e392b21c3e872c0cab874cdcf5"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a8ead21e392b21c3e872c0cab874cdcf5">&#9670;&#160;</a></span>write_offset</h2>
 
@@ -331,7 +231,7 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li>src/apps/mdns/<a class="el" href="mdns_8c.html">mdns.c</a></li>
+<li>src/include/lwip/apps/<a class="el" href="mdns__priv_8h.html">mdns_priv.h</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/structmdns__outpacket.js b/doc/doxygen/output/html/structmdns__outpacket.js
index f1a4c5c..76e8c44 100644
--- a/doc/doxygen/output/html/structmdns__outpacket.js
+++ b/doc/doxygen/output/html/structmdns__outpacket.js
@@ -3,14 +3,8 @@
     [ "additional", "structmdns__outpacket.html#acda83121a9bb785d20f979a0a3a312ce", null ],
     [ "answers", "structmdns__outpacket.html#aad2c24d4d5a935a209966ceace82f9ad", null ],
     [ "authoritative", "structmdns__outpacket.html#a1a689ea7094a3569878f15477e725035", null ],
-    [ "cache_flush", "structmdns__outpacket.html#a9bd0fd91dda48baa2938dddd747d3195", null ],
-    [ "dest_addr", "structmdns__outpacket.html#a1fdc90b48d8cf1fc24895f0c7a5798e4", null ],
     [ "domain_offsets", "structmdns__outpacket.html#aee97e98c4869aa63ffe348d38d87221f", null ],
-    [ "legacy_query", "structmdns__outpacket.html#aff8c520bffa87c78e0ee2440571bbd65", null ],
-    [ "netif", "structmdns__outpacket.html#ad0bd066f127d35a0ce67193e1cd07430", null ],
     [ "pbuf", "structmdns__outpacket.html#a83d4504736f2bf315fc8b712c6a446e9", null ],
     [ "questions", "structmdns__outpacket.html#a0d402cde040728d361dec8f7d86f504c", null ],
-    [ "tx_id", "structmdns__outpacket.html#ac470f02a9f332f18e027437dc293d348", null ],
-    [ "unicast_reply", "structmdns__outpacket.html#a68255725575af086a3afa76bc5c8e64d", null ],
     [ "write_offset", "structmdns__outpacket.html#a8ead21e392b21c3e872c0cab874cdcf5", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmdns__packet.html b/doc/doxygen/output/html/structmdns__packet.html
index adcf345..704e7d7 100644
--- a/doc/doxygen/output/html/structmdns__packet.html
+++ b/doc/doxygen/output/html/structmdns__packet.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -109,8 +109,6 @@
 <tr class="separator:aaa64cc21495dc6bb76ed9125904dd07a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a8659b4f582be0df84b6ae91308737377" id="r_a8659b4f582be0df84b6ae91308737377"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8659b4f582be0df84b6ae91308737377">recv_unicast</a></td></tr>
 <tr class="separator:a8659b4f582be0df84b6ae91308737377"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac7307f344f654cb954f92d578dc7c989" id="r_ac7307f344f654cb954f92d578dc7c989"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnetif.html">netif</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac7307f344f654cb954f92d578dc7c989">netif</a></td></tr>
-<tr class="separator:ac7307f344f654cb954f92d578dc7c989"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a2ec02a67fd82f0df695e94745eddaf45" id="r_a2ec02a67fd82f0df695e94745eddaf45"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structpbuf.html">pbuf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2ec02a67fd82f0df695e94745eddaf45">pbuf</a></td></tr>
 <tr class="separator:a2ec02a67fd82f0df695e94745eddaf45"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a4c3c3a28ac113b3ee40d5cf07d851f68" id="r_a4c3c3a28ac113b3ee40d5cf07d851f68"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a4c3c3a28ac113b3ee40d5cf07d851f68">parse_offset</a></td></tr>
@@ -125,10 +123,52 @@
 <tr class="separator:a918feee242cfb3934d9f5c3de1c298e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a56ba495a1458a21982e65d746468849d" id="r_a56ba495a1458a21982e65d746468849d"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a56ba495a1458a21982e65d746468849d">answers_left</a></td></tr>
 <tr class="separator:a56ba495a1458a21982e65d746468849d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01f2cd644ceda020d639290fe1c3ea1c" id="r_a01f2cd644ceda020d639290fe1c3ea1c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a01f2cd644ceda020d639290fe1c3ea1c">authoritative</a></td></tr>
+<tr class="separator:a01f2cd644ceda020d639290fe1c3ea1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade926269f6b1de2e51ee92a703068445" id="r_ade926269f6b1de2e51ee92a703068445"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ade926269f6b1de2e51ee92a703068445">authoritative_left</a></td></tr>
+<tr class="separator:ade926269f6b1de2e51ee92a703068445"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7d1d004dcac3cb6761241c5fe58b0ab" id="r_ab7d1d004dcac3cb6761241c5fe58b0ab"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ab7d1d004dcac3cb6761241c5fe58b0ab">additional</a></td></tr>
+<tr class="separator:ab7d1d004dcac3cb6761241c5fe58b0ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac47f5a84c173a1565c69673536537c89" id="r_ac47f5a84c173a1565c69673536537c89"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac47f5a84c173a1565c69673536537c89">additional_left</a></td></tr>
+<tr class="separator:ac47f5a84c173a1565c69673536537c89"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ff4547d0866f338d1c58fc1dadf43f1" id="r_a1ff4547d0866f338d1c58fc1dadf43f1"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__packet.html">mdns_packet</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1ff4547d0866f338d1c58fc1dadf43f1">next_answer</a></td></tr>
+<tr class="separator:a1ff4547d0866f338d1c58fc1dadf43f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afdb78218c1775073762d9560986c119b" id="r_afdb78218c1775073762d9560986c119b"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structmdns__packet.html">mdns_packet</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#afdb78218c1775073762d9560986c119b">next_tc_question</a></td></tr>
+<tr class="separator:afdb78218c1775073762d9560986c119b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Information about received packet </p>
 </div><h2 class="groupheader">Field Documentation</h2>
+<a id="ab7d1d004dcac3cb6761241c5fe58b0ab" name="ab7d1d004dcac3cb6761241c5fe58b0ab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7d1d004dcac3cb6761241c5fe58b0ab">&#9670;&#160;</a></span>additional</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::additional</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of additional answers in packet </p>
+
+</div>
+</div>
+<a id="ac47f5a84c173a1565c69673536537c89" name="ac47f5a84c173a1565c69673536537c89"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac47f5a84c173a1565c69673536537c89">&#9670;&#160;</a></span>additional_left</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::additional_left</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of unparsed additional answers </p>
+
+</div>
+</div>
 <a id="a918feee242cfb3934d9f5c3de1c298e7" name="a918feee242cfb3934d9f5c3de1c298e7"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a918feee242cfb3934d9f5c3de1c298e7">&#9670;&#160;</a></span>answers</h2>
 
@@ -140,7 +180,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Number of answers in packet, (sum of normal, authoritative and additional answers) read from packet header </p>
+<p>Number of answers in packet </p>
 
 </div>
 </div>
@@ -159,18 +199,63 @@
 
 </div>
 </div>
-<a id="ac7307f344f654cb954f92d578dc7c989" name="ac7307f344f654cb954f92d578dc7c989"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ac7307f344f654cb954f92d578dc7c989">&#9670;&#160;</a></span>netif</h2>
+<a id="a01f2cd644ceda020d639290fe1c3ea1c" name="a01f2cd644ceda020d639290fe1c3ea1c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01f2cd644ceda020d639290fe1c3ea1c">&#9670;&#160;</a></span>authoritative</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">struct <a class="el" href="structnetif.html">netif</a>* mdns_packet::netif</td>
+          <td class="memname">u16_t mdns_packet::authoritative</td>
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Netif that received the packet </p>
+<p>Number of authoritative answers in packet </p>
+
+</div>
+</div>
+<a id="ade926269f6b1de2e51ee92a703068445" name="ade926269f6b1de2e51ee92a703068445"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ade926269f6b1de2e51ee92a703068445">&#9670;&#160;</a></span>authoritative_left</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_packet::authoritative_left</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Number of unparsed authoritative answers </p>
+
+</div>
+</div>
+<a id="a1ff4547d0866f338d1c58fc1dadf43f1" name="a1ff4547d0866f338d1c58fc1dadf43f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1ff4547d0866f338d1c58fc1dadf43f1">&#9670;&#160;</a></span>next_answer</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmdns__packet.html">mdns_packet</a>* mdns_packet::next_answer</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Chained list of known answer received after a truncated question </p>
+
+</div>
+</div>
+<a id="afdb78218c1775073762d9560986c119b" name="afdb78218c1775073762d9560986c119b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afdb78218c1775073762d9560986c119b">&#9670;&#160;</a></span>next_tc_question</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structmdns__packet.html">mdns_packet</a>* mdns_packet::next_tc_question</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Chained list of truncated question that are waiting </p>
 
 </div>
 </div>
diff --git a/doc/doxygen/output/html/structmdns__packet.js b/doc/doxygen/output/html/structmdns__packet.js
index cf5b334..545b377 100644
--- a/doc/doxygen/output/html/structmdns__packet.js
+++ b/doc/doxygen/output/html/structmdns__packet.js
@@ -1,8 +1,13 @@
 var structmdns__packet =
 [
+    [ "additional", "structmdns__packet.html#ab7d1d004dcac3cb6761241c5fe58b0ab", null ],
+    [ "additional_left", "structmdns__packet.html#ac47f5a84c173a1565c69673536537c89", null ],
     [ "answers", "structmdns__packet.html#a918feee242cfb3934d9f5c3de1c298e7", null ],
     [ "answers_left", "structmdns__packet.html#a56ba495a1458a21982e65d746468849d", null ],
-    [ "netif", "structmdns__packet.html#ac7307f344f654cb954f92d578dc7c989", null ],
+    [ "authoritative", "structmdns__packet.html#a01f2cd644ceda020d639290fe1c3ea1c", null ],
+    [ "authoritative_left", "structmdns__packet.html#ade926269f6b1de2e51ee92a703068445", null ],
+    [ "next_answer", "structmdns__packet.html#a1ff4547d0866f338d1c58fc1dadf43f1", null ],
+    [ "next_tc_question", "structmdns__packet.html#afdb78218c1775073762d9560986c119b", null ],
     [ "parse_offset", "structmdns__packet.html#a4c3c3a28ac113b3ee40d5cf07d851f68", null ],
     [ "pbuf", "structmdns__packet.html#a2ec02a67fd82f0df695e94745eddaf45", null ],
     [ "questions", "structmdns__packet.html#a09211e78f7f773c492b5856d31423699", null ],
diff --git a/doc/doxygen/output/html/structmdns__request.html b/doc/doxygen/output/html/structmdns__request.html
new file mode 100644
index 0000000..f3a62f6
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__request.html
@@ -0,0 +1,229 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.12.0"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>lwIP: mdns_request Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<script type="text/javascript" src="clipboard.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="cookie.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+  <td id="projectalign">
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
+   </div>
+   <div id="projectbrief">Lightweight IP stack</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.12.0 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search/",'.html');
+/* @license-end */
+</script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() { codefold.init(0); });
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search',true);
+  $(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function(){initNavTree('structmdns__request.html',''); initResizable(true); });
+/* @license-end */
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<div id="MSearchResults">
+<div class="SRPage">
+<div id="SRIndex">
+<div id="SRResults"></div>
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle"><div class="title">mdns_request Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;mdns_priv.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a3ed18dad500125e0d63274c797bd52f5" id="r_a3ed18dad500125e0d63274c797bd52f5"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a3ed18dad500125e0d63274c797bd52f5">name</a> [63+1]</td></tr>
+<tr class="separator:a3ed18dad500125e0d63274c797bd52f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aace6ab8b7de73d61d02711f26de7b751" id="r_aace6ab8b7de73d61d02711f26de7b751"><td class="memItemLeft" align="right" valign="top">struct mdns_domain&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aace6ab8b7de73d61d02711f26de7b751">service</a></td></tr>
+<tr class="separator:aace6ab8b7de73d61d02711f26de7b751"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4cc8a4e62ce71bc33f1e7cb24b198c1d" id="r_a4cc8a4e62ce71bc33f1e7cb24b198c1d"><td class="memItemLeft" align="right" valign="top">search_result_fn_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a4cc8a4e62ce71bc33f1e7cb24b198c1d">result_fn</a></td></tr>
+<tr class="separator:a4cc8a4e62ce71bc33f1e7cb24b198c1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a497e1b8f664dab9904a89e5f15f5bc60" id="r_a497e1b8f664dab9904a89e5f15f5bc60"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a497e1b8f664dab9904a89e5f15f5bc60">proto</a></td></tr>
+<tr class="separator:a497e1b8f664dab9904a89e5f15f5bc60"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a9261362213a1a790a0b3451916f669" id="r_a5a9261362213a1a790a0b3451916f669"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5a9261362213a1a790a0b3451916f669">qtype</a></td></tr>
+<tr class="separator:a5a9261362213a1a790a0b3451916f669"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1080b561c8dcb322fb2af64217b13f64" id="r_a1080b561c8dcb322fb2af64217b13f64"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a1080b561c8dcb322fb2af64217b13f64">only_ptr</a></td></tr>
+<tr class="separator:a1080b561c8dcb322fb2af64217b13f64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Description of a search request </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a3ed18dad500125e0d63274c797bd52f5" name="a3ed18dad500125e0d63274c797bd52f5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3ed18dad500125e0d63274c797bd52f5">&#9670;&#160;</a></span>name</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char mdns_request::name[63+1]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Name of service, like 'myweb' </p>
+
+</div>
+</div>
+<a id="a1080b561c8dcb322fb2af64217b13f64" name="a1080b561c8dcb322fb2af64217b13f64"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1080b561c8dcb322fb2af64217b13f64">&#9670;&#160;</a></span>only_ptr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_request::only_ptr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>PTR only request. </p>
+
+</div>
+</div>
+<a id="a497e1b8f664dab9904a89e5f15f5bc60" name="a497e1b8f664dab9904a89e5f15f5bc60"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a497e1b8f664dab9904a89e5f15f5bc60">&#9670;&#160;</a></span>proto</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u16_t mdns_request::proto</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Protocol, TCP or UDP </p>
+
+</div>
+</div>
+<a id="a5a9261362213a1a790a0b3451916f669" name="a5a9261362213a1a790a0b3451916f669"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a9261362213a1a790a0b3451916f669">&#9670;&#160;</a></span>qtype</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">u8_t mdns_request::qtype</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Query type (PTR, SRV, ...) </p>
+
+</div>
+</div>
+<a id="a4cc8a4e62ce71bc33f1e7cb24b198c1d" name="a4cc8a4e62ce71bc33f1e7cb24b198c1d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4cc8a4e62ce71bc33f1e7cb24b198c1d">&#9670;&#160;</a></span>result_fn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">search_result_fn_t mdns_request::result_fn</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Callback function called for each response </p>
+
+</div>
+</div>
+<a id="aace6ab8b7de73d61d02711f26de7b751" name="aace6ab8b7de73d61d02711f26de7b751"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aace6ab8b7de73d61d02711f26de7b751">&#9670;&#160;</a></span>service</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct mdns_domain mdns_request::service</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Type of service, like '_http' or '_services._dns-sd' </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>src/include/lwip/apps/<a class="el" href="mdns__priv_8h.html">mdns_priv.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    <li class="navelem"><a class="el" href="structmdns__request.html">mdns_request</a></li>
+    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/doxygen/output/html/structmdns__request.js b/doc/doxygen/output/html/structmdns__request.js
new file mode 100644
index 0000000..adafc14
--- /dev/null
+++ b/doc/doxygen/output/html/structmdns__request.js
@@ -0,0 +1,9 @@
+var structmdns__request =
+[
+    [ "name", "structmdns__request.html#a3ed18dad500125e0d63274c797bd52f5", null ],
+    [ "only_ptr", "structmdns__request.html#a1080b561c8dcb322fb2af64217b13f64", null ],
+    [ "proto", "structmdns__request.html#a497e1b8f664dab9904a89e5f15f5bc60", null ],
+    [ "qtype", "structmdns__request.html#a5a9261362213a1a790a0b3451916f669", null ],
+    [ "result_fn", "structmdns__request.html#a4cc8a4e62ce71bc33f1e7cb24b198c1d", null ],
+    [ "service", "structmdns__request.html#aace6ab8b7de73d61d02711f26de7b751", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structmdns__rr__info.html b/doc/doxygen/output/html/structmdns__rr__info.html
index 984053d..813059a 100644
--- a/doc/doxygen/output/html/structmdns__rr__info.html
+++ b/doc/doxygen/output/html/structmdns__rr__info.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -100,10 +100,12 @@
   <div class="headertitle"><div class="title">mdns_rr_info Struct Reference</div></div>
 </div><!--header-->
 <div class="contents">
+
+<p><code>#include &lt;mdns.h&gt;</code></p>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Domain, type and class. Shared between questions and answers </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
-<li>src/apps/mdns/<a class="el" href="mdns_8c.html">mdns.c</a></li>
+<li>src/include/lwip/apps/<a class="el" href="mdns_8h.html">mdns.h</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/structmdns__service.html b/doc/doxygen/output/html/structmdns__service.html
index 86aaba2..eaf6e6e 100644
--- a/doc/doxygen/output/html/structmdns__service.html
+++ b/doc/doxygen/output/html/structmdns__service.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -102,6 +102,8 @@
   <div class="headertitle"><div class="title">mdns_service Struct Reference</div></div>
 </div><!--header-->
 <div class="contents">
+
+<p><code>#include &lt;mdns_priv.h&gt;</code></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
 Data Fields</h2></td></tr>
@@ -113,8 +115,6 @@
 <tr class="separator:a42583986e24b5a4a13b6d647c1a281ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a79bc4946c96a3b2d0713bc0897c4bd9c" id="r_a79bc4946c96a3b2d0713bc0897c4bd9c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="mdns_8h.html#a3b9ee5953214665e585e5bcaf6b8ea83">service_get_txt_fn_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a79bc4946c96a3b2d0713bc0897c4bd9c">txt_fn</a></td></tr>
 <tr class="separator:a79bc4946c96a3b2d0713bc0897c4bd9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5a939a4da01cb50c74cd53b352e4fa14" id="r_a5a939a4da01cb50c74cd53b352e4fa14"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5a939a4da01cb50c74cd53b352e4fa14">dns_ttl</a></td></tr>
-<tr class="separator:a5a939a4da01cb50c74cd53b352e4fa14"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa9f2e0bb67d3848152e6076e92e8018d" id="r_aa9f2e0bb67d3848152e6076e92e8018d"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa9f2e0bb67d3848152e6076e92e8018d">proto</a></td></tr>
 <tr class="separator:aa9f2e0bb67d3848152e6076e92e8018d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:abbf317cde8fb7ba8d834ad9746dd780c" id="r_abbf317cde8fb7ba8d834ad9746dd780c"><td class="memItemLeft" align="right" valign="top">u16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#abbf317cde8fb7ba8d834ad9746dd780c">port</a></td></tr>
@@ -123,21 +123,6 @@
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Description of a service </p>
 </div><h2 class="groupheader">Field Documentation</h2>
-<a id="a5a939a4da01cb50c74cd53b352e4fa14" name="a5a939a4da01cb50c74cd53b352e4fa14"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a5a939a4da01cb50c74cd53b352e4fa14">&#9670;&#160;</a></span>dns_ttl</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">u32_t mdns_service::dns_ttl</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>TTL in seconds of SRV/TXT replies </p>
-
-</div>
-</div>
 <a id="ac6d92cf213e3647d3ca1520595c3b784" name="ac6d92cf213e3647d3ca1520595c3b784"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ac6d92cf213e3647d3ca1520595c3b784">&#9670;&#160;</a></span>name</h2>
 
@@ -229,7 +214,7 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li>src/apps/mdns/<a class="el" href="mdns_8c.html">mdns.c</a></li>
+<li>src/include/lwip/apps/<a class="el" href="mdns__priv_8h.html">mdns_priv.h</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/structmdns__service.js b/doc/doxygen/output/html/structmdns__service.js
index d905e66..2532a59 100644
--- a/doc/doxygen/output/html/structmdns__service.js
+++ b/doc/doxygen/output/html/structmdns__service.js
@@ -1,6 +1,5 @@
 var structmdns__service =
 [
-    [ "dns_ttl", "structmdns__service.html#a5a939a4da01cb50c74cd53b352e4fa14", null ],
     [ "name", "structmdns__service.html#ac6d92cf213e3647d3ca1520595c3b784", null ],
     [ "port", "structmdns__service.html#abbf317cde8fb7ba8d834ad9746dd780c", null ],
     [ "proto", "structmdns__service.html#aa9f2e0bb67d3848152e6076e92e8018d", null ],
diff --git a/doc/doxygen/output/html/structmem.html b/doc/doxygen/output/html/structmem.html
index cbbd740..f2b99fe 100644
--- a/doc/doxygen/output/html/structmem.html
+++ b/doc/doxygen/output/html/structmem.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structmemp__desc.html b/doc/doxygen/output/html/structmemp__desc.html
index f3215fb..c3d4a39 100644
--- a/doc/doxygen/output/html/structmemp__desc.html
+++ b/doc/doxygen/output/html/structmemp__desc.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structmld__group.html b/doc/doxygen/output/html/structmld__group.html
index d846f88..96e6d6c 100644
--- a/doc/doxygen/output/html/structmld__group.html
+++ b/doc/doxygen/output/html/structmld__group.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structmld__header.html b/doc/doxygen/output/html/structmld__header.html
index 3319244..08029ec 100644
--- a/doc/doxygen/output/html/structmld__header.html
+++ b/doc/doxygen/output/html/structmld__header.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structmqtt__client__s.html b/doc/doxygen/output/html/structmqtt__client__s.html
index c36af68..fe6a205 100644
--- a/doc/doxygen/output/html/structmqtt__client__s.html
+++ b/doc/doxygen/output/html/structmqtt__client__s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structmqtt__connect__client__info__t.html b/doc/doxygen/output/html/structmqtt__connect__client__info__t.html
index 6408a9e..8c44936 100644
--- a/doc/doxygen/output/html/structmqtt__connect__client__info__t.html
+++ b/doc/doxygen/output/html/structmqtt__connect__client__info__t.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structmqtt__request__t.html b/doc/doxygen/output/html/structmqtt__request__t.html
index f454d5a..7f1daa1 100644
--- a/doc/doxygen/output/html/structmqtt__request__t.html
+++ b/doc/doxygen/output/html/structmqtt__request__t.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structmqtt__ringbuf__t.html b/doc/doxygen/output/html/structmqtt__ringbuf__t.html
index 5c5acf8..b594801 100644
--- a/doc/doxygen/output/html/structmqtt__ringbuf__t.html
+++ b/doc/doxygen/output/html/structmqtt__ringbuf__t.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structna__header.html b/doc/doxygen/output/html/structna__header.html
index e918760..7ad4550 100644
--- a/doc/doxygen/output/html/structna__header.html
+++ b/doc/doxygen/output/html/structna__header.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnd6__neighbor__cache__entry.html b/doc/doxygen/output/html/structnd6__neighbor__cache__entry.html
index 86671bd..d1c88fe 100644
--- a/doc/doxygen/output/html/structnd6__neighbor__cache__entry.html
+++ b/doc/doxygen/output/html/structnd6__neighbor__cache__entry.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnd6__q__entry.html b/doc/doxygen/output/html/structnd6__q__entry.html
index 0d616cf..c86a37a 100644
--- a/doc/doxygen/output/html/structnd6__q__entry.html
+++ b/doc/doxygen/output/html/structnd6__q__entry.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetbios__answer.html b/doc/doxygen/output/html/structnetbios__answer.html
index 1a82a9e..ee602df 100644
--- a/doc/doxygen/output/html/structnetbios__answer.html
+++ b/doc/doxygen/output/html/structnetbios__answer.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetbios__hdr.html b/doc/doxygen/output/html/structnetbios__hdr.html
index 1fd3d51..84825e4 100644
--- a/doc/doxygen/output/html/structnetbios__hdr.html
+++ b/doc/doxygen/output/html/structnetbios__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetbios__name__hdr.html b/doc/doxygen/output/html/structnetbios__name__hdr.html
index 1e4d70f..08365ac 100644
--- a/doc/doxygen/output/html/structnetbios__name__hdr.html
+++ b/doc/doxygen/output/html/structnetbios__name__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetbios__question__hdr.html b/doc/doxygen/output/html/structnetbios__question__hdr.html
index f1b0e99..aed0b33 100644
--- a/doc/doxygen/output/html/structnetbios__question__hdr.html
+++ b/doc/doxygen/output/html/structnetbios__question__hdr.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetbios__resp.html b/doc/doxygen/output/html/structnetbios__resp.html
index 4af94e0..cdd4516 100644
--- a/doc/doxygen/output/html/structnetbios__resp.html
+++ b/doc/doxygen/output/html/structnetbios__resp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetbuf.html b/doc/doxygen/output/html/structnetbuf.html
index 3242d33..6de6bb7 100644
--- a/doc/doxygen/output/html/structnetbuf.html
+++ b/doc/doxygen/output/html/structnetbuf.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetconn.html b/doc/doxygen/output/html/structnetconn.html
index ddb4481..05c6867 100644
--- a/doc/doxygen/output/html/structnetconn.html
+++ b/doc/doxygen/output/html/structnetconn.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -123,8 +123,6 @@
 <tr class="separator:a9f2bf6a3865b6a22a8a71ec2f3e770da"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a9b59188f300828d2b5814e27ab27cad0" id="r_a9b59188f300828d2b5814e27ab27cad0"><td class="memItemLeft" align="right" valign="top">sys_mbox_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9b59188f300828d2b5814e27ab27cad0">acceptmbox</a></td></tr>
 <tr class="separator:a9b59188f300828d2b5814e27ab27cad0"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac8e05eb65774665e364a3dcf0f139b36" id="r_ac8e05eb65774665e364a3dcf0f139b36"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac8e05eb65774665e364a3dcf0f139b36">socket</a></td></tr>
-<tr class="separator:ac8e05eb65774665e364a3dcf0f139b36"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a44e55724482b8e447134f5ba4f01551a" id="r_a44e55724482b8e447134f5ba4f01551a"><td class="memItemLeft" align="right" valign="top">s32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a44e55724482b8e447134f5ba4f01551a">send_timeout</a></td></tr>
 <tr class="separator:a44e55724482b8e447134f5ba4f01551a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a6febc9717418ddba16f16e988061cfac" id="r_a6febc9717418ddba16f16e988061cfac"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a6febc9717418ddba16f16e988061cfac">recv_bufsize</a></td></tr>
@@ -323,21 +321,6 @@
 
 </div>
 </div>
-<a id="ac8e05eb65774665e364a3dcf0f139b36" name="ac8e05eb65774665e364a3dcf0f139b36"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ac8e05eb65774665e364a3dcf0f139b36">&#9670;&#160;</a></span>socket</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">int netconn::socket</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>only used for socket layer </p>
-
-</div>
-</div>
 <a id="a936c33090ec35e5e8c0011be5515a589" name="a936c33090ec35e5e8c0011be5515a589"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a936c33090ec35e5e8c0011be5515a589">&#9670;&#160;</a></span>state</h2>
 
diff --git a/doc/doxygen/output/html/structnetconn.js b/doc/doxygen/output/html/structnetconn.js
index 8cda43c..9e535ff 100644
--- a/doc/doxygen/output/html/structnetconn.js
+++ b/doc/doxygen/output/html/structnetconn.js
@@ -12,7 +12,6 @@
     [ "recv_bufsize", "structnetconn.html#a6febc9717418ddba16f16e988061cfac", null ],
     [ "recvmbox", "structnetconn.html#a9f2bf6a3865b6a22a8a71ec2f3e770da", null ],
     [ "send_timeout", "structnetconn.html#a44e55724482b8e447134f5ba4f01551a", null ],
-    [ "socket", "structnetconn.html#ac8e05eb65774665e364a3dcf0f139b36", null ],
     [ "state", "structnetconn.html#a936c33090ec35e5e8c0011be5515a589", null ],
     [ "type", "structnetconn.html#a61af908d1d2e4e7345ac65d3b390d7b6", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/structnetif.html b/doc/doxygen/output/html/structnetif.html
index 3d7b552..005dbe8 100644
--- a/doc/doxygen/output/html/structnetif.html
+++ b/doc/doxygen/output/html/structnetif.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv4__changed__s.html b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv4__changed__s.html
index b4745c6..53bb908 100644
--- a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv4__changed__s.html
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv4__changed__s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html
index 8a3d4d3..b901314 100644
--- a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__addr__state__changed__s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__set__s.html b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__set__s.html
index 86380b5..080d72b 100644
--- a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__set__s.html
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1ipv6__set__s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1link__changed__s.html b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1link__changed__s.html
index 2d71829..fc72369 100644
--- a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1link__changed__s.html
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1link__changed__s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1status__changed__s.html b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1status__changed__s.html
index f38c5d6..d032a76 100644
--- a/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1status__changed__s.html
+++ b/doc/doxygen/output/html/structnetif__ext__callback__args__t_1_1status__changed__s.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structnetvector.html b/doc/doxygen/output/html/structnetvector.html
index 37c179c..821d967 100644
--- a/doc/doxygen/output/html/structnetvector.html
+++ b/doc/doxygen/output/html/structnetvector.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structns__header.html b/doc/doxygen/output/html/structns__header.html
index b348f3d..5cf267b 100644
--- a/doc/doxygen/output/html/structns__header.html
+++ b/doc/doxygen/output/html/structns__header.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structpbuf.html b/doc/doxygen/output/html/structpbuf.html
index 2dd79f3..3be52b9 100644
--- a/doc/doxygen/output/html/structpbuf.html
+++ b/doc/doxygen/output/html/structpbuf.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structpbuf__custom.html b/doc/doxygen/output/html/structpbuf__custom.html
index fc7414a..7ee8bdb 100644
--- a/doc/doxygen/output/html/structpbuf__custom.html
+++ b/doc/doxygen/output/html/structpbuf__custom.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structpbuf__custom__ref.html b/doc/doxygen/output/html/structpbuf__custom__ref.html
index fe18381..59ad867 100644
--- a/doc/doxygen/output/html/structpbuf__custom__ref.html
+++ b/doc/doxygen/output/html/structpbuf__custom__ref.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structpbuf__rom.html b/doc/doxygen/output/html/structpbuf__rom.html
index ff88ac0..d3618ae 100644
--- a/doc/doxygen/output/html/structpbuf__rom.html
+++ b/doc/doxygen/output/html/structpbuf__rom.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structraw__pcb.html b/doc/doxygen/output/html/structraw__pcb.html
index 45b4104..b5095ed 100644
--- a/doc/doxygen/output/html/structraw__pcb.html
+++ b/doc/doxygen/output/html/structraw__pcb.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structredirect__header.html b/doc/doxygen/output/html/structredirect__header.html
index 75ecc64..edde010 100644
--- a/doc/doxygen/output/html/structredirect__header.html
+++ b/doc/doxygen/output/html/structredirect__header.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structrs__header.html b/doc/doxygen/output/html/structrs__header.html
index beedde4..e14826f 100644
--- a/doc/doxygen/output/html/structrs__header.html
+++ b/doc/doxygen/output/html/structrs__header.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsmtp__send__request.html b/doc/doxygen/output/html/structsmtp__send__request.html
index 89890da..b3200ed 100644
--- a/doc/doxygen/output/html/structsmtp__send__request.html
+++ b/doc/doxygen/output/html/structsmtp__send__request.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsmtp__session.html b/doc/doxygen/output/html/structsmtp__session.html
index 8964fc9..d9a195c 100644
--- a/doc/doxygen/output/html/structsmtp__session.html
+++ b/doc/doxygen/output/html/structsmtp__session.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__leaf__node.html b/doc/doxygen/output/html/structsnmp__leaf__node.html
index fff1067..13d5600 100644
--- a/doc/doxygen/output/html/structsnmp__leaf__node.html
+++ b/doc/doxygen/output/html/structsnmp__leaf__node.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__mib.html b/doc/doxygen/output/html/structsnmp__mib.html
index 291a482..c3b4051 100644
--- a/doc/doxygen/output/html/structsnmp__mib.html
+++ b/doc/doxygen/output/html/structsnmp__mib.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__next__oid__state.html b/doc/doxygen/output/html/structsnmp__next__oid__state.html
index fb17030..e23a03e 100644
--- a/doc/doxygen/output/html/structsnmp__next__oid__state.html
+++ b/doc/doxygen/output/html/structsnmp__next__oid__state.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__node.html b/doc/doxygen/output/html/structsnmp__node.html
index f84256e..03a0d14 100644
--- a/doc/doxygen/output/html/structsnmp__node.html
+++ b/doc/doxygen/output/html/structsnmp__node.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__node__instance.html b/doc/doxygen/output/html/structsnmp__node__instance.html
index 846b565..df5481a 100644
--- a/doc/doxygen/output/html/structsnmp__node__instance.html
+++ b/doc/doxygen/output/html/structsnmp__node__instance.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__obj__id.html b/doc/doxygen/output/html/structsnmp__obj__id.html
index 534365a..2a2e64d 100644
--- a/doc/doxygen/output/html/structsnmp__obj__id.html
+++ b/doc/doxygen/output/html/structsnmp__obj__id.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__oid__range.html b/doc/doxygen/output/html/structsnmp__oid__range.html
index dd60810..6797a9f 100644
--- a/doc/doxygen/output/html/structsnmp__oid__range.html
+++ b/doc/doxygen/output/html/structsnmp__oid__range.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__scalar__array__node.html b/doc/doxygen/output/html/structsnmp__scalar__array__node.html
index 98a0fe3..4debc38 100644
--- a/doc/doxygen/output/html/structsnmp__scalar__array__node.html
+++ b/doc/doxygen/output/html/structsnmp__scalar__array__node.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__scalar__array__node__def.html b/doc/doxygen/output/html/structsnmp__scalar__array__node__def.html
index 4f16934..cd66572 100644
--- a/doc/doxygen/output/html/structsnmp__scalar__array__node__def.html
+++ b/doc/doxygen/output/html/structsnmp__scalar__array__node__def.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__scalar__node.html b/doc/doxygen/output/html/structsnmp__scalar__node.html
index 5070084..a21f817 100644
--- a/doc/doxygen/output/html/structsnmp__scalar__node.html
+++ b/doc/doxygen/output/html/structsnmp__scalar__node.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__table__col__def.html b/doc/doxygen/output/html/structsnmp__table__col__def.html
index 4d1055e..662ac83 100644
--- a/doc/doxygen/output/html/structsnmp__table__col__def.html
+++ b/doc/doxygen/output/html/structsnmp__table__col__def.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__table__node.html b/doc/doxygen/output/html/structsnmp__table__node.html
index bc8cba1..6c4399a 100644
--- a/doc/doxygen/output/html/structsnmp__table__node.html
+++ b/doc/doxygen/output/html/structsnmp__table__node.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__table__simple__node.html b/doc/doxygen/output/html/structsnmp__table__simple__node.html
index 0a950b3..5bedc08 100644
--- a/doc/doxygen/output/html/structsnmp__table__simple__node.html
+++ b/doc/doxygen/output/html/structsnmp__table__simple__node.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__threadsync__instance.html b/doc/doxygen/output/html/structsnmp__threadsync__instance.html
index 64e8b17..6a981b0 100644
--- a/doc/doxygen/output/html/structsnmp__threadsync__instance.html
+++ b/doc/doxygen/output/html/structsnmp__threadsync__instance.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -103,7 +103,7 @@
 
 <p><code>#include &lt;snmp_threadsync.h&gt;</code></p>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Thread sync instance. Needed EXCATLY once for every thread to be synced into. </p>
+<div class="textblock"><p>Thread sync instance. Needed EXACTLY once for every thread to be synced into. </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
 <li>src/include/lwip/apps/<a class="el" href="snmp__threadsync_8h.html">snmp_threadsync.h</a></li>
 </ul>
diff --git a/doc/doxygen/output/html/structsnmp__threadsync__node.html b/doc/doxygen/output/html/structsnmp__threadsync__node.html
index 6f1f0df..50cf1ef 100644
--- a/doc/doxygen/output/html/structsnmp__threadsync__node.html
+++ b/doc/doxygen/output/html/structsnmp__threadsync__node.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__tree__node.html b/doc/doxygen/output/html/structsnmp__tree__node.html
index 6b1af07..cfa7035 100644
--- a/doc/doxygen/output/html/structsnmp__tree__node.html
+++ b/doc/doxygen/output/html/structsnmp__tree__node.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsnmp__varbind.html b/doc/doxygen/output/html/structsnmp__varbind.html
index 0b161ee..4e1084b 100644
--- a/doc/doxygen/output/html/structsnmp__varbind.html
+++ b/doc/doxygen/output/html/structsnmp__varbind.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -121,7 +121,7 @@
 <tr class="separator:a328227d7ae188a0a2feb95f8000aac45"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>SNMP variable binding descriptor (publically needed for traps) </p>
+<div class="textblock"><p>SNMP variable binding descriptor (publicly needed for traps) </p>
 </div><h2 class="groupheader">Field Documentation</h2>
 <a id="a7388422ffb0607b209a39d6d3fcad40e" name="a7388422ffb0607b209a39d6d3fcad40e"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a7388422ffb0607b209a39d6d3fcad40e">&#9670;&#160;</a></span>next</h2>
diff --git a/doc/doxygen/output/html/structsnmp__varbind__len.html b/doc/doxygen/output/html/structsnmp__varbind__len.html
index a8a1cb6..ea77177 100644
--- a/doc/doxygen/output/html/structsnmp__varbind__len.html
+++ b/doc/doxygen/output/html/structsnmp__varbind__len.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsntp__msg.html b/doc/doxygen/output/html/structsntp__msg.html
index f239d25..3a991a6 100644
--- a/doc/doxygen/output/html/structsntp__msg.html
+++ b/doc/doxygen/output/html/structsntp__msg.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsntp__server.html b/doc/doxygen/output/html/structsntp__server.html
index d926b3d..5af4dd0 100644
--- a/doc/doxygen/output/html/structsntp__server.html
+++ b/doc/doxygen/output/html/structsntp__server.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsntp__time.html b/doc/doxygen/output/html/structsntp__time.html
index e1e402d..03b0d20 100644
--- a/doc/doxygen/output/html/structsntp__time.html
+++ b/doc/doxygen/output/html/structsntp__time.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structsntp__timestamps.html b/doc/doxygen/output/html/structsntp__timestamps.html
index 609fa85..d229454 100644
--- a/doc/doxygen/output/html/structsntp__timestamps.html
+++ b/doc/doxygen/output/html/structsntp__timestamps.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structstats__.html b/doc/doxygen/output/html/structstats__.html
index bcaa1a0..bacd06b 100644
--- a/doc/doxygen/output/html/structstats__.html
+++ b/doc/doxygen/output/html/structstats__.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structstats__igmp.html b/doc/doxygen/output/html/structstats__igmp.html
index f5f6f4a..0ab74be 100644
--- a/doc/doxygen/output/html/structstats__igmp.html
+++ b/doc/doxygen/output/html/structstats__igmp.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structstats__mem.html b/doc/doxygen/output/html/structstats__mem.html
index b4e7e33..adf77ce 100644
--- a/doc/doxygen/output/html/structstats__mem.html
+++ b/doc/doxygen/output/html/structstats__mem.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structstats__mib2.html b/doc/doxygen/output/html/structstats__mib2.html
index 118a1dd..0b19e83 100644
--- a/doc/doxygen/output/html/structstats__mib2.html
+++ b/doc/doxygen/output/html/structstats__mib2.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structstats__mib2__netif__ctrs.html b/doc/doxygen/output/html/structstats__mib2__netif__ctrs.html
index ff61b91..4b3dc2b 100644
--- a/doc/doxygen/output/html/structstats__mib2__netif__ctrs.html
+++ b/doc/doxygen/output/html/structstats__mib2__netif__ctrs.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structstats__proto.html b/doc/doxygen/output/html/structstats__proto.html
index df0a7b1..d070659 100644
--- a/doc/doxygen/output/html/structstats__proto.html
+++ b/doc/doxygen/output/html/structstats__proto.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structstats__sys.html b/doc/doxygen/output/html/structstats__sys.html
index 9a3a223..772d417 100644
--- a/doc/doxygen/output/html/structstats__sys.html
+++ b/doc/doxygen/output/html/structstats__sys.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structstats__syselem.html b/doc/doxygen/output/html/structstats__syselem.html
index 258240c..7485a84 100644
--- a/doc/doxygen/output/html/structstats__syselem.html
+++ b/doc/doxygen/output/html/structstats__syselem.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structt_c_g_i.html b/doc/doxygen/output/html/structt_c_g_i.html
index dda9990..8078779 100644
--- a/doc/doxygen/output/html/structt_c_g_i.html
+++ b/doc/doxygen/output/html/structt_c_g_i.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structtcp__ext__arg__callbacks.html b/doc/doxygen/output/html/structtcp__ext__arg__callbacks.html
index c78a84e..4c1d520 100644
--- a/doc/doxygen/output/html/structtcp__ext__arg__callbacks.html
+++ b/doc/doxygen/output/html/structtcp__ext__arg__callbacks.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structtcp__pcb.html b/doc/doxygen/output/html/structtcp__pcb.html
index 34b6772..4c95ea6 100644
--- a/doc/doxygen/output/html/structtcp__pcb.html
+++ b/doc/doxygen/output/html/structtcp__pcb.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structtcp__pcb__listen.html b/doc/doxygen/output/html/structtcp__pcb__listen.html
index b8a1e7c..5cfde25 100644
--- a/doc/doxygen/output/html/structtcp__pcb__listen.html
+++ b/doc/doxygen/output/html/structtcp__pcb__listen.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structtftp__context.html b/doc/doxygen/output/html/structtftp__context.html
index b6c5454..22de1d1 100644
--- a/doc/doxygen/output/html/structtftp__context.html
+++ b/doc/doxygen/output/html/structtftp__context.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -99,11 +99,11 @@
 <div class="header">
   <div class="summary">
 <a href="#pub-attribs">Data Fields</a>  </div>
-  <div class="headertitle"><div class="title">tftp_context Struct Reference<div class="ingroups"><a class="el" href="group__apps.html">Applications</a> &raquo; <a class="el" href="group__tftp.html">TFTP server</a></div></div></div>
+  <div class="headertitle"><div class="title">tftp_context Struct Reference<div class="ingroups"><a class="el" href="group__apps.html">Applications</a> &raquo; <a class="el" href="group__tftp.html">TFTP client/server</a></div></div></div>
 </div><!--header-->
 <div class="contents">
 
-<p><code>#include &lt;tftp_server.h&gt;</code></p>
+<p><code>#include &lt;tftp_common.h&gt;</code></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
 Data Fields</h2></td></tr>
@@ -115,6 +115,8 @@
 <tr class="separator:a748e37df0c8b84b3adda78d603b9033c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a9e6e4ec803ec9597822923369701754d" id="r_a9e6e4ec803ec9597822923369701754d"><td class="memItemLeft" align="right" valign="top">int(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9e6e4ec803ec9597822923369701754d">write</a> )(void *handle, struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
 <tr class="separator:a9e6e4ec803ec9597822923369701754d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a39cbb84a9c0eaa8ea62d183ba8214519" id="r_a39cbb84a9c0eaa8ea62d183ba8214519"><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a39cbb84a9c0eaa8ea62d183ba8214519">error</a> )(void *handle, int err, const char *msg, int size)</td></tr>
+<tr class="separator:a39cbb84a9c0eaa8ea62d183ba8214519"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>TFTP context containing callback functions for TFTP transfers </p>
@@ -132,7 +134,30 @@
 </div><div class="memdoc">
 <p>Close file handle </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">handle</td><td>File handle returned by <a class="el" href="#a65d6359e2aac571813c05c61676c01a1">open()</a> </td></tr>
+    <tr><td class="paramname">handle</td><td>File handle returned by <a class="el" href="#a65d6359e2aac571813c05c61676c01a1">open()</a>/tftp_put()/tftp_get() </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a39cbb84a9c0eaa8ea62d183ba8214519" name="a39cbb84a9c0eaa8ea62d183ba8214519"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a39cbb84a9c0eaa8ea62d183ba8214519">&#9670;&#160;</a></span>error</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void(* tftp_context::error) (void *handle, int err, const char *msg, int size)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Error indication from client or response from server </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">handle</td><td>File handle set by <a class="el" href="#a65d6359e2aac571813c05c61676c01a1">open()</a>/tftp_get()/tftp_put() </td></tr>
+    <tr><td class="paramname">err</td><td>error code from client or server </td></tr>
+    <tr><td class="paramname">msg</td><td>error message from client or server </td></tr>
+    <tr><td class="paramname">size</td><td>size of msg </td></tr>
   </table>
   </dd>
 </dl>
@@ -150,7 +175,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Open file for read/write. </p><dl class="params"><dt>Parameters</dt><dd>
+<p>Open file for read/write (server mode only). </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">fname</td><td>Filename </td></tr>
     <tr><td class="paramname">mode</td><td>Mode string from TFTP RFC 1350 (netascii, octet, mail) </td></tr>
@@ -175,7 +200,7 @@
 </div><div class="memdoc">
 <p>Read from file </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">handle</td><td>File handle returned by <a class="el" href="#a65d6359e2aac571813c05c61676c01a1">open()</a> </td></tr>
+    <tr><td class="paramname">handle</td><td>File handle returned by <a class="el" href="#a65d6359e2aac571813c05c61676c01a1">open()</a>/tftp_put()/tftp_get() </td></tr>
     <tr><td class="paramname">buf</td><td>Target buffer to copy read data to </td></tr>
     <tr><td class="paramname">bytes</td><td>Number of bytes to copy to buf </td></tr>
   </table>
@@ -198,7 +223,7 @@
 </div><div class="memdoc">
 <p>Write to file </p><dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">handle</td><td>File handle returned by <a class="el" href="#a65d6359e2aac571813c05c61676c01a1">open()</a> </td></tr>
+    <tr><td class="paramname">handle</td><td>File handle returned by <a class="el" href="#a65d6359e2aac571813c05c61676c01a1">open()</a>/tftp_put()/tftp_get() </td></tr>
     <tr><td class="paramname">pbuf</td><td>PBUF adjusted such that payload pointer points to the beginning of write data. In other words, TFTP headers are stripped off. </td></tr>
   </table>
   </dd>
@@ -208,7 +233,7 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li>src/include/lwip/apps/<a class="el" href="tftp__server_8h.html">tftp_server.h</a></li>
+<li>src/include/lwip/apps/<a class="el" href="tftp__common_8h.html">tftp_common.h</a></li>
 </ul>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/doxygen/output/html/structtftp__context.js b/doc/doxygen/output/html/structtftp__context.js
index e823ecb..9323d06 100644
--- a/doc/doxygen/output/html/structtftp__context.js
+++ b/doc/doxygen/output/html/structtftp__context.js
@@ -1,6 +1,7 @@
 var structtftp__context =
 [
     [ "close", "structtftp__context.html#ae9181c57d1cf89bc263f7671e5630a65", null ],
+    [ "error", "structtftp__context.html#a39cbb84a9c0eaa8ea62d183ba8214519", null ],
     [ "open", "structtftp__context.html#a65d6359e2aac571813c05c61676c01a1", null ],
     [ "read", "structtftp__context.html#a748e37df0c8b84b3adda78d603b9033c", null ],
     [ "write", "structtftp__context.html#a9e6e4ec803ec9597822923369701754d", null ]
diff --git a/doc/doxygen/output/html/structthreadsync__data.html b/doc/doxygen/output/html/structthreadsync__data.html
index 4eee529..ec61be0 100644
--- a/doc/doxygen/output/html/structthreadsync__data.html
+++ b/doc/doxygen/output/html/structthreadsync__data.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structudp__pcb.html b/doc/doxygen/output/html/structudp__pcb.html
index 4f4c4d9..4dc105c 100644
--- a/doc/doxygen/output/html/structudp__pcb.html
+++ b/doc/doxygen/output/html/structudp__pcb.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/structzepif__init.html b/doc/doxygen/output/html/structzepif__init.html
index 8a0e844..a9dd9b6 100644
--- a/doc/doxygen/output/html/structzepif__init.html
+++ b/doc/doxygen/output/html/structzepif__init.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/sys_8c.html b/doc/doxygen/output/html/sys_8c.html
index 6b4fcad..5e6ff40 100644
--- a/doc/doxygen/output/html/sys_8c.html
+++ b/doc/doxygen/output/html/sys_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/sys_8h.html b/doc/doxygen/output/html/sys_8h.html
index 0c38ff5..849bb89 100644
--- a/doc/doxygen/output/html/sys_8h.html
+++ b/doc/doxygen/output/html/sys_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -128,6 +128,8 @@
 <tr class="separator:aae82640d0bdbeec7b9b6511b3f8d99cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae293feebb61d36f2db99be53702b8203" id="r_ae293feebb61d36f2db99be53702b8203"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ae293feebb61d36f2db99be53702b8203">sys_mbox_set_invalid_val</a>(mbox)</td></tr>
 <tr class="separator:ae293feebb61d36f2db99be53702b8203"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gab97d014f7ecf3b20f9d5abc2d0a79a3e" id="r_gab97d014f7ecf3b20f9d5abc2d0a79a3e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e">LWIP_MARK_TCPIP_THREAD</a>()</td></tr>
+<tr class="separator:gab97d014f7ecf3b20f9d5abc2d0a79a3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga945395fa326214fc9736487242710a90" id="r_ga945395fa326214fc9736487242710a90"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__prot.html#ga945395fa326214fc9736487242710a90">SYS_ARCH_DECL_PROTECT</a>(lev)</td></tr>
 <tr class="separator:ga945395fa326214fc9736487242710a90"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga3d0e48feafd378e9c26c64567ecd8bab" id="r_ga3d0e48feafd378e9c26c64567ecd8bab"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab">SYS_ARCH_PROTECT</a>(lev)</td></tr>
diff --git a/doc/doxygen/output/html/sys_8h.js b/doc/doxygen/output/html/sys_8h.js
index 54279aa..ef0bb79 100644
--- a/doc/doxygen/output/html/sys_8h.js
+++ b/doc/doxygen/output/html/sys_8h.js
@@ -1,6 +1,7 @@
 var sys_8h =
 [
     [ "LWIP_COMPAT_MUTEX", "sys_8h.html#a7bada49634cd3b28b28bdcedd763a1e6", null ],
+    [ "LWIP_MARK_TCPIP_THREAD", "group__lwip__opts__lock.html#gab97d014f7ecf3b20f9d5abc2d0a79a3e", null ],
     [ "SYS_ARCH_DECL_PROTECT", "group__sys__prot.html#ga945395fa326214fc9736487242710a90", null ],
     [ "SYS_ARCH_PROTECT", "group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab", null ],
     [ "SYS_ARCH_TIMEOUT", "sys_8h.html#ac1495030a8ab5e1f3c89e42ced527c5b", null ],
diff --git a/doc/doxygen/output/html/sys_init.html b/doc/doxygen/output/html/sys_init.html
index 01fdf2e..6389ab6 100644
--- a/doc/doxygen/output/html/sys_init.html
+++ b/doc/doxygen/output/html/sys_init.html
@@ -5,7 +5,7 @@
 <meta http-equiv="X-UA-Compatible" content="IE=11"/>
 <meta name="generator" content="Doxygen 1.12.0"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>lwIP: System initalization</title>
+<title>lwIP: System initialization</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -97,7 +97,7 @@
 </div>
 
 <div><div class="header">
-  <div class="headertitle"><div class="title">System initalization</div></div>
+  <div class="headertitle"><div class="title">System initialization</div></div>
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><p>A truly complete and generic sequence for initializing the lwIP stack cannot be given because it depends on additional initializations for your runtime environment (e.g. timers).</p>
@@ -112,7 +112,7 @@
 <div class="fragment"><div class="line"><a class="code hl_typedef" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> netif_if_init(<span class="keyword">struct</span> <a class="code hl_struct" href="structnetif.html">netif</a> *<a class="code hl_struct" href="structnetif.html">netif</a>)</div>
 <div class="line">{</div>
 <div class="line">  u8_t i;</div>
-<div class="line">  </div>
+<div class="line"> </div>
 <div class="line">  <span class="keywordflow">for</span> (i = 0; i &lt; ETHARP_HWADDR_LEN; i++) {</div>
 <div class="line">    <a class="code hl_struct" href="structnetif.html">netif</a>-&gt;<a class="code hl_variable" href="structnetif.html#aee967965d999fc1a4c40a66709304e69">hwaddr</a>[i] = some_eth_addr[i];</div>
 <div class="line">  }</div>
@@ -121,8 +121,8 @@
 <div class="line">}</div>
 <div class="ttc" id="agroup__infrastructure__errors_html_gaf02d9da80fd66b4f986d2c53d7231ddb"><div class="ttname"><a href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a></div><div class="ttdeci">s8_t err_t</div><div class="ttdef"><b>Definition</b> err.h:96</div></div>
 <div class="ttc" id="agroup__infrastructure__errors_html_ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb"><div class="ttname"><a href="group__infrastructure__errors.html#ggae2e66c7d13afc90ffecd6151680fbadcaa26c163b80b1f6786ca81dadc14b00fb">ERR_OK</a></div><div class="ttdeci">@ ERR_OK</div><div class="ttdef"><b>Definition</b> err.h:55</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
-<div class="ttc" id="astructnetif_html_aee967965d999fc1a4c40a66709304e69"><div class="ttname"><a href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif::hwaddr</a></div><div class="ttdeci">u8_t hwaddr[6U]</div><div class="ttdef"><b>Definition</b> netif.h:341</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
+<div class="ttc" id="astructnetif_html_aee967965d999fc1a4c40a66709304e69"><div class="ttname"><a href="structnetif.html#aee967965d999fc1a4c40a66709304e69">netif::hwaddr</a></div><div class="ttdeci">u8_t hwaddr[6U]</div><div class="ttdef"><b>Definition</b> netif.h:350</div></div>
 </div><!-- fragment --><p>For Ethernet drivers, the input function pointer must point to the lwIP function <a class="el" href="group__lwip__nosys.html#ga6a10c58b82c56d02c48b3cfa2c2494ff">ethernet_input()</a> declared in "netif/etharp.h". Other drivers must use <a class="el" href="group__lwip__nosys.html#ga3c420dab0c6760df099a2d688fa42a26">ip_input()</a> declared in "lwip/ip.h".</p>
 <ul>
 <li><a class="el" href="group__netif.html#gac90f290edd005238d62aa94c4ac9dea3">netif_set_default(struct netif *netif)</a> Registers the default network interface.</li>
diff --git a/doc/doxygen/output/html/tcp_8c.html b/doc/doxygen/output/html/tcp_8c.html
index f4a1784..3f7e2f9 100644
--- a/doc/doxygen/output/html/tcp_8c.html
+++ b/doc/doxygen/output/html/tcp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -163,8 +163,8 @@
 <tr class="separator:a3d9bb9809769197bce9b2499d55cf28c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ac6283651b26f74dba2444159aee88b20" id="r_ac6283651b26f74dba2444159aee88b20"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac6283651b26f74dba2444159aee88b20">tcp_seg_free</a> (struct tcp_seg *seg)</td></tr>
 <tr class="separator:ac6283651b26f74dba2444159aee88b20"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a2c4234f1e95b6bde0e84d4ea97ae95bc" id="r_a2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2c4234f1e95b6bde0e84d4ea97ae95bc">tcp_setprio</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t prio)</td></tr>
-<tr class="separator:a2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2c4234f1e95b6bde0e84d4ea97ae95bc" id="r_ga2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc">tcp_setprio</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t prio)</td></tr>
+<tr class="separator:ga2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a9384b436de95d5bf8550438b9d3c8cd4" id="r_a9384b436de95d5bf8550438b9d3c8cd4"><td class="memItemLeft" align="right" valign="top">struct tcp_seg *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a9384b436de95d5bf8550438b9d3c8cd4">tcp_seg_copy</a> (struct tcp_seg *seg)</td></tr>
 <tr class="separator:a9384b436de95d5bf8550438b9d3c8cd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a0cb3f604fc8d20870d8cab291da5701c" id="r_a0cb3f604fc8d20870d8cab291da5701c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a0cb3f604fc8d20870d8cab291da5701c">tcp_recv_null</a> (void *arg, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, struct <a class="el" href="structpbuf.html">pbuf</a> *p, <a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> err)</td></tr>
@@ -199,12 +199,12 @@
 <tr class="separator:a4d0c2d1ad02134c79fc72fe95ee2a703"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga4836e0b4f66439493e106a50400d1616" id="r_ga4836e0b4f66439493e106a50400d1616"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp_ext_arg_alloc_id</a> (void)</td></tr>
 <tr class="separator:ga4836e0b4f66439493e106a50400d1616"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga36e60dc02bfe0437c8da368a62e2f316" id="r_ga36e60dc02bfe0437c8da368a62e2f316"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316">tcp_ext_arg_set_callbacks</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, uint8_t id, const struct <a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a> *const callbacks)</td></tr>
-<tr class="separator:ga36e60dc02bfe0437c8da368a62e2f316"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga58500cb2ce22438e16a37373595af318" id="r_ga58500cb2ce22438e16a37373595af318"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318">tcp_ext_arg_set</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, uint8_t id, void *arg)</td></tr>
-<tr class="separator:ga58500cb2ce22438e16a37373595af318"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gadc7aa96ddd15fb6598523068b89f8855" id="r_gadc7aa96ddd15fb6598523068b89f8855"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855">tcp_ext_arg_get</a> (const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, uint8_t id)</td></tr>
-<tr class="separator:gadc7aa96ddd15fb6598523068b89f8855"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaacea54ce1154e7ae8ef0199ff1c5bdc5" id="r_gaacea54ce1154e7ae8ef0199ff1c5bdc5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5">tcp_ext_arg_set_callbacks</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t id, const struct <a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a> *const callbacks)</td></tr>
+<tr class="separator:gaacea54ce1154e7ae8ef0199ff1c5bdc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf5c2397b2d85b3a902584fb64cdb961e" id="r_gaf5c2397b2d85b3a902584fb64cdb961e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e">tcp_ext_arg_set</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t id, void *arg)</td></tr>
+<tr class="separator:gaf5c2397b2d85b3a902584fb64cdb961e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7499018469cd9c3dc6a15ad91c338e56" id="r_ga7499018469cd9c3dc6a15ad91c338e56"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56">tcp_ext_arg_get</a> (const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t id)</td></tr>
+<tr class="separator:ga7499018469cd9c3dc6a15ad91c338e56"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a5265b1df024d04287ed3edc02b1b9ccc" id="r_a5265b1df024d04287ed3edc02b1b9ccc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5265b1df024d04287ed3edc02b1b9ccc">tcp_ext_arg_invoke_callbacks_passive_open</a> (struct <a class="el" href="structtcp__pcb__listen.html">tcp_pcb_listen</a> *lpcb, struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *cpcb)</td></tr>
 <tr class="separator:a5265b1df024d04287ed3edc02b1b9ccc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
@@ -606,35 +606,6 @@
 
 </div>
 </div>
-<a id="a2c4234f1e95b6bde0e84d4ea97ae95bc" name="a2c4234f1e95b6bde0e84d4ea97ae95bc"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a2c4234f1e95b6bde0e84d4ea97ae95bc">&#9670;&#160;</a></span>tcp_setprio()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tcp_setprio </td>
-          <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *</td>          <td class="paramname"><span class="paramname"><em>pcb</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>prio</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Sets the priority of a connection.</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">pcb</td><td>the <a class="el" href="structtcp__pcb.html">tcp_pcb</a> to manipulate </td></tr>
-    <tr><td class="paramname">prio</td><td>new priority </td></tr>
-  </table>
-  </dd>
-</dl>
-
-</div>
-</div>
 <a id="a421fb42ef919018e14ae413adfee9905" name="a421fb42ef919018e14ae413adfee9905"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a421fb42ef919018e14ae413adfee9905">&#9670;&#160;</a></span>tcp_slowtmr()</h2>
 
diff --git a/doc/doxygen/output/html/tcp_8c.js b/doc/doxygen/output/html/tcp_8c.js
index 87163a7..5ecfe95 100644
--- a/doc/doxygen/output/html/tcp_8c.js
+++ b/doc/doxygen/output/html/tcp_8c.js
@@ -14,10 +14,10 @@
     [ "tcp_eff_send_mss_netif", "tcp_8c.html#a08a3b5396c40f32dd8b21e7d63b3e1b3", null ],
     [ "tcp_err", "group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121", null ],
     [ "tcp_ext_arg_alloc_id", "group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616", null ],
-    [ "tcp_ext_arg_get", "group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855", null ],
+    [ "tcp_ext_arg_get", "group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56", null ],
     [ "tcp_ext_arg_invoke_callbacks_passive_open", "tcp_8c.html#a5265b1df024d04287ed3edc02b1b9ccc", null ],
-    [ "tcp_ext_arg_set", "group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318", null ],
-    [ "tcp_ext_arg_set_callbacks", "group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316", null ],
+    [ "tcp_ext_arg_set", "group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e", null ],
+    [ "tcp_ext_arg_set_callbacks", "group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5", null ],
     [ "tcp_fasttmr", "tcp_8c.html#abf446b07e52161b8a53cea07bc6c366d", null ],
     [ "tcp_free", "tcp_8c.html#aa2b6b075c27c64dfb8c402ac961fb910", null ],
     [ "tcp_init", "tcp_8c.html#a51de4ded7d342456d31722493c92c969", null ],
@@ -38,7 +38,7 @@
     [ "tcp_seg_free", "tcp_8c.html#ac6283651b26f74dba2444159aee88b20", null ],
     [ "tcp_segs_free", "tcp_8c.html#a3d9bb9809769197bce9b2499d55cf28c", null ],
     [ "tcp_sent", "group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808", null ],
-    [ "tcp_setprio", "tcp_8c.html#a2c4234f1e95b6bde0e84d4ea97ae95bc", null ],
+    [ "tcp_setprio", "group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc", null ],
     [ "tcp_shutdown", "group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd", null ],
     [ "tcp_slowtmr", "tcp_8c.html#a421fb42ef919018e14ae413adfee9905", null ],
     [ "tcp_tmr", "tcp_8c.html#a3846a756b13214ed88ea47d0ff8279eb", null ],
diff --git a/doc/doxygen/output/html/tcp_8h.html b/doc/doxygen/output/html/tcp_8h.html
index cec59ca..f2dbc1e 100644
--- a/doc/doxygen/output/html/tcp_8h.html
+++ b/doc/doxygen/output/html/tcp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -190,22 +190,22 @@
 <tr class="separator:ga5b94d57f1891b9287f88525a2ac561dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga6b2aa0efbf10e254930332b7c89cd8c5" id="r_ga6b2aa0efbf10e254930332b7c89cd8c5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5">tcp_write</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, const void *dataptr, u16_t len, u8_t apiflags)</td></tr>
 <tr class="separator:ga6b2aa0efbf10e254930332b7c89cd8c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a2c4234f1e95b6bde0e84d4ea97ae95bc" id="r_a2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2c4234f1e95b6bde0e84d4ea97ae95bc">tcp_setprio</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t prio)</td></tr>
-<tr class="separator:a2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga2c4234f1e95b6bde0e84d4ea97ae95bc" id="r_ga2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc">tcp_setprio</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t prio)</td></tr>
+<tr class="separator:ga2c4234f1e95b6bde0e84d4ea97ae95bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga0cbcc6d628f644a530daf629fa3e5f7f" id="r_ga0cbcc6d628f644a530daf629fa3e5f7f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw.html#ga0cbcc6d628f644a530daf629fa3e5f7f">tcp_output</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
 <tr class="separator:ga0cbcc6d628f644a530daf629fa3e5f7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga4836e0b4f66439493e106a50400d1616" id="r_ga4836e0b4f66439493e106a50400d1616"><td class="memItemLeft" align="right" valign="top">u8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp_ext_arg_alloc_id</a> (void)</td></tr>
 <tr class="separator:ga4836e0b4f66439493e106a50400d1616"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga36e60dc02bfe0437c8da368a62e2f316" id="r_ga36e60dc02bfe0437c8da368a62e2f316"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316">tcp_ext_arg_set_callbacks</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, uint8_t id, const struct <a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a> *const callbacks)</td></tr>
-<tr class="separator:ga36e60dc02bfe0437c8da368a62e2f316"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ga58500cb2ce22438e16a37373595af318" id="r_ga58500cb2ce22438e16a37373595af318"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318">tcp_ext_arg_set</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, uint8_t id, void *arg)</td></tr>
-<tr class="separator:ga58500cb2ce22438e16a37373595af318"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gadc7aa96ddd15fb6598523068b89f8855" id="r_gadc7aa96ddd15fb6598523068b89f8855"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855">tcp_ext_arg_get</a> (const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, uint8_t id)</td></tr>
-<tr class="separator:gadc7aa96ddd15fb6598523068b89f8855"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaacea54ce1154e7ae8ef0199ff1c5bdc5" id="r_gaacea54ce1154e7ae8ef0199ff1c5bdc5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5">tcp_ext_arg_set_callbacks</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t id, const struct <a class="el" href="structtcp__ext__arg__callbacks.html">tcp_ext_arg_callbacks</a> *const callbacks)</td></tr>
+<tr class="separator:gaacea54ce1154e7ae8ef0199ff1c5bdc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaf5c2397b2d85b3a902584fb64cdb961e" id="r_gaf5c2397b2d85b3a902584fb64cdb961e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e">tcp_ext_arg_set</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t id, void *arg)</td></tr>
+<tr class="separator:gaf5c2397b2d85b3a902584fb64cdb961e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga7499018469cd9c3dc6a15ad91c338e56" id="r_ga7499018469cd9c3dc6a15ad91c338e56"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56">tcp_ext_arg_get</a> (const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u8_t id)</td></tr>
+<tr class="separator:ga7499018469cd9c3dc6a15ad91c338e56"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>TCP API (to be used from TCPIP thread)<br  />
-See also <a class="el" href="group__tcp__raw.html">TCP</a> </p>
+ See also <a class="el" href="group__tcp__raw.html">TCP</a> </p>
 </div><h2 class="groupheader">Macro Definition Documentation</h2>
 <a id="a874630045102fc5f1442704a790c8bb8" name="a874630045102fc5f1442704a790c8bb8"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a874630045102fc5f1442704a790c8bb8">&#9670;&#160;</a></span>TCP_PCB_COMMON</h2>
@@ -360,7 +360,7 @@
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramname">id</td><td>ext arg id (allocated via <a class="el" href="group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616">tcp_ext_arg_alloc_id</a>) </td></tr>
-    <tr><td class="paramname">data</td><td>pointer to the data (set via <a class="el" href="group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318">tcp_ext_arg_set</a> before) </td></tr>
+    <tr><td class="paramname">data</td><td>pointer to the data (set via <a class="el" href="group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e">tcp_ext_arg_set</a> before) </td></tr>
   </table>
   </dd>
 </dl>
@@ -456,36 +456,6 @@
 
 </div>
 </div>
-<h2 class="groupheader">Function Documentation</h2>
-<a id="a2c4234f1e95b6bde0e84d4ea97ae95bc" name="a2c4234f1e95b6bde0e84d4ea97ae95bc"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a2c4234f1e95b6bde0e84d4ea97ae95bc">&#9670;&#160;</a></span>tcp_setprio()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tcp_setprio </td>
-          <td>(</td>
-          <td class="paramtype">struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *</td>          <td class="paramname"><span class="paramname"><em>pcb</em></span>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>prio</em></span>&#160;)</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-<p>Sets the priority of a connection.</p>
-<dl class="params"><dt>Parameters</dt><dd>
-  <table class="params">
-    <tr><td class="paramname">pcb</td><td>the <a class="el" href="structtcp__pcb.html">tcp_pcb</a> to manipulate </td></tr>
-    <tr><td class="paramname">prio</td><td>new priority </td></tr>
-  </table>
-  </dd>
-</dl>
-
-</div>
-</div>
 </div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/doxygen/output/html/tcp_8h.js b/doc/doxygen/output/html/tcp_8h.js
index 223b12e..013c282 100644
--- a/doc/doxygen/output/html/tcp_8h.js
+++ b/doc/doxygen/output/html/tcp_8h.js
@@ -23,9 +23,9 @@
     [ "tcp_connect", "group__tcp__raw.html#ga9a31deea4cadacd39f9485f37cfdd012", null ],
     [ "tcp_err", "group__tcp__raw.html#gae1346c4e34d3bc7c01e1b47142ab3121", null ],
     [ "tcp_ext_arg_alloc_id", "group__tcp__raw__extargs.html#ga4836e0b4f66439493e106a50400d1616", null ],
-    [ "tcp_ext_arg_get", "group__tcp__raw__extargs.html#gadc7aa96ddd15fb6598523068b89f8855", null ],
-    [ "tcp_ext_arg_set", "group__tcp__raw__extargs.html#ga58500cb2ce22438e16a37373595af318", null ],
-    [ "tcp_ext_arg_set_callbacks", "group__tcp__raw__extargs.html#ga36e60dc02bfe0437c8da368a62e2f316", null ],
+    [ "tcp_ext_arg_get", "group__tcp__raw__extargs.html#ga7499018469cd9c3dc6a15ad91c338e56", null ],
+    [ "tcp_ext_arg_set", "group__tcp__raw__extargs.html#gaf5c2397b2d85b3a902584fb64cdb961e", null ],
+    [ "tcp_ext_arg_set_callbacks", "group__tcp__raw__extargs.html#gaacea54ce1154e7ae8ef0199ff1c5bdc5", null ],
     [ "tcp_listen_with_backlog", "group__tcp__raw.html#ga77bb2ca7f053e73545d36b745f236d54", null ],
     [ "tcp_listen_with_backlog_and_err", "group__tcp__raw.html#ga8883f9735809f1679d744bc48f1c674a", null ],
     [ "tcp_new", "group__tcp__raw.html#ga2e00c668b99d92113cd595647702be83", null ],
@@ -35,7 +35,7 @@
     [ "tcp_recv", "group__tcp__raw.html#ga8afd0b316a87a5eeff4726dc95006ed0", null ],
     [ "tcp_recved", "group__tcp__raw.html#gabdac0856a52b5789dc897d4c7137ec44", null ],
     [ "tcp_sent", "group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808", null ],
-    [ "tcp_setprio", "tcp_8h.html#a2c4234f1e95b6bde0e84d4ea97ae95bc", null ],
+    [ "tcp_setprio", "group__tcp__raw.html#ga2c4234f1e95b6bde0e84d4ea97ae95bc", null ],
     [ "tcp_shutdown", "group__tcp__raw.html#ga5b94d57f1891b9287f88525a2ac561dd", null ],
     [ "tcp_write", "group__tcp__raw.html#ga6b2aa0efbf10e254930332b7c89cd8c5", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tcp__in_8c.html b/doc/doxygen/output/html/tcp__in_8c.html
index c222ef0..6a6f312 100644
--- a/doc/doxygen/output/html/tcp__in_8c.html
+++ b/doc/doxygen/output/html/tcp__in_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/tcp__out_8c.html b/doc/doxygen/output/html/tcp__out_8c.html
index ce48985..cb35b17 100644
--- a/doc/doxygen/output/html/tcp__out_8c.html
+++ b/doc/doxygen/output/html/tcp__out_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -148,6 +148,8 @@
 <tr class="separator:adb6ee7b4d59f125cc8bfac3bb5ca3937"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa90f8051c9633d3017c588245cdc4014" id="r_aa90f8051c9633d3017c588245cdc4014"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa90f8051c9633d3017c588245cdc4014">tcp_rst</a> (const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u32_t seqno, u32_t ackno, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *local_ip, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *remote_ip, u16_t local_port, u16_t remote_port)</td></tr>
 <tr class="separator:aa90f8051c9633d3017c588245cdc4014"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7cf7cbc5aa473de8116dc9f00cbc5d57" id="r_a7cf7cbc5aa473de8116dc9f00cbc5d57"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7cf7cbc5aa473de8116dc9f00cbc5d57">tcp_rst_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u32_t seqno, u32_t ackno, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *local_ip, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *remote_ip, u16_t local_port, u16_t remote_port)</td></tr>
+<tr class="separator:a7cf7cbc5aa473de8116dc9f00cbc5d57"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aefde3e34b2cc8df9654986484c44a996" id="r_aefde3e34b2cc8df9654986484c44a996"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aefde3e34b2cc8df9654986484c44a996">tcp_send_empty_ack</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
 <tr class="separator:aefde3e34b2cc8df9654986484c44a996"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a0d8bb5fc8522515aa35d305774cc5332" id="r_a0d8bb5fc8522515aa35d305774cc5332"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a0d8bb5fc8522515aa35d305774cc5332">tcp_keepalive</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
@@ -189,7 +191,7 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Define this to 1 for an extra check that the output checksum is valid (usefule when the checksum is generated by the application, not the stack) </p>
+<p>Define this to 1 for an extra check that the output checksum is valid (useful when the checksum is generated by the application, not the stack) </p>
 
 </div>
 </div>
@@ -208,7 +210,7 @@
       </table>
 </div><div class="memdoc">
 <b>Value:</b><div class="fragment"><div class="line">((length) + <a class="code hl_define" href="group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef">TCP_OVERSIZE</a>)</div>
-<div class="ttc" id="agroup__lwip__opts__tcp_html_ga5648e2580bb55c0efdfbebcf3bad1eef"><div class="ttname"><a href="group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef">TCP_OVERSIZE</a></div><div class="ttdeci">#define TCP_OVERSIZE</div><div class="ttdef"><b>Definition</b> opt.h:1420</div></div>
+<div class="ttc" id="agroup__lwip__opts__tcp_html_ga5648e2580bb55c0efdfbebcf3bad1eef"><div class="ttname"><a href="group__lwip__opts__tcp.html#ga5648e2580bb55c0efdfbebcf3bad1eef">TCP_OVERSIZE</a></div><div class="ttdeci">#define TCP_OVERSIZE</div><div class="ttdef"><b>Definition</b> opt.h:1471</div></div>
 </div><!-- fragment --><p>The size of segment pbufs created when TCP_OVERSIZE is enabled </p>
 
 </div>
@@ -436,8 +438,8 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Send a TCP RESET packet (empty segment with RST flag set) either to abort a connection or to show that there is no matching local connection for a received segment.</p>
-<p>Called by <a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp_abort()</a> (to abort a local connection), <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_input()</a> (if no matching local pcb was found), tcp_listen_input() (if incoming segment has ACK flag set) and tcp_process() (received segment in the wrong state)</p>
+<p>Send a TCP RESET packet (empty segment with RST flag set) to abort a connection.</p>
+<p>Called by <a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp_abort()</a> (to abort a local connection), tcp_closen() (if not all data has been received by the application), tcp_timewait_input() (if a SYN is received) and tcp_process() (received segment in the wrong state).</p>
 <p>Since a RST segment is in most cases not sent for an active connection, <a class="el" href="#aa90f8051c9633d3017c588245cdc4014">tcp_rst()</a> has a number of arguments that are taken from a <a class="el" href="structtcp__pcb.html">tcp_pcb</a> for most other segment output functions.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
@@ -454,6 +456,67 @@
 
 </div>
 </div>
+<a id="a7cf7cbc5aa473de8116dc9f00cbc5d57" name="a7cf7cbc5aa473de8116dc9f00cbc5d57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7cf7cbc5aa473de8116dc9f00cbc5d57">&#9670;&#160;</a></span>tcp_rst_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rst_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t</td>          <td class="paramname"><span class="paramname"><em>seqno</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t</td>          <td class="paramname"><span class="paramname"><em>ackno</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>local_ip</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>remote_ip</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t</td>          <td class="paramname"><span class="paramname"><em>local_port</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t</td>          <td class="paramname"><span class="paramname"><em>remote_port</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send a TCP RESET packet (empty segment with RST flag set) to show that there is no matching local connection for a received segment.</p>
+<p>Called by <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_input()</a> (if no matching local pcb was found) and tcp_listen_input() (if incoming segment has ACK flag set).</p>
+<p>Since a RST segment is in most cases not sent for an active connection, <a class="el" href="#aa90f8051c9633d3017c588245cdc4014">tcp_rst()</a> has a number of arguments that are taken from a <a class="el" href="structtcp__pcb.html">tcp_pcb</a> for most other segment output functions.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif on which to send the RST (since we have no pcb) </td></tr>
+    <tr><td class="paramname">seqno</td><td>the sequence number to use for the outgoing segment </td></tr>
+    <tr><td class="paramname">ackno</td><td>the acknowledge number to use for the outgoing segment </td></tr>
+    <tr><td class="paramname">local_ip</td><td>the local IP address to send the segment from </td></tr>
+    <tr><td class="paramname">remote_ip</td><td>the remote IP address to send the segment to </td></tr>
+    <tr><td class="paramname">local_port</td><td>the local TCP port to send the segment from </td></tr>
+    <tr><td class="paramname">remote_port</td><td>the remote TCP port to send the segment to </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 <a id="aefde3e34b2cc8df9654986484c44a996" name="aefde3e34b2cc8df9654986484c44a996"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aefde3e34b2cc8df9654986484c44a996">&#9670;&#160;</a></span>tcp_send_empty_ack()</h2>
 
diff --git a/doc/doxygen/output/html/tcp__out_8c.js b/doc/doxygen/output/html/tcp__out_8c.js
index 39712b9..21b6438 100644
--- a/doc/doxygen/output/html/tcp__out_8c.js
+++ b/doc/doxygen/output/html/tcp__out_8c.js
@@ -11,6 +11,7 @@
     [ "tcp_rexmit_rto_commit", "tcp__out_8c.html#a9ef9dc094e21bdf0779aed25ab0b08d4", null ],
     [ "tcp_rexmit_rto_prepare", "tcp__out_8c.html#a1f318930bd6d49074343cc79c5166f39", null ],
     [ "tcp_rst", "tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014", null ],
+    [ "tcp_rst_netif", "tcp__out_8c.html#a7cf7cbc5aa473de8116dc9f00cbc5d57", null ],
     [ "tcp_send_empty_ack", "tcp__out_8c.html#aefde3e34b2cc8df9654986484c44a996", null ],
     [ "tcp_send_fin", "tcp__out_8c.html#af40ba9d645a8910436c3d7cf13dba342", null ],
     [ "tcp_split_unsent_seg", "tcp__out_8c.html#ac930859c4e4ad9fcf6bb25ef5e91bcd5", null ],
diff --git a/doc/doxygen/output/html/tcp__priv_8h.html b/doc/doxygen/output/html/tcp__priv_8h.html
index b6b071b..888534e 100644
--- a/doc/doxygen/output/html/tcp__priv_8h.html
+++ b/doc/doxygen/output/html/tcp__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -180,6 +180,8 @@
 <tr class="separator:aa7d5d552647d567095876aab202bfd1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa90f8051c9633d3017c588245cdc4014" id="r_aa90f8051c9633d3017c588245cdc4014"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa90f8051c9633d3017c588245cdc4014">tcp_rst</a> (const struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb, u32_t seqno, u32_t ackno, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *local_ip, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *remote_ip, u16_t local_port, u16_t remote_port)</td></tr>
 <tr class="separator:aa90f8051c9633d3017c588245cdc4014"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7cf7cbc5aa473de8116dc9f00cbc5d57" id="r_a7cf7cbc5aa473de8116dc9f00cbc5d57"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a7cf7cbc5aa473de8116dc9f00cbc5d57">tcp_rst_netif</a> (struct <a class="el" href="structnetif.html">netif</a> *<a class="el" href="structnetif.html">netif</a>, u32_t seqno, u32_t ackno, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *local_ip, const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *remote_ip, u16_t local_port, u16_t remote_port)</td></tr>
+<tr class="separator:a7cf7cbc5aa473de8116dc9f00cbc5d57"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:afd5dc2fa74855a84b2da642ba31059ea" id="r_afd5dc2fa74855a84b2da642ba31059ea"><td class="memItemLeft" align="right" valign="top">u32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#afd5dc2fa74855a84b2da642ba31059ea">tcp_next_iss</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
 <tr class="separator:afd5dc2fa74855a84b2da642ba31059ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a0d8bb5fc8522515aa35d305774cc5332" id="r_a0d8bb5fc8522515aa35d305774cc5332"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a0d8bb5fc8522515aa35d305774cc5332">tcp_keepalive</a> (struct <a class="el" href="structtcp__pcb.html">tcp_pcb</a> *pcb)</td></tr>
@@ -270,7 +272,7 @@
 <div class="line">                              ((tpcb)-&gt;unsent-&gt;len &gt;= (tpcb)-&gt;mss))) || \</div>
 <div class="line">                            ((tcp_sndbuf(tpcb) == 0) || (tcp_sndqueuelen(tpcb) &gt;= <a class="code hl_define" href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">TCP_SND_QUEUELEN</a>)) \</div>
 <div class="line">                            ) ? 1 : 0)</div>
-<div class="ttc" id="agroup__lwip__opts__tcp_html_ga9beaa47832ead4180981bfbf71074904"><div class="ttname"><a href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">TCP_SND_QUEUELEN</a></div><div class="ttdeci">#define TCP_SND_QUEUELEN</div><div class="ttdef"><b>Definition</b> opt.h:1322</div></div>
+<div class="ttc" id="agroup__lwip__opts__tcp_html_ga9beaa47832ead4180981bfbf71074904"><div class="ttname"><a href="group__lwip__opts__tcp.html#ga9beaa47832ead4180981bfbf71074904">TCP_SND_QUEUELEN</a></div><div class="ttdeci">#define TCP_SND_QUEUELEN</div><div class="ttdef"><b>Definition</b> opt.h:1373</div></div>
 </div><!-- fragment --><p>This is the Nagle algorithm: try to combine user data to send as few TCP segments as possible. Only send if</p><ul>
 <li>no previously transmitted data on the connection remains unacknowledged or</li>
 <li>the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or</li>
@@ -871,8 +873,8 @@
         </tr>
       </table>
 </div><div class="memdoc">
-<p>Send a TCP RESET packet (empty segment with RST flag set) either to abort a connection or to show that there is no matching local connection for a received segment.</p>
-<p>Called by <a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp_abort()</a> (to abort a local connection), <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_input()</a> (if no matching local pcb was found), tcp_listen_input() (if incoming segment has ACK flag set) and tcp_process() (received segment in the wrong state)</p>
+<p>Send a TCP RESET packet (empty segment with RST flag set) to abort a connection.</p>
+<p>Called by <a class="el" href="group__tcp__raw.html#ga468c2260ddb01582e966ddcf3c25ce61">tcp_abort()</a> (to abort a local connection), tcp_closen() (if not all data has been received by the application), tcp_timewait_input() (if a SYN is received) and tcp_process() (received segment in the wrong state).</p>
 <p>Since a RST segment is in most cases not sent for an active connection, <a class="el" href="tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014">tcp_rst()</a> has a number of arguments that are taken from a <a class="el" href="structtcp__pcb.html">tcp_pcb</a> for most other segment output functions.</p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
@@ -889,6 +891,67 @@
 
 </div>
 </div>
+<a id="a7cf7cbc5aa473de8116dc9f00cbc5d57" name="a7cf7cbc5aa473de8116dc9f00cbc5d57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7cf7cbc5aa473de8116dc9f00cbc5d57">&#9670;&#160;</a></span>tcp_rst_netif()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tcp_rst_netif </td>
+          <td>(</td>
+          <td class="paramtype">struct <a class="el" href="structnetif.html">netif</a> *</td>          <td class="paramname"><span class="paramname"><em>netif</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t</td>          <td class="paramname"><span class="paramname"><em>seqno</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u32_t</td>          <td class="paramname"><span class="paramname"><em>ackno</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>local_ip</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="group__ipaddr.html#ga335a8c9df66319e88a1a529047ce0a1e">ip_addr_t</a> *</td>          <td class="paramname"><span class="paramname"><em>remote_ip</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t</td>          <td class="paramname"><span class="paramname"><em>local_port</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">u16_t</td>          <td class="paramname"><span class="paramname"><em>remote_port</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Send a TCP RESET packet (empty segment with RST flag set) to show that there is no matching local connection for a received segment.</p>
+<p>Called by <a class="el" href="tcp__in_8c.html#ae70c3c99d9dd6b07f7e11f7ba5eedcb5">tcp_input()</a> (if no matching local pcb was found) and tcp_listen_input() (if incoming segment has ACK flag set).</p>
+<p>Since a RST segment is in most cases not sent for an active connection, <a class="el" href="tcp__out_8c.html#aa90f8051c9633d3017c588245cdc4014">tcp_rst()</a> has a number of arguments that are taken from a <a class="el" href="structtcp__pcb.html">tcp_pcb</a> for most other segment output functions.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">netif</td><td>the netif on which to send the RST (since we have no pcb) </td></tr>
+    <tr><td class="paramname">seqno</td><td>the sequence number to use for the outgoing segment </td></tr>
+    <tr><td class="paramname">ackno</td><td>the acknowledge number to use for the outgoing segment </td></tr>
+    <tr><td class="paramname">local_ip</td><td>the local IP address to send the segment from </td></tr>
+    <tr><td class="paramname">remote_ip</td><td>the remote IP address to send the segment to </td></tr>
+    <tr><td class="paramname">local_port</td><td>the local TCP port to send the segment from </td></tr>
+    <tr><td class="paramname">remote_port</td><td>the remote TCP port to send the segment to </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 <a id="a9384b436de95d5bf8550438b9d3c8cd4" name="a9384b436de95d5bf8550438b9d3c8cd4"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a9384b436de95d5bf8550438b9d3c8cd4">&#9670;&#160;</a></span>tcp_seg_copy()</h2>
 
diff --git a/doc/doxygen/output/html/tcp__priv_8h.js b/doc/doxygen/output/html/tcp__priv_8h.js
index f67d3c8..eb0bd11 100644
--- a/doc/doxygen/output/html/tcp__priv_8h.js
+++ b/doc/doxygen/output/html/tcp__priv_8h.js
@@ -27,6 +27,7 @@
     [ "tcp_rexmit_rto_commit", "tcp__priv_8h.html#a9ef9dc094e21bdf0779aed25ab0b08d4", null ],
     [ "tcp_rexmit_rto_prepare", "tcp__priv_8h.html#a1f318930bd6d49074343cc79c5166f39", null ],
     [ "tcp_rst", "tcp__priv_8h.html#aa90f8051c9633d3017c588245cdc4014", null ],
+    [ "tcp_rst_netif", "tcp__priv_8h.html#a7cf7cbc5aa473de8116dc9f00cbc5d57", null ],
     [ "tcp_seg_copy", "tcp__priv_8h.html#a9384b436de95d5bf8550438b9d3c8cd4", null ],
     [ "tcp_seg_free", "tcp__priv_8h.html#ac6283651b26f74dba2444159aee88b20", null ],
     [ "tcp_segs_free", "tcp__priv_8h.html#a3d9bb9809769197bce9b2499d55cf28c", null ],
diff --git a/doc/doxygen/output/html/tcpbase_8h.html b/doc/doxygen/output/html/tcpbase_8h.html
index 23eefbb..8df95c9 100644
--- a/doc/doxygen/output/html/tcpbase_8h.html
+++ b/doc/doxygen/output/html/tcpbase_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -103,7 +103,7 @@
 <div class="textblock"><code>#include &quot;<a class="el" href="opt_8h.html">lwip/opt.h</a>&quot;</code><br />
 </div><a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Base TCP API definitions shared by TCP and ALTCP<br  />
-See also <a class="el" href="group__tcp__raw.html">TCP</a> </p>
+ See also <a class="el" href="group__tcp__raw.html">TCP</a> </p>
 </div></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/doxygen/output/html/tcpip_8c.html b/doc/doxygen/output/html/tcpip_8c.html
index c5c9487..37fcd74 100644
--- a/doc/doxygen/output/html/tcpip_8c.html
+++ b/doc/doxygen/output/html/tcpip_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -136,6 +136,8 @@
 <tr class="separator:ga83fe5fb2ea33e8c262567ac46f4db3f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga56a234f3d895791225c3c850bfadb666" id="r_ga56a234f3d895791225c3c850bfadb666"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__os.html#ga56a234f3d895791225c3c850bfadb666">tcpip_callbackmsg_trycallback_fromisr</a> (struct tcpip_callback_msg *msg)</td></tr>
 <tr class="separator:ga56a234f3d895791225c3c850bfadb666"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d8a2ac0271def71a4ca31b24a31228f" id="r_a8d8a2ac0271def71a4ca31b24a31228f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8d8a2ac0271def71a4ca31b24a31228f">tcpip_callback_wait</a> (<a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
+<tr class="separator:a8d8a2ac0271def71a4ca31b24a31228f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga1f3a88b8df6ba3b9ed1c00e0a305e3db" id="r_ga1f3a88b8df6ba3b9ed1c00e0a305e3db"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__os.html#ga1f3a88b8df6ba3b9ed1c00e0a305e3db">tcpip_init</a> (<a class="el" href="tcpip_8h.html#a5fe07216c441e27c3028bcac60fa0992">tcpip_init_done_fn</a> initfunc, void *arg)</td></tr>
 <tr class="separator:ga1f3a88b8df6ba3b9ed1c00e0a305e3db"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a5cdcb6b784fe0e8736a5b31a5cfbed6c" id="r_a5cdcb6b784fe0e8736a5b31a5cfbed6c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5cdcb6b784fe0e8736a5b31a5cfbed6c">pbuf_free_callback</a> (struct <a class="el" href="structpbuf.html">pbuf</a> *p)</td></tr>
@@ -230,6 +232,36 @@
 
 </div>
 </div>
+<a id="a8d8a2ac0271def71a4ca31b24a31228f" name="a8d8a2ac0271def71a4ca31b24a31228f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d8a2ac0271def71a4ca31b24a31228f">&#9670;&#160;</a></span>tcpip_callback_wait()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> tcpip_callback_wait </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="tcpip_8h.html#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a></td>          <td class="paramname"><span class="paramname"><em>function</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>ctx</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends a message to TCPIP thread to call a function. Caller thread blocks until the function returns. It is recommended to use LWIP_TCPIP_CORE_LOCKING (preferred) or LWIP_NETCONN_SEM_PER_THREAD. If not, a semaphore is created and destroyed on every call which is usually an expensive/slow operation.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">function</td><td>the function to call </td></tr>
+    <tr><td class="paramname">ctx</td><td>parameter passed to f </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the function was called, another err_t if not </dd></dl>
+
+</div>
+</div>
 <a id="a93043b3c66dbe4a15a60299c6199d102" name="a93043b3c66dbe4a15a60299c6199d102"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a93043b3c66dbe4a15a60299c6199d102">&#9670;&#160;</a></span>tcpip_inpkt()</h2>
 
diff --git a/doc/doxygen/output/html/tcpip_8c.js b/doc/doxygen/output/html/tcpip_8c.js
index 969846f..c7c377d 100644
--- a/doc/doxygen/output/html/tcpip_8c.js
+++ b/doc/doxygen/output/html/tcpip_8c.js
@@ -4,6 +4,7 @@
     [ "pbuf_free_callback", "tcpip_8c.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c", null ],
     [ "tcpip_api_call", "tcpip_8c.html#a3d42b0c46607f91aedcc7745ed466b08", null ],
     [ "tcpip_callback", "group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a", null ],
+    [ "tcpip_callback_wait", "tcpip_8c.html#a8d8a2ac0271def71a4ca31b24a31228f", null ],
     [ "tcpip_callbackmsg_delete", "group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd", null ],
     [ "tcpip_callbackmsg_new", "group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1", null ],
     [ "tcpip_callbackmsg_trycallback", "group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8", null ],
diff --git a/doc/doxygen/output/html/tcpip_8h.html b/doc/doxygen/output/html/tcpip_8h.html
index d033492..32ce47b 100644
--- a/doc/doxygen/output/html/tcpip_8h.html
+++ b/doc/doxygen/output/html/tcpip_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -138,6 +138,8 @@
 <tr class="separator:gaeb7b3c7414c76ad8dde14d2fba6cb020"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gaab838fe3417ab3a1f61f0728009a0c2a" id="r_gaab838fe3417ab3a1f61f0728009a0c2a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a">tcpip_callback</a> (<a class="el" href="#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
 <tr class="separator:gaab838fe3417ab3a1f61f0728009a0c2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d8a2ac0271def71a4ca31b24a31228f" id="r_a8d8a2ac0271def71a4ca31b24a31228f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8d8a2ac0271def71a4ca31b24a31228f">tcpip_callback_wait</a> (<a class="el" href="#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
+<tr class="separator:a8d8a2ac0271def71a4ca31b24a31228f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga07de8751452a8886de85849f79fe23a1" id="r_ga07de8751452a8886de85849f79fe23a1"><td class="memItemLeft" align="right" valign="top">struct tcpip_callback_msg *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1">tcpip_callbackmsg_new</a> (<a class="el" href="#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a> function, void *ctx)</td></tr>
 <tr class="separator:ga07de8751452a8886de85849f79fe23a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gac5b7a59f4c3f5f721ab9ee81f231c9fd" id="r_gac5b7a59f4c3f5f721ab9ee81f231c9fd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd">tcpip_callbackmsg_delete</a> (struct tcpip_callback_msg *msg)</td></tr>
@@ -282,6 +284,36 @@
 
 </div>
 </div>
+<a id="a8d8a2ac0271def71a4ca31b24a31228f" name="a8d8a2ac0271def71a4ca31b24a31228f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d8a2ac0271def71a4ca31b24a31228f">&#9670;&#160;</a></span>tcpip_callback_wait()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> tcpip_callback_wait </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="#a35203296bb838f3b493839ffc6e7285d">tcpip_callback_fn</a></td>          <td class="paramname"><span class="paramname"><em>function</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *</td>          <td class="paramname"><span class="paramname"><em>ctx</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Sends a message to TCPIP thread to call a function. Caller thread blocks until the function returns. It is recommended to use LWIP_TCPIP_CORE_LOCKING (preferred) or LWIP_NETCONN_SEM_PER_THREAD. If not, a semaphore is created and destroyed on every call which is usually an expensive/slow operation.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">function</td><td>the function to call </td></tr>
+    <tr><td class="paramname">ctx</td><td>parameter passed to f </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>ERR_OK if the function was called, another err_t if not </dd></dl>
+
+</div>
+</div>
 <a id="a93043b3c66dbe4a15a60299c6199d102" name="a93043b3c66dbe4a15a60299c6199d102"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a93043b3c66dbe4a15a60299c6199d102">&#9670;&#160;</a></span>tcpip_inpkt()</h2>
 
diff --git a/doc/doxygen/output/html/tcpip_8h.js b/doc/doxygen/output/html/tcpip_8h.js
index 10b242d..f67920f 100644
--- a/doc/doxygen/output/html/tcpip_8h.js
+++ b/doc/doxygen/output/html/tcpip_8h.js
@@ -8,6 +8,7 @@
     [ "mem_free_callback", "tcpip_8h.html#a55b4de3765c6a37b3f2b26a11603771c", null ],
     [ "pbuf_free_callback", "tcpip_8h.html#a5cdcb6b784fe0e8736a5b31a5cfbed6c", null ],
     [ "tcpip_callback", "group__lwip__os.html#gaab838fe3417ab3a1f61f0728009a0c2a", null ],
+    [ "tcpip_callback_wait", "tcpip_8h.html#a8d8a2ac0271def71a4ca31b24a31228f", null ],
     [ "tcpip_callbackmsg_delete", "group__lwip__os.html#gac5b7a59f4c3f5f721ab9ee81f231c9fd", null ],
     [ "tcpip_callbackmsg_new", "group__lwip__os.html#ga07de8751452a8886de85849f79fe23a1", null ],
     [ "tcpip_callbackmsg_trycallback", "group__lwip__os.html#ga83fe5fb2ea33e8c262567ac46f4db3f8", null ],
diff --git a/doc/doxygen/output/html/tcpip__priv_8h.html b/doc/doxygen/output/html/tcpip__priv_8h.html
index 46c3bc7..9a11259 100644
--- a/doc/doxygen/output/html/tcpip__priv_8h.html
+++ b/doc/doxygen/output/html/tcpip__priv_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/tftp__server_8c.html b/doc/doxygen/output/html/tftp_8c.html
similarity index 65%
copy from doc/doxygen/output/html/tftp__server_8c.html
copy to doc/doxygen/output/html/tftp_8c.html
index 1c5382a..8490beb 100644
--- a/doc/doxygen/output/html/tftp__server_8c.html
+++ b/doc/doxygen/output/html/tftp_8c.html
@@ -5,7 +5,7 @@
 <meta http-equiv="X-UA-Compatible" content="IE=11"/>
 <meta name="generator" content="Doxygen 1.12.0"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>lwIP: src/apps/tftp/tftp_server.c File Reference</title>
+<title>lwIP: src/apps/tftp/tftp.c File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -71,7 +71,7 @@
 </div>
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
-$(function(){initNavTree('tftp__server_8c.html',''); initResizable(true); });
+$(function(){initNavTree('tftp_8c.html',''); initResizable(true); });
 /* @license-end */
 </script>
 <div id="doc-content">
@@ -99,13 +99,14 @@
 <div class="header">
   <div class="summary">
 <a href="#func-members">Functions</a>  </div>
-  <div class="headertitle"><div class="title">tftp_server.c File Reference</div></div>
+  <div class="headertitle"><div class="title">tftp.c File Reference</div></div>
 </div><!--header-->
 <div class="contents">
 
 <p>Trivial File Transfer Protocol (RFC 1350)  
 <a href="#details">More...</a></p>
-<div class="textblock"><code>#include &quot;<a class="el" href="tftp__server_8h.html">lwip/apps/tftp_server.h</a>&quot;</code><br />
+<div class="textblock"><code>#include &quot;<a class="el" href="tftp__client_8h.html">lwip/apps/tftp_client.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tftp__server_8h.html">lwip/apps/tftp_server.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="timeouts_8h.html">lwip/timeouts.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="debug_8h.html">lwip/debug.h</a>&quot;</code><br />
@@ -113,8 +114,12 @@
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:ga7a80673a1324da5c8ae2440af7b008a3" id="r_ga7a80673a1324da5c8ae2440af7b008a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_init</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
-<tr class="separator:ga7a80673a1324da5c8ae2440af7b008a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c6cf3de84a0dc990c055d66e574ca70" id="r_a5c6cf3de84a0dc990c055d66e574ca70"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5c6cf3de84a0dc990c055d66e574ca70">tftp_init_common</a> (u8_t mode, const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
+<tr class="separator:a5c6cf3de84a0dc990c055d66e574ca70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73a98f0811244d5bd24d5b959db8ed40" id="r_ga73a98f0811244d5bd24d5b959db8ed40"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40">tftp_init_server</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
+<tr class="separator:ga73a98f0811244d5bd24d5b959db8ed40"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa6b743a64287206acb825bd60448e5f8" id="r_gaa6b743a64287206acb825bd60448e5f8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#gaa6b743a64287206acb825bd60448e5f8">tftp_init_client</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
+<tr class="separator:gaa6b743a64287206acb825bd60448e5f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gabb4a4e24b5c7ec8df70ec5a68a206dec" id="r_gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_cleanup</a> (void)</td></tr>
 <tr class="separator:gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
@@ -122,12 +127,41 @@
 <div class="textblock"><p>Trivial File Transfer Protocol (RFC 1350) </p>
 <dl class="section author"><dt>Author</dt><dd>Logan Gunthorpe <a href="#" onclick="location.href='mai'+'lto:'+'log'+'an'+'g@d'+'el'+'tat'+'ee'+'.co'+'m'; return false;">logan<span class="obfuscator">.nosp@m.</span>g@de<span class="obfuscator">.nosp@m.</span>ltate<span class="obfuscator">.nosp@m.</span>e.co<span class="obfuscator">.nosp@m.</span>m</a> Dirk Ziegelmeier <a href="#" onclick="location.href='mai'+'lto:'+'dzi'+'eg'+'el@'+'gm'+'x.d'+'e'; return false;">dzieg<span class="obfuscator">.nosp@m.</span>el@g<span class="obfuscator">.nosp@m.</span>mx.de</a></dd></dl>
 <p>Copyright (c) Deltatee Enterprises Ltd. 2013 All rights reserved. </p>
-</div></div><!-- contents -->
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a5c6cf3de84a0dc990c055d66e574ca70" name="a5c6cf3de84a0dc990c055d66e574ca70"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5c6cf3de84a0dc990c055d66e574ca70">&#9670;&#160;</a></span>tftp_init_common()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> tftp_init_common </td>
+          <td>(</td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>mode</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structtftp__context.html">tftp_context</a> *</td>          <td class="paramname"><span class="paramname"><em>ctx</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize TFTP client/server. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mode</td><td>TFTP mode (client/server) </td></tr>
+    <tr><td class="paramname">ctx</td><td>TFTP callback struct </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
 <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
   <ul>
-    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_403e202f99dba154c685be932a8e0c34.html">tftp</a></li><li class="navelem"><a class="el" href="tftp__server_8c.html">tftp_server.c</a></li>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_403e202f99dba154c685be932a8e0c34.html">tftp</a></li><li class="navelem"><a class="el" href="tftp_8c.html">tftp.c</a></li>
     <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
   </ul>
 </div>
diff --git a/doc/doxygen/output/html/tftp_8c.js b/doc/doxygen/output/html/tftp_8c.js
new file mode 100644
index 0000000..e14504a
--- /dev/null
+++ b/doc/doxygen/output/html/tftp_8c.js
@@ -0,0 +1,7 @@
+var tftp_8c =
+[
+    [ "tftp_cleanup", "group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec", null ],
+    [ "tftp_init_client", "group__tftp.html#gaa6b743a64287206acb825bd60448e5f8", null ],
+    [ "tftp_init_common", "tftp_8c.html#a5c6cf3de84a0dc990c055d66e574ca70", null ],
+    [ "tftp_init_server", "group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tftp__server_8c.html b/doc/doxygen/output/html/tftp__client_8h.html
similarity index 65%
rename from doc/doxygen/output/html/tftp__server_8c.html
rename to doc/doxygen/output/html/tftp__client_8h.html
index 1c5382a..68c6347 100644
--- a/doc/doxygen/output/html/tftp__server_8c.html
+++ b/doc/doxygen/output/html/tftp__client_8h.html
@@ -5,7 +5,7 @@
 <meta http-equiv="X-UA-Compatible" content="IE=11"/>
 <meta name="generator" content="Doxygen 1.12.0"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>lwIP: src/apps/tftp/tftp_server.c File Reference</title>
+<title>lwIP: src/include/lwip/apps/tftp_client.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -71,7 +71,7 @@
 </div>
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
-$(function(){initNavTree('tftp__server_8c.html',''); initResizable(true); });
+$(function(){initNavTree('tftp__client_8h.html',''); initResizable(true); });
 /* @license-end */
 </script>
 <div id="doc-content">
@@ -99,35 +99,24 @@
 <div class="header">
   <div class="summary">
 <a href="#func-members">Functions</a>  </div>
-  <div class="headertitle"><div class="title">tftp_server.c File Reference</div></div>
+  <div class="headertitle"><div class="title">tftp_client.h File Reference</div></div>
 </div><!--header-->
 <div class="contents">
-
-<p>Trivial File Transfer Protocol (RFC 1350)  
-<a href="#details">More...</a></p>
-<div class="textblock"><code>#include &quot;<a class="el" href="tftp__server_8h.html">lwip/apps/tftp_server.h</a>&quot;</code><br />
-<code>#include &quot;<a class="el" href="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
-<code>#include &quot;<a class="el" href="timeouts_8h.html">lwip/timeouts.h</a>&quot;</code><br />
-<code>#include &quot;<a class="el" href="debug_8h.html">lwip/debug.h</a>&quot;</code><br />
-<code>#include &lt;string.h&gt;</code><br />
+<div class="textblock"><code>#include &quot;<a class="el" href="tftp__common_8h.html">lwip/apps/tftp_common.h</a>&quot;</code><br />
 </div><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:ga7a80673a1324da5c8ae2440af7b008a3" id="r_ga7a80673a1324da5c8ae2440af7b008a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_init</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
-<tr class="separator:ga7a80673a1324da5c8ae2440af7b008a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gabb4a4e24b5c7ec8df70ec5a68a206dec" id="r_gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_cleanup</a> (void)</td></tr>
-<tr class="separator:gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gaa6b743a64287206acb825bd60448e5f8" id="r_gaa6b743a64287206acb825bd60448e5f8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#gaa6b743a64287206acb825bd60448e5f8">tftp_init_client</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
+<tr class="separator:gaa6b743a64287206acb825bd60448e5f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Trivial File Transfer Protocol (RFC 1350) </p>
-<dl class="section author"><dt>Author</dt><dd>Logan Gunthorpe <a href="#" onclick="location.href='mai'+'lto:'+'log'+'an'+'g@d'+'el'+'tat'+'ee'+'.co'+'m'; return false;">logan<span class="obfuscator">.nosp@m.</span>g@de<span class="obfuscator">.nosp@m.</span>ltate<span class="obfuscator">.nosp@m.</span>e.co<span class="obfuscator">.nosp@m.</span>m</a> Dirk Ziegelmeier <a href="#" onclick="location.href='mai'+'lto:'+'dzi'+'eg'+'el@'+'gm'+'x.d'+'e'; return false;">dzieg<span class="obfuscator">.nosp@m.</span>el@g<span class="obfuscator">.nosp@m.</span>mx.de</a></dd></dl>
-<p>Copyright (c) Deltatee Enterprises Ltd. 2013 All rights reserved. </p>
+<div class="textblock"><p>TFTP client header </p>
 </div></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
 <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
   <ul>
-    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_403e202f99dba154c685be932a8e0c34.html">tftp</a></li><li class="navelem"><a class="el" href="tftp__server_8c.html">tftp_server.c</a></li>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li><li class="navelem"><a class="el" href="dir_4e6b3cf33a61b6caac9c8ac30c866f37.html">lwip</a></li><li class="navelem"><a class="el" href="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="tftp__client_8h.html">tftp_client.h</a></li>
     <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
   </ul>
 </div>
diff --git a/doc/doxygen/output/html/tftp__client_8h.js b/doc/doxygen/output/html/tftp__client_8h.js
new file mode 100644
index 0000000..4025a07
--- /dev/null
+++ b/doc/doxygen/output/html/tftp__client_8h.js
@@ -0,0 +1,4 @@
+var tftp__client_8h =
+[
+    [ "tftp_init_client", "group__tftp.html#gaa6b743a64287206acb825bd60448e5f8", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tftp__server_8c.html b/doc/doxygen/output/html/tftp__common_8h.html
similarity index 61%
copy from doc/doxygen/output/html/tftp__server_8c.html
copy to doc/doxygen/output/html/tftp__common_8h.html
index 1c5382a..0107b94 100644
--- a/doc/doxygen/output/html/tftp__server_8c.html
+++ b/doc/doxygen/output/html/tftp__common_8h.html
@@ -5,7 +5,7 @@
 <meta http-equiv="X-UA-Compatible" content="IE=11"/>
 <meta name="generator" content="Doxygen 1.12.0"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>lwIP: src/apps/tftp/tftp_server.c File Reference</title>
+<title>lwIP: src/include/lwip/apps/tftp_common.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -71,7 +71,7 @@
 </div>
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
-$(function(){initNavTree('tftp__server_8c.html',''); initResizable(true); });
+$(function(){initNavTree('tftp__common_8h.html',''); initResizable(true); });
 /* @license-end */
 </script>
 <div id="doc-content">
@@ -98,36 +98,70 @@
 
 <div class="header">
   <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
 <a href="#func-members">Functions</a>  </div>
-  <div class="headertitle"><div class="title">tftp_server.c File Reference</div></div>
+  <div class="headertitle"><div class="title">tftp_common.h File Reference</div></div>
 </div><!--header-->
 <div class="contents">
 
 <p>Trivial File Transfer Protocol (RFC 1350)  
 <a href="#details">More...</a></p>
-<div class="textblock"><code>#include &quot;<a class="el" href="tftp__server_8h.html">lwip/apps/tftp_server.h</a>&quot;</code><br />
-<code>#include &quot;<a class="el" href="udp_8h.html">lwip/udp.h</a>&quot;</code><br />
-<code>#include &quot;<a class="el" href="timeouts_8h.html">lwip/timeouts.h</a>&quot;</code><br />
-<code>#include &quot;<a class="el" href="debug_8h.html">lwip/debug.h</a>&quot;</code><br />
-<code>#include &lt;string.h&gt;</code><br />
+<div class="textblock"><code>#include &quot;<a class="el" href="tftp__opts_8h.html">lwip/apps/tftp_opts.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="err_8h.html">lwip/err.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="ip__addr_8h.html">lwip/ip_addr.h</a>&quot;</code><br />
 </div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtftp__context.html">tftp_context</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:ga7a80673a1324da5c8ae2440af7b008a3" id="r_ga7a80673a1324da5c8ae2440af7b008a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_init</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
-<tr class="separator:ga7a80673a1324da5c8ae2440af7b008a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c6cf3de84a0dc990c055d66e574ca70" id="r_a5c6cf3de84a0dc990c055d66e574ca70"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5c6cf3de84a0dc990c055d66e574ca70">tftp_init_common</a> (u8_t mode, const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
+<tr class="separator:a5c6cf3de84a0dc990c055d66e574ca70"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:gabb4a4e24b5c7ec8df70ec5a68a206dec" id="r_gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_cleanup</a> (void)</td></tr>
 <tr class="separator:gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Trivial File Transfer Protocol (RFC 1350) </p>
-<dl class="section author"><dt>Author</dt><dd>Logan Gunthorpe <a href="#" onclick="location.href='mai'+'lto:'+'log'+'an'+'g@d'+'el'+'tat'+'ee'+'.co'+'m'; return false;">logan<span class="obfuscator">.nosp@m.</span>g@de<span class="obfuscator">.nosp@m.</span>ltate<span class="obfuscator">.nosp@m.</span>e.co<span class="obfuscator">.nosp@m.</span>m</a> Dirk Ziegelmeier <a href="#" onclick="location.href='mai'+'lto:'+'dzi'+'eg'+'el@'+'gm'+'x.d'+'e'; return false;">dzieg<span class="obfuscator">.nosp@m.</span>el@g<span class="obfuscator">.nosp@m.</span>mx.de</a></dd></dl>
+<dl class="section author"><dt>Author</dt><dd>Logan Gunthorpe <a href="#" onclick="location.href='mai'+'lto:'+'log'+'an'+'g@d'+'el'+'tat'+'ee'+'.co'+'m'; return false;">logan<span class="obfuscator">.nosp@m.</span>g@de<span class="obfuscator">.nosp@m.</span>ltate<span class="obfuscator">.nosp@m.</span>e.co<span class="obfuscator">.nosp@m.</span>m</a></dd></dl>
 <p>Copyright (c) Deltatee Enterprises Ltd. 2013 All rights reserved. </p>
-</div></div><!-- contents -->
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a5c6cf3de84a0dc990c055d66e574ca70" name="a5c6cf3de84a0dc990c055d66e574ca70"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5c6cf3de84a0dc990c055d66e574ca70">&#9670;&#160;</a></span>tftp_init_common()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a> tftp_init_common </td>
+          <td>(</td>
+          <td class="paramtype">u8_t</td>          <td class="paramname"><span class="paramname"><em>mode</em></span>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const struct <a class="el" href="structtftp__context.html">tftp_context</a> *</td>          <td class="paramname"><span class="paramname"><em>ctx</em></span>&#160;)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>Initialize TFTP client/server. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">mode</td><td>TFTP mode (client/server) </td></tr>
+    <tr><td class="paramname">ctx</td><td>TFTP callback struct </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
 <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
   <ul>
-    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html">apps</a></li><li class="navelem"><a class="el" href="dir_403e202f99dba154c685be932a8e0c34.html">tftp</a></li><li class="navelem"><a class="el" href="tftp__server_8c.html">tftp_server.c</a></li>
+    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li><li class="navelem"><a class="el" href="dir_4e6b3cf33a61b6caac9c8ac30c866f37.html">lwip</a></li><li class="navelem"><a class="el" href="dir_f9284811ac594eafdc3134d5f8b945cb.html">apps</a></li><li class="navelem"><a class="el" href="tftp__common_8h.html">tftp_common.h</a></li>
     <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.12.0 </li>
   </ul>
 </div>
diff --git a/doc/doxygen/output/html/tftp__common_8h.js b/doc/doxygen/output/html/tftp__common_8h.js
new file mode 100644
index 0000000..02d5857
--- /dev/null
+++ b/doc/doxygen/output/html/tftp__common_8h.js
@@ -0,0 +1,5 @@
+var tftp__common_8h =
+[
+    [ "tftp_cleanup", "group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec", null ],
+    [ "tftp_init_common", "tftp__common_8h.html#a5c6cf3de84a0dc990c055d66e574ca70", null ]
+];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tftp__opts_8h.html b/doc/doxygen/output/html/tftp__opts_8h.html
index c3eb7a7..6ba6da3 100644
--- a/doc/doxygen/output/html/tftp__opts_8h.html
+++ b/doc/doxygen/output/html/tftp__opts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -122,7 +122,7 @@
 <tr class="separator:ga3e6caacb3f4d43f780b2d68ffe4258ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ga8e975900b4397313f1a649ff76a3063b" id="r_ga8e975900b4397313f1a649ff76a3063b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#ga8e975900b4397313f1a649ff76a3063b">TFTP_MAX_FILENAME_LEN</a>&#160;&#160;&#160;20</td></tr>
 <tr class="separator:ga8e975900b4397313f1a649ff76a3063b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gaa8a449c25e37be757f5efccd422c9055" id="r_gaa8a449c25e37be757f5efccd422c9055"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055">TFTP_MAX_MODE_LEN</a>&#160;&#160;&#160;7</td></tr>
+<tr class="memitem:gaa8a449c25e37be757f5efccd422c9055" id="r_gaa8a449c25e37be757f5efccd422c9055"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp__opts.html#gaa8a449c25e37be757f5efccd422c9055">TFTP_MAX_MODE_LEN</a>&#160;&#160;&#160;10</td></tr>
 <tr class="separator:gaa8a449c25e37be757f5efccd422c9055"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
diff --git a/doc/doxygen/output/html/tftp__server_8c.js b/doc/doxygen/output/html/tftp__server_8c.js
deleted file mode 100644
index 868e743..0000000
--- a/doc/doxygen/output/html/tftp__server_8c.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var tftp__server_8c =
-[
-    [ "tftp_cleanup", "group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec", null ],
-    [ "tftp_init", "group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3", null ]
-];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/tftp__server_8h.html b/doc/doxygen/output/html/tftp__server_8h.html
index b054bc6..c02b5bd 100644
--- a/doc/doxygen/output/html/tftp__server_8h.html
+++ b/doc/doxygen/output/html/tftp__server_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -98,34 +98,19 @@
 
 <div class="header">
   <div class="summary">
-<a href="#nested-classes">Data Structures</a> &#124;
 <a href="#func-members">Functions</a>  </div>
   <div class="headertitle"><div class="title">tftp_server.h File Reference</div></div>
 </div><!--header-->
 <div class="contents">
-
-<p>Trivial File Transfer Protocol (RFC 1350)  
-<a href="#details">More...</a></p>
-<div class="textblock"><code>#include &quot;<a class="el" href="tftp__opts_8h.html">lwip/apps/tftp_opts.h</a>&quot;</code><br />
-<code>#include &quot;<a class="el" href="err_8h.html">lwip/err.h</a>&quot;</code><br />
-<code>#include &quot;<a class="el" href="pbuf_8h.html">lwip/pbuf.h</a>&quot;</code><br />
+<div class="textblock"><code>#include &quot;<a class="el" href="tftp__common_8h.html">lwip/apps/tftp_common.h</a>&quot;</code><br />
 </div><table class="memberdecls">
-<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
-Data Structures</h2></td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtftp__context.html">tftp_context</a></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
-</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:ga7a80673a1324da5c8ae2440af7b008a3" id="r_ga7a80673a1324da5c8ae2440af7b008a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3">tftp_init</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
-<tr class="separator:ga7a80673a1324da5c8ae2440af7b008a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:gabb4a4e24b5c7ec8df70ec5a68a206dec" id="r_gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec">tftp_cleanup</a> (void)</td></tr>
-<tr class="separator:gabb4a4e24b5c7ec8df70ec5a68a206dec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga73a98f0811244d5bd24d5b959db8ed40" id="r_ga73a98f0811244d5bd24d5b959db8ed40"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__infrastructure__errors.html#gaf02d9da80fd66b4f986d2c53d7231ddb">err_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40">tftp_init_server</a> (const struct <a class="el" href="structtftp__context.html">tftp_context</a> *ctx)</td></tr>
+<tr class="separator:ga73a98f0811244d5bd24d5b959db8ed40"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Trivial File Transfer Protocol (RFC 1350) </p>
-<dl class="section author"><dt>Author</dt><dd>Logan Gunthorpe <a href="#" onclick="location.href='mai'+'lto:'+'log'+'an'+'g@d'+'el'+'tat'+'ee'+'.co'+'m'; return false;">logan<span class="obfuscator">.nosp@m.</span>g@de<span class="obfuscator">.nosp@m.</span>ltate<span class="obfuscator">.nosp@m.</span>e.co<span class="obfuscator">.nosp@m.</span>m</a></dd></dl>
-<p>Copyright (c) Deltatee Enterprises Ltd. 2013 All rights reserved. </p>
+<div class="textblock"><p>TFTP server header </p>
 </div></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/doxygen/output/html/tftp__server_8h.js b/doc/doxygen/output/html/tftp__server_8h.js
index 3fc62f9..5ab6340 100644
--- a/doc/doxygen/output/html/tftp__server_8h.js
+++ b/doc/doxygen/output/html/tftp__server_8h.js
@@ -1,5 +1,4 @@
 var tftp__server_8h =
 [
-    [ "tftp_cleanup", "group__tftp.html#gabb4a4e24b5c7ec8df70ec5a68a206dec", null ],
-    [ "tftp_init", "group__tftp.html#ga7a80673a1324da5c8ae2440af7b008a3", null ]
+    [ "tftp_init_server", "group__tftp.html#ga73a98f0811244d5bd24d5b959db8ed40", null ]
 ];
\ No newline at end of file
diff --git a/doc/doxygen/output/html/timeouts_8c.html b/doc/doxygen/output/html/timeouts_8c.html
index b676a55..da0fda5 100644
--- a/doc/doxygen/output/html/timeouts_8c.html
+++ b/doc/doxygen/output/html/timeouts_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -112,7 +112,7 @@
 <code>#include &quot;<a class="el" href="ip4__frag_8h.html">lwip/ip4_frag.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="lwip_2etharp_8h.html">lwip/etharp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="dhcp_8h.html">lwip/dhcp.h</a>&quot;</code><br />
-<code>#include &quot;<a class="el" href="autoip_8h.html">lwip/autoip.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="acd_8h.html">lwip/acd.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="igmp_8h.html">lwip/igmp.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="dns_8h.html">lwip/dns.h</a>&quot;</code><br />
 <code>#include &quot;<a class="el" href="nd6_8h.html">lwip/nd6.h</a>&quot;</code><br />
diff --git a/doc/doxygen/output/html/timeouts_8h.html b/doc/doxygen/output/html/timeouts_8h.html
index 9e8b9c7..d391791 100644
--- a/doc/doxygen/output/html/timeouts_8h.html
+++ b/doc/doxygen/output/html/timeouts_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/topics.html b/doc/doxygen/output/html/topics.html
index 8367b0e..8b35fdb 100644
--- a/doc/doxygen/output/html/topics.html
+++ b/doc/doxygen/output/html/topics.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -149,7 +149,8 @@
 <tr id="row_0_4_4_1_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__icmp.html" target="_self">ICMP</a></td><td class="desc"></td></tr>
 <tr id="row_0_4_4_2_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__dhcp.html" target="_self">DHCP</a></td><td class="desc"></td></tr>
 <tr id="row_0_4_4_3_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__autoip.html" target="_self">AUTOIP</a></td><td class="desc"></td></tr>
-<tr id="row_0_4_4_4_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__igmp.html" target="_self">IGMP</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_4_4_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__acd.html" target="_self">ACD</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_4_5_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__igmp.html" target="_self">IGMP</a></td><td class="desc"></td></tr>
 <tr id="row_0_4_5_" class="odd"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__pbuf.html" target="_self">PBUF</a></td><td class="desc"></td></tr>
 <tr id="row_0_4_6_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_4_6_" class="arrow" onclick="dynsection.toggleFolder('0_4_6_')">&#9658;</span><a class="el" href="group__lwip__opts__netif.html" target="_self">NETIF</a></td><td class="desc"></td></tr>
 <tr id="row_0_4_6_0_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__lwip__opts__loop.html" target="_self">Loopback interface</a></td><td class="desc"></td></tr>
@@ -175,9 +176,10 @@
 <tr id="row_2_0_1_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__dns.html" target="_self">DNS</a></td><td class="desc"></td></tr>
 <tr id="row_2_0_2_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_2_0_2_" class="arrow" onclick="dynsection.toggleFolder('2_0_2_')">&#9658;</span><a class="el" href="group__ip.html" target="_self">IP</a></td><td class="desc"></td></tr>
 <tr id="row_2_0_2_0_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_2_0_2_0_" class="arrow" onclick="dynsection.toggleFolder('2_0_2_0_')">&#9658;</span><a class="el" href="group__ip4.html" target="_self">IPv4</a></td><td class="desc"></td></tr>
-<tr id="row_2_0_2_0_0_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__autoip.html" target="_self">AUTOIP</a></td><td class="desc"></td></tr>
-<tr id="row_2_0_2_0_1_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__dhcp4.html" target="_self">DHCPv4</a></td><td class="desc"></td></tr>
-<tr id="row_2_0_2_0_2_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__igmp.html" target="_self">IGMP</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_2_0_0_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__acd.html" target="_self">ACD</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_2_0_1_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__autoip.html" target="_self">AUTOIP</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_2_0_2_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__dhcp4.html" target="_self">DHCPv4</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_2_0_3_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__igmp.html" target="_self">IGMP</a></td><td class="desc"></td></tr>
 <tr id="row_2_0_2_1_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span id="arr_2_0_2_1_" class="arrow" onclick="dynsection.toggleFolder('2_0_2_1_')">&#9658;</span><a class="el" href="group__ip6.html" target="_self">IPv6</a></td><td class="desc"></td></tr>
 <tr id="row_2_0_2_1_0_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__dhcp6.html" target="_self">DHCPv6</a></td><td class="desc"></td></tr>
 <tr id="row_2_0_2_1_1_" class="even" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;">&#160;</span><a class="el" href="group__mld6.html" target="_self">MLD6</a></td><td class="desc"></td></tr>
@@ -201,8 +203,9 @@
 <tr id="row_2_1_0_3_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netbuf.html" target="_self">Network buffers</a></td><td class="desc"></td></tr>
 <tr id="row_2_1_1_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_2_1_1_" class="arrow" onclick="dynsection.toggleFolder('2_1_1_')">&#9658;</span><a class="el" href="group__netifapi.html" target="_self">NETIF API</a></td><td class="desc"></td></tr>
 <tr id="row_2_1_1_0_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netifapi__netif.html" target="_self">NETIF related</a></td><td class="desc"></td></tr>
-<tr id="row_2_1_1_1_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netifapi__dhcp4.html" target="_self">DHCPv4</a></td><td class="desc"></td></tr>
-<tr id="row_2_1_1_2_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netifapi__autoip.html" target="_self">AUTOIP</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_1_1_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netifapi__arp.html" target="_self">ARP</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_1_2_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netifapi__dhcp4.html" target="_self">DHCPv4</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_1_3_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a class="el" href="group__netifapi__autoip.html" target="_self">AUTOIP</a></td><td class="desc"></td></tr>
 <tr id="row_2_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_2_2_" class="arrow" onclick="dynsection.toggleFolder('2_2_')">&#9660;</span><a class="el" href="group__socket.html" target="_self">Socket API</a></td><td class="desc"></td></tr>
 <tr id="row_2_2_0_" class="odd"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__if__api.html" target="_self">Interface Identification API</a></td><td class="desc"></td></tr>
 <tr id="row_2_2_1_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__netdbapi.html" target="_self">NETDB API</a></td><td class="desc"></td></tr>
@@ -235,7 +238,7 @@
 <tr id="row_4_7_3_" class="odd"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__snmp__opts.html" target="_self">Options</a></td><td class="desc"></td></tr>
 <tr id="row_4_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_8_" class="arrow" onclick="dynsection.toggleFolder('4_8_')">&#9660;</span><a class="el" href="group__sntp.html" target="_self">SNTP</a></td><td class="desc"></td></tr>
 <tr id="row_4_8_0_" class="odd"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__sntp__opts.html" target="_self">Options</a></td><td class="desc"></td></tr>
-<tr id="row_4_9_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_9_" class="arrow" onclick="dynsection.toggleFolder('4_9_')">&#9660;</span><a class="el" href="group__tftp.html" target="_self">TFTP server</a></td><td class="desc"></td></tr>
+<tr id="row_4_9_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_9_" class="arrow" onclick="dynsection.toggleFolder('4_9_')">&#9660;</span><a class="el" href="group__tftp.html" target="_self">TFTP client/server</a></td><td class="desc"></td></tr>
 <tr id="row_4_9_0_" class="odd"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a class="el" href="group__tftp__opts.html" target="_self">Options</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
diff --git a/doc/doxygen/output/html/udp_8c.html b/doc/doxygen/output/html/udp_8c.html
index 622824f..43b5641 100644
--- a/doc/doxygen/output/html/udp_8c.html
+++ b/doc/doxygen/output/html/udp_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -153,8 +153,8 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>User Datagram Protocol module<br  />
-The code for the User Datagram Protocol UDP &amp; UDPLite (RFC 3828).<br  />
-See also <a class="el" href="group__udp__raw.html">UDP</a> </p>
+ The code for the User Datagram Protocol UDP &amp; UDPLite (RFC 3828).<br  />
+ See also <a class="el" href="group__udp__raw.html">UDP</a> </p>
 </div><h2 class="groupheader">Function Documentation</h2>
 <a id="ae7f7431ce99333577d7b82b26619309e" name="ae7f7431ce99333577d7b82b26619309e"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ae7f7431ce99333577d7b82b26619309e">&#9670;&#160;</a></span>udp_init()</h2>
diff --git a/doc/doxygen/output/html/udp_8h.html b/doc/doxygen/output/html/udp_8h.html
index d1680ea..0dfb7d1 100644
--- a/doc/doxygen/output/html/udp_8h.html
+++ b/doc/doxygen/output/html/udp_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -157,7 +157,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>UDP API (to be used from TCPIP thread)<br  />
-See also <a class="el" href="group__udp__raw.html">UDP</a> </p>
+ See also <a class="el" href="group__udp__raw.html">UDP</a> </p>
 </div><h2 class="groupheader">Typedef Documentation</h2>
 <a id="af0ec7feb31acdb6e11b928f438c8a64b" name="af0ec7feb31acdb6e11b928f438c8a64b"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#af0ec7feb31acdb6e11b928f438c8a64b">&#9670;&#160;</a></span>udp_recv_fn</h2>
diff --git a/doc/doxygen/output/html/unionnetif__ext__callback__args__t.html b/doc/doxygen/output/html/unionnetif__ext__callback__args__t.html
index 78e44e9..974cf7f 100644
--- a/doc/doxygen/output/html/unionnetif__ext__callback__args__t.html
+++ b/doc/doxygen/output/html/unionnetif__ext__callback__args__t.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/unionsnmp__variant__value.html b/doc/doxygen/output/html/unionsnmp__variant__value.html
index 4f2d4fb..a4e4e1e 100644
--- a/doc/doxygen/output/html/unionsnmp__variant__value.html
+++ b/doc/doxygen/output/html/unionsnmp__variant__value.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/unionsockaddr__aligned.html b/doc/doxygen/output/html/unionsockaddr__aligned.html
index 9a0f22a..eab5b1a 100644
--- a/doc/doxygen/output/html/unionsockaddr__aligned.html
+++ b/doc/doxygen/output/html/unionsockaddr__aligned.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/upgrading.html b/doc/doxygen/output/html/upgrading.html
index 24c0804..fbcda9a 100644
--- a/doc/doxygen/output/html/upgrading.html
+++ b/doc/doxygen/output/html/upgrading.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -109,6 +109,16 @@
 (git master)
 
   * [Enter new changes just after this line - do not remove this line]
+  * The eth_addr_cmp and ip_addr_cmp set of functions have been renamed to eth_addr_eq, ip_addr_eq
+    and so on, since they return non-zero on equality. Macros for the old names exist.
+  * The sio_write function used by PPP now takes the data argument as const.
+
+(2.2.0)
+
+  ++ Repository changes:
+
+  * The contrib repository has been added into the main repository in the subdirectory 'contrib'
+    (the old contrib repository remains online for reference but is not used any more)
 
 (2.1.0)
 
diff --git a/doc/doxygen/output/html/zepif_8c.html b/doc/doxygen/output/html/zepif_8c.html
index 3599d93..723b384 100644
--- a/doc/doxygen/output/html/zepif_8c.html
+++ b/doc/doxygen/output/html/zepif_8c.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/zepif_8h.html b/doc/doxygen/output/html/zepif_8h.html
index a50857f..43790be 100644
--- a/doc/doxygen/output/html/zepif_8h.html
+++ b/doc/doxygen/output/html/zepif_8h.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
diff --git a/doc/doxygen/output/html/zerocopyrx.html b/doc/doxygen/output/html/zerocopyrx.html
index 751a3bf..8a857f3 100644
--- a/doc/doxygen/output/html/zerocopyrx.html
+++ b/doc/doxygen/output/html/zerocopyrx.html
@@ -27,7 +27,7 @@
  <tbody>
  <tr id="projectrow">
   <td id="projectalign">
-   <div id="projectname">lwIP<span id="projectnumber">&#160;2.1.3</span>
+   <div id="projectname">lwIP<span id="projectnumber">&#160;2.2.0</span>
    </div>
    <div id="projectbrief">Lightweight IP stack</div>
   </td>
@@ -115,7 +115,7 @@
 <div class="line">  my_custom_pbuf_t* my_puf = (my_custom_pbuf_t*)p;</div>
 <div class="line"> </div>
 <div class="line">  <span class="comment">// invalidate data cache here - lwIP and/or application may have written into buffer!</span></div>
-<div class="line">  <span class="comment">// (invalidate is faster than flushing, and noone needs the correct data in the buffer)</span></div>
+<div class="line">  <span class="comment">// (invalidate is faster than flushing, and no one needs the correct data in the buffer)</span></div>
 <div class="line">  invalidate_cpu_cache(p-&gt;payload, p-&gt;tot_len);</div>
 <div class="line"> </div>
 <div class="line">  <a class="code hl_define" href="group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab">SYS_ARCH_PROTECT</a>(old_level);</div>
@@ -150,14 +150,14 @@
 <div class="ttc" id="agroup__mempool_html_ga5e2498f6c17746c1fe7153de5f7f275a"><div class="ttname"><a href="group__mempool.html#ga5e2498f6c17746c1fe7153de5f7f275a">LWIP_MEMPOOL_ALLOC</a></div><div class="ttdeci">#define LWIP_MEMPOOL_ALLOC(name)</div><div class="ttdef"><b>Definition</b> memp.h:122</div></div>
 <div class="ttc" id="agroup__mempool_html_gaa43d114dd702fbd8f1db18474ea93a04"><div class="ttname"><a href="group__mempool.html#gaa43d114dd702fbd8f1db18474ea93a04">LWIP_MEMPOOL_FREE</a></div><div class="ttdeci">#define LWIP_MEMPOOL_FREE(name, x)</div><div class="ttdef"><b>Definition</b> memp.h:127</div></div>
 <div class="ttc" id="agroup__pbuf_html_ga5bcdac7b3aef4d60460ee05dec51db5f"><div class="ttname"><a href="group__pbuf.html#ga5bcdac7b3aef4d60460ee05dec51db5f">pbuf_alloced_custom</a></div><div class="ttdeci">struct pbuf * pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, void *payload_mem, u16_t payload_mem_len)</div><div class="ttdef"><b>Definition</b> pbuf.c:363</div></div>
-<div class="ttc" id="agroup__pbuf_html_gab0dd696fb4b6bc65e548944584f1738b"><div class="ttname"><a href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a></div><div class="ttdeci">u8_t pbuf_free(struct pbuf *p)</div><div class="ttdef"><b>Definition</b> pbuf.c:725</div></div>
+<div class="ttc" id="agroup__pbuf_html_gab0dd696fb4b6bc65e548944584f1738b"><div class="ttname"><a href="group__pbuf.html#gab0dd696fb4b6bc65e548944584f1738b">pbuf_free</a></div><div class="ttdeci">u8_t pbuf_free(struct pbuf *p)</div><div class="ttdef"><b>Definition</b> pbuf.c:727</div></div>
 <div class="ttc" id="agroup__pbuf_html_ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e"><div class="ttname"><a href="group__pbuf.html#ggab7e0e32fcc292c0d7107721766ed92fbac9b6ba960fdea6f2e8f35c8313b77e4e">PBUF_REF</a></div><div class="ttdeci">@ PBUF_REF</div><div class="ttdef"><b>Definition</b> pbuf.h:160</div></div>
 <div class="ttc" id="agroup__pbuf_html_ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba"><div class="ttname"><a href="group__pbuf.html#ggaee1baa59bb2f85ba575b5a8619ac1ebfa21116654fbab6d5a4dfeb87a1bb8f0ba">PBUF_RAW</a></div><div class="ttdeci">@ PBUF_RAW</div><div class="ttdef"><b>Definition</b> pbuf.h:111</div></div>
-<div class="ttc" id="agroup__sys__prot_html_ga2f48e97047945642ddeb27e65bf4ffe2"><div class="ttname"><a href="group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2">SYS_ARCH_UNPROTECT</a></div><div class="ttdeci">#define SYS_ARCH_UNPROTECT(lev)</div><div class="ttdef"><b>Definition</b> sys.h:491</div></div>
-<div class="ttc" id="agroup__sys__prot_html_ga3d0e48feafd378e9c26c64567ecd8bab"><div class="ttname"><a href="group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab">SYS_ARCH_PROTECT</a></div><div class="ttdeci">#define SYS_ARCH_PROTECT(lev)</div><div class="ttdef"><b>Definition</b> sys.h:480</div></div>
-<div class="ttc" id="agroup__sys__prot_html_ga945395fa326214fc9736487242710a90"><div class="ttname"><a href="group__sys__prot.html#ga945395fa326214fc9736487242710a90">SYS_ARCH_DECL_PROTECT</a></div><div class="ttdeci">#define SYS_ARCH_DECL_PROTECT(lev)</div><div class="ttdef"><b>Definition</b> sys.h:468</div></div>
-<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:260</div></div>
-<div class="ttc" id="astructnetif_html_a8fe4f1b7b0d710216287da9615164a5c"><div class="ttname"><a href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">netif::input</a></div><div class="ttdeci">netif_input_fn input</div><div class="ttdef"><b>Definition</b> netif.h:288</div></div>
+<div class="ttc" id="agroup__sys__prot_html_ga2f48e97047945642ddeb27e65bf4ffe2"><div class="ttname"><a href="group__sys__prot.html#ga2f48e97047945642ddeb27e65bf4ffe2">SYS_ARCH_UNPROTECT</a></div><div class="ttdeci">#define SYS_ARCH_UNPROTECT(lev)</div><div class="ttdef"><b>Definition</b> sys.h:506</div></div>
+<div class="ttc" id="agroup__sys__prot_html_ga3d0e48feafd378e9c26c64567ecd8bab"><div class="ttname"><a href="group__sys__prot.html#ga3d0e48feafd378e9c26c64567ecd8bab">SYS_ARCH_PROTECT</a></div><div class="ttdeci">#define SYS_ARCH_PROTECT(lev)</div><div class="ttdef"><b>Definition</b> sys.h:495</div></div>
+<div class="ttc" id="agroup__sys__prot_html_ga945395fa326214fc9736487242710a90"><div class="ttname"><a href="group__sys__prot.html#ga945395fa326214fc9736487242710a90">SYS_ARCH_DECL_PROTECT</a></div><div class="ttdeci">#define SYS_ARCH_DECL_PROTECT(lev)</div><div class="ttdef"><b>Definition</b> sys.h:483</div></div>
+<div class="ttc" id="astructnetif_html"><div class="ttname"><a href="structnetif.html">netif</a></div><div class="ttdef"><b>Definition</b> netif.h:269</div></div>
+<div class="ttc" id="astructnetif_html_a8fe4f1b7b0d710216287da9615164a5c"><div class="ttname"><a href="structnetif.html#a8fe4f1b7b0d710216287da9615164a5c">netif::input</a></div><div class="ttdeci">netif_input_fn input</div><div class="ttdef"><b>Definition</b> netif.h:297</div></div>
 <div class="ttc" id="astructpbuf__custom_html"><div class="ttname"><a href="structpbuf__custom.html">pbuf_custom</a></div><div class="ttdef"><b>Definition</b> pbuf.h:245</div></div>
 <div class="ttc" id="astructpbuf_html"><div class="ttname"><a href="structpbuf.html">pbuf</a></div><div class="ttdef"><b>Definition</b> pbuf.h:186</div></div>
 </div><!-- fragment --> </div></div><!-- contents -->
diff --git a/doc/mdns.txt b/doc/mdns.txt
index 0c28970..12ac04b 100644
--- a/doc/mdns.txt
+++ b/doc/mdns.txt
@@ -45,7 +45,7 @@
 
 
 To start responding on a netif, run
-  mdns_resp_add_netif(struct netif *netif, char *hostname, u32_t dns_ttl)
+  mdns_resp_add_netif(struct netif *netif, const char *hostname)
 
 The hostname will be copied. If this returns successfully, the netif will join
 the multicast groups and any MDNS/legacy DNS requests sent unicast or multicast
@@ -53,7 +53,6 @@
 - <hostname>.local type A, AAAA or ANY returns relevant IP addresses
 - Reverse lookups (PTR in-addr.arpa, ip6.arpa) of netif addresses
   returns <hostname>.local
-Answers will use the supplied TTL (in seconds)
 MDNS allows UTF-8 names, but it is recommended to stay within ASCII,
 since the default case-insensitive comparison assumes this.
 
@@ -71,8 +70,8 @@
 ================
 
 The netif first needs to be registered. Then run
-  mdns_resp_add_service(struct netif *netif, char *name, char *service,
-      u16_t proto, u16_t port, u32_t dns_ttl,
+  mdns_resp_add_service(struct netif *netif, const char *name, const char *service,
+      enum mdns_sd_proto proto, u16_t port,
       service_get_txt_fn_t txt_fn, void *txt_userdata);
 
 The name and service pointers will be copied. Name refers to the name of the
@@ -100,7 +99,7 @@
 If your device runs a webserver on port 80, an example call might be:
 
   mdns_resp_add_service(netif, "myweb", "_http"
-      DNSSD_PROTO_TCP, 80, 3600, srv_txt, NULL);
+      DNSSD_PROTO_TCP, 80, srv_txt, NULL);
 
 which will publish myweb._http._tcp.local for any hosts looking for web servers,
 and point them to <hostname>.local:80
@@ -109,4 +108,4 @@
 requests required from a client.
 
 To remove a service from a netif, run
-  mdns_resp_del_service(struct netif *netif, s8_t slot)
\ No newline at end of file
+  mdns_resp_del_service(struct netif *netif, u8_t slot)
diff --git a/doc/mqtt_client.txt b/doc/mqtt_client.txt
index 7fd93a8..d189a35 100644
--- a/doc/mqtt_client.txt
+++ b/doc/mqtt_client.txt
@@ -3,11 +3,13 @@
 Author: Erik Andersson
 
 Details of the MQTT protocol can be found at:
-http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html 
+http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html
 
 -----------------------------------------------------------------
 1. Initial steps, reserve memory and make connection to server:
 
+You need to increase MEMP_NUM_SYS_TIMEOUT by one if you use MQTT!
+
 1.1: Provide storage
 
 Static allocation:
@@ -19,34 +21,34 @@
   if(client != NULL) {
     example_do_connect(&client);
   }
-  
+
 1.2: Establish Connection with server
 
 void example_do_connect(mqtt_client_t *client)
 {
   struct mqtt_connect_client_info_t ci;
   err_t err;
-  
+
   /* Setup an empty client info structure */
   memset(&ci, 0, sizeof(ci));
-  
-  /* Minimal amount of information required is client identifier, so set it here */ 
+
+  /* Minimal amount of information required is client identifier, so set it here */
   ci.client_id = "lwip_test";
-  
+
   /* Initiate client and connect to server, if this fails immediately an error code is returned
-     otherwise mqtt_connection_cb will be called with connection result after attempting 
-     to establish a connection with the server. 
+     otherwise mqtt_connection_cb will be called with connection result after attempting
+     to establish a connection with the server.
      For now MQTT version 3.1.1 is always used */
-  
+
   err = mqtt_client_connect(client, ip_addr, MQTT_PORT, mqtt_connection_cb, 0, &ci);
-  
+
   /* For now just print the result code if something goes wrong */
   if(err != ERR_OK) {
     printf("mqtt_connect return %d\n", err);
   }
 }
 
-Connection to server can also be probed by calling mqtt_client_is_connected(client) 
+Connection to server can also be probed by calling mqtt_client_is_connected(client)
 
 -----------------------------------------------------------------
 2. Implementing the connection status callback
@@ -57,11 +59,11 @@
   err_t err;
   if(status == MQTT_CONNECT_ACCEPTED) {
     printf("mqtt_connection_cb: Successfully connected\n");
-    
+
     /* Setup callback for incoming publish requests */
     mqtt_set_inpub_callback(client, mqtt_incoming_publish_cb, mqtt_incoming_data_cb, arg);
-    
-    /* Subscribe to a topic named "subtopic" with QoS level 1, call mqtt_sub_request_cb with result */ 
+
+    /* Subscribe to a topic named "subtopic" with QoS level 1, call mqtt_sub_request_cb with result */
     err = mqtt_subscribe(client, "subtopic", 1, mqtt_sub_request_cb, arg);
 
     if(err != ERR_OK) {
@@ -69,16 +71,16 @@
     }
   } else {
     printf("mqtt_connection_cb: Disconnected, reason: %d\n", status);
-    
+
     /* Its more nice to be connected, so try to reconnect */
     example_do_connect(client);
-  }  
+  }
 }
 
 static void mqtt_sub_request_cb(void *arg, err_t result)
 {
-  /* Just print the result code here for simplicity, 
-     normal behaviour would be to take some action if subscribe fails like 
+  /* Just print the result code here for simplicity,
+     normal behaviour would be to take some action if subscribe fails like
      notifying user, retry subscribe or disconnect from server */
   printf("Subscribe result: %d\n", result);
 }
@@ -148,7 +150,7 @@
   }
 }
 
-/* Called when publish is complete either with sucess or failure */
+/* Called when publish is complete either with success or failure */
 static void mqtt_pub_request_cb(void *arg, err_t result)
 {
   if(result != ERR_OK) {
diff --git a/doc/ppp.txt b/doc/ppp.txt
index 8b88b3a..a713cc5 100644
--- a/doc/ppp.txt
+++ b/doc/ppp.txt
@@ -195,7 +195,7 @@
  *
  * Return value: len if write succeed
  */
-static u32_t output_cb(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx) {
+static u32_t output_cb(ppp_pcb *pcb, const void *data, u32_t len, void *ctx) {
   return uart_write(UART, data, len);
 }
 
@@ -404,7 +404,7 @@
 
 
 /*
- * Fonction to call for received data
+ * Function to call for received data
  *
  * ppp, PPP control block
  * buffer, input buffer
diff --git a/doc/savannah.txt b/doc/savannah.txt
index a98418d..1665999 100644
--- a/doc/savannah.txt
+++ b/doc/savannah.txt
@@ -102,14 +102,16 @@
  tar cjvf lwip-1.4.1.tar.bz2 lwip-1.4.1
  zip -r lwip-1.4.1.zip lwip-1.4.1
 
+Alternatively, archive the current directory using git
+ git archive -o lwip-1.4.1.tar.gz --prefix lwip-1.4.1/ STABLE-1_4_1
+
 Now, sign the archives with a detached GPG binary signature as follows:
  gpg -b lwip-1.4.1.tar.gz
  gpg -b lwip-1.4.1.tar.bz2
  gpg -b lwip-1.4.1.zip
 
-Upload these files using anonymous FTP:
- ncftp ftp://savannah.gnu.org/incoming/savannah/lwip
- ncftp> mput *1.4.1.*
+Upload these files using scp:
+ scp lwip-1.4.1.* <username>@dl.sv.nongnu.org:/releases/lwip/
 
 Additionally, you may post a news item on Savannah, like this:
 
diff --git a/src/Filelists.cmake b/src/Filelists.cmake
index 21d7b49..3a0430e 100644
--- a/src/Filelists.cmake
+++ b/src/Filelists.cmake
@@ -5,12 +5,16 @@
 #
 # 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 
+# 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(LWIP_VERSION_MAJOR    "2")
-set(LWIP_VERSION_MINOR    "1")
-set(LWIP_VERSION_REVISION "3")
+set(LWIP_VERSION_MINOR    "2")
+set(LWIP_VERSION_REVISION "0")
 # LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases
 # LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions
 # Numbers 1..31 are reserved for release candidates
@@ -24,11 +28,11 @@
     set(LWIP_VERSION_STRING
         "${LWIP_VERSION_MAJOR}.${LWIP_VERSION_MINOR}.${LWIP_VERSION_REVISION}.dev"
     )
-else ("${LWIP_VERSION_RC}" STREQUAL "LWIP_RC_RELEASE")
+else()
     set(LWIP_VERSION_STRING
         "${LWIP_VERSION_MAJOR}.${LWIP_VERSION_MINOR}.${LWIP_VERSION_REVISION}.rc${LWIP_VERSION_RC}"
     )
-endif ("${LWIP_VERSION_RC}" STREQUAL "LWIP_RC_RELEASE")
+endif()
 
 # The minimum set of files needed for lwIP.
 set(lwipcore_SRCS
@@ -54,6 +58,7 @@
     ${LWIP_DIR}/src/core/udp.c
 )
 set(lwipcore4_SRCS
+    ${LWIP_DIR}/src/core/ipv4/acd.c
     ${LWIP_DIR}/src/core/ipv4/autoip.c
     ${LWIP_DIR}/src/core/ipv4/dhcp.c
     ${LWIP_DIR}/src/core/ipv4/etharp.c
@@ -93,9 +98,12 @@
     ${LWIP_DIR}/src/netif/ethernet.c
     ${LWIP_DIR}/src/netif/bridgeif.c
     ${LWIP_DIR}/src/netif/bridgeif_fdb.c
-    ${LWIP_DIR}/src/netif/slipif.c
 )
 
+if (NOT ${LWIP_EXCLUDE_SLIPIF})
+	list(APPEND lwipnetif_SRCS ${LWIP_DIR}/src/netif/slipif.c)
+endif()
+
 # 6LoWPAN
 set(lwipsixlowpan_SRCS
     ${LWIP_DIR}/src/netif/lowpan6_common.c
@@ -194,6 +202,8 @@
 # MDNS responder
 set(lwipmdns_SRCS
     ${LWIP_DIR}/src/apps/mdns/mdns.c
+    ${LWIP_DIR}/src/apps/mdns/mdns_out.c
+    ${LWIP_DIR}/src/apps/mdns/mdns_domain.c
 )
 
 # NetBIOS name server
@@ -203,7 +213,7 @@
 
 # TFTP server files
 set(lwiptftp_SRCS
-    ${LWIP_DIR}/src/apps/tftp/tftp_server.c
+    ${LWIP_DIR}/src/apps/tftp/tftp.c
 )
 
 # MQTT client files
@@ -240,7 +250,6 @@
     ${lwipnetbios_SRCS}
     ${lwiptftp_SRCS}
     ${lwipmqtt_SRCS}
-    ${lwipmbedtls_SRCS}
 )
 
 # Generate lwip/init.h (version info)
@@ -255,7 +264,7 @@
 
 find_package(Doxygen)
 if (DOXYGEN_FOUND)
-    message("Doxygen build started")
+    message(STATUS "Doxygen build started")
 
     add_custom_target(lwipdocs
         COMMAND ${CMAKE_COMMAND} -E remove_directory ${DOXYGEN_DIR}/${DOXYGEN_OUTPUT_DIR}/html
@@ -264,7 +273,7 @@
         COMMENT "Generating API documentation with Doxygen"
         VERBATIM)
 else (DOXYGEN_FOUND)
-    message("Doxygen needs to be installed to generate the doxygen documentation")
+    message(STATUS "Doxygen needs to be installed to generate the doxygen documentation")
 endif (DOXYGEN_FOUND)
 
 # lwIP libraries
@@ -277,3 +286,8 @@
 target_compile_options(lwipallapps PRIVATE ${LWIP_COMPILER_FLAGS})
 target_compile_definitions(lwipallapps PRIVATE ${LWIP_DEFINITIONS}  ${LWIP_MBEDTLS_DEFINITIONS})
 target_include_directories(lwipallapps PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS})
+
+add_library(lwipmbedtls EXCLUDE_FROM_ALL ${lwipmbedtls_SRCS})
+target_compile_options(lwipmbedtls PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwipmbedtls PRIVATE ${LWIP_DEFINITIONS}  ${LWIP_MBEDTLS_DEFINITIONS})
+target_include_directories(lwipmbedtls PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS})
diff --git a/src/Filelists.mk b/src/Filelists.mk
index 828b9f2..7e076f3 100644
--- a/src/Filelists.mk
+++ b/src/Filelists.mk
@@ -1,8 +1,8 @@
 #
 # Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
-# All rights reserved. 
-# 
-# Redistribution and use in source and binary forms, with or without modification, 
+# 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,
@@ -11,21 +11,21 @@
 #    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. 
+#    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 
+# 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>
 #
 
@@ -51,7 +51,8 @@
 	$(LWIPDIR)/core/timeouts.c \
 	$(LWIPDIR)/core/udp.c
 
-CORE4FILES=$(LWIPDIR)/core/ipv4/autoip.c \
+CORE4FILES=$(LWIPDIR)/core/ipv4/acd.c \
+	$(LWIPDIR)/core/ipv4/autoip.c \
 	$(LWIPDIR)/core/ipv4/dhcp.c \
 	$(LWIPDIR)/core/ipv4/etharp.c \
 	$(LWIPDIR)/core/ipv4/icmp.c \
@@ -176,13 +177,15 @@
 SNTPFILES=$(LWIPDIR)/apps/sntp/sntp.c
 
 # MDNSFILES: MDNS responder
-MDNSFILES=$(LWIPDIR)/apps/mdns/mdns.c
+MDNSFILES=$(LWIPDIR)/apps/mdns/mdns.c \
+	$(LWIPDIR)/apps/mdns/mdns_out.c \
+	$(LWIPDIR)/apps/mdns/mdns_domain.c
 
 # NETBIOSNSFILES: NetBIOS name server
 NETBIOSNSFILES=$(LWIPDIR)/apps/netbiosns/netbiosns.c
 
-# TFTPFILES: TFTP server files
-TFTPFILES=$(LWIPDIR)/apps/tftp/tftp_server.c
+# TFTPFILES: TFTP client/server files
+TFTPFILES=$(LWIPDIR)/apps/tftp/tftp.c
 
 # MQTTFILES: MQTT client files
 MQTTFILES=$(LWIPDIR)/apps/mqtt/mqtt.c
diff --git a/src/api/api_lib.c b/src/api/api_lib.c
index ffa14d6..60678f8 100644
--- a/src/api/api_lib.c
+++ b/src/api/api_lib.c
@@ -323,7 +323,7 @@
    * and NETCONN_FLAG_IPV6_V6ONLY is 0, use IP_ANY_TYPE to bind
    */
   if ((netconn_get_ipv6only(conn) == 0) &&
-      ip_addr_cmp(addr, IP6_ADDR_ANY)) {
+      ip_addr_eq(addr, IP6_ADDR_ANY)) {
     addr = IP_ANY_TYPE;
   }
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
@@ -1260,13 +1260,13 @@
  *
  * @param name a string representation of the DNS host name to query
  * @param addr a preallocated ip_addr_t where to store the resolved IP address
- * @param dns_addrtype IP address type (IPv4 / IPv6)
  * @return ERR_OK: resolving succeeded
  *         ERR_MEM: memory error, try again later
  *         ERR_ARG: dns client not initialized or invalid hostname
  *         ERR_VAL: dns server response was invalid
  */
 #if LWIP_IPV4 && LWIP_IPV6
+/** @param dns_addrtype IP address type (IPv4 / IPv6) */
 err_t
 netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype)
 #else
diff --git a/src/api/api_msg.c b/src/api/api_msg.c
index 3f08e03..8092be9 100644
--- a/src/api/api_msg.c
+++ b/src/api/api_msg.c
@@ -93,7 +93,7 @@
 #endif /* LWIP_TCPIP_CORE_LOCKING */
 
 #if LWIP_NETCONN_FULLDUPLEX
-const u8_t netconn_deleted = 0;
+static const u8_t netconn_deleted = 0;
 
 int
 lwip_netconn_is_deallocated_msg(void *msg)
@@ -106,9 +106,9 @@
 #endif /* LWIP_NETCONN_FULLDUPLEX */
 
 #if LWIP_TCP
-const u8_t netconn_aborted = 0;
-const u8_t netconn_reset = 0;
-const u8_t netconn_closed = 0;
+static const u8_t netconn_aborted = 0;
+static const u8_t netconn_reset = 0;
+static const u8_t netconn_closed = 0;
 
 /** Translate an error to a unique void* passed via an mbox */
 static void *
@@ -221,6 +221,7 @@
   struct netbuf *buf;
   struct netconn *conn;
   u16_t len;
+  err_t err;
 #if LWIP_SO_RCVBUF
   int recv_avail;
 #endif /* LWIP_SO_RCVBUF */
@@ -269,8 +270,10 @@
   }
 
   len = p->tot_len;
-  if (sys_mbox_trypost(&conn->recvmbox, buf) != ERR_OK) {
+  err = sys_mbox_trypost(&conn->recvmbox, buf);
+  if (err != ERR_OK) {
     netbuf_delete(buf);
+    LWIP_DEBUGF(API_MSG_DEBUG, ("recv_udp: sys_mbox_trypost failed, err=%d\n", err));
     return;
   } else {
 #if LWIP_SO_RCVBUF
@@ -469,7 +472,7 @@
   }
   /* pass error message to acceptmbox to wake up pending accept */
   if (NETCONN_MBOX_VALID(conn, &conn->acceptmbox)) {
-    /* use trypost to preven deadlock */
+    /* use trypost to prevent deadlock */
     sys_mbox_trypost(&conn->acceptmbox, mbox_msg);
   }
 
@@ -492,7 +495,7 @@
         conn->current_msg->err = err;
       }
       op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
-      LWIP_ASSERT("inavlid op_completed_sem", sys_sem_valid(op_completed_sem));
+      LWIP_ASSERT("invalid op_completed_sem", sys_sem_valid(op_completed_sem));
       conn->current_msg = NULL;
       /* wake up the waiting task */
       sys_sem_signal(op_completed_sem);
@@ -759,10 +762,8 @@
   sys_mbox_set_invalid(&conn->acceptmbox);
 #endif
   conn->state        = NETCONN_NONE;
-#if LWIP_SOCKET
   /* initialize socket to -1 since 0 is a valid socket */
-  conn->socket       = -1;
-#endif /* LWIP_SOCKET */
+  conn->callback_arg.socket = -1;
   conn->callback     = callback;
 #if LWIP_TCP
   conn->current_msg  = NULL;
@@ -978,7 +979,7 @@
   /* Try to close the connection */
   if (shut_close) {
 #if LWIP_SO_LINGER
-    /* check linger possibilites before calling tcp_close */
+    /* check linger possibilities before calling tcp_close */
     err = ERR_OK;
     /* linger enabled/required at all? (i.e. is there untransmitted data left?) */
     if ((conn->linger >= 0) && (conn->pcb.tcp->unsent || conn->pcb.tcp->unacked)) {
@@ -1472,7 +1473,7 @@
           /* "Socket API like" dual-stack support: If IP to listen to is IP6_ADDR_ANY,
             * and NETCONN_FLAG_IPV6_V6ONLY is NOT set, use IP_ANY_TYPE to listen
             */
-          if (ip_addr_cmp(&msg->conn->pcb.ip->local_ip, IP6_ADDR_ANY) &&
+          if (ip_addr_eq(&msg->conn->pcb.ip->local_ip, IP6_ADDR_ANY) &&
               (netconn_get_ipv6only(msg->conn) == 0)) {
             /* change PCB type to IPADDR_TYPE_ANY */
             IP_SET_TYPE_VAL(msg->conn->pcb.tcp->local_ip,  IPADDR_TYPE_ANY);
diff --git a/src/api/if_api.c b/src/api/if_api.c
index 8e094d0..d274c32 100644
--- a/src/api/if_api.c
+++ b/src/api/if_api.c
@@ -77,7 +77,7 @@
 
 /**
  * @ingroup if_api
- * Returs the interface index corresponding to name ifname.
+ * Returns the interface index corresponding to name ifname.
  * @param ifname Interface name
  * @return The corresponding index if ifname is the name of an interface;
  * otherwise, zero.
diff --git a/src/api/netbuf.c b/src/api/netbuf.c
index 3b910de..8f5be9e 100644
--- a/src/api/netbuf.c
+++ b/src/api/netbuf.c
@@ -5,8 +5,8 @@
  * @defgroup netbuf Network buffers
  * @ingroup netconn
  * Network buffer descriptor for @ref netconn. Based on @ref pbuf internally
- * to avoid copying data around.\n
- * Buffers must not be shared accross multiple threads, all functions except
+ * to avoid copying data around.<br>
+ * Buffers must not be shared across multiple threads, all functions except
  * netbuf_new() and netbuf_delete() are not thread-safe.
  */
 
diff --git a/src/api/netdb.c b/src/api/netdb.c
index ee78297..e07ab04 100644
--- a/src/api/netdb.c
+++ b/src/api/netdb.c
@@ -61,13 +61,18 @@
 int h_errno;
 #endif /* LWIP_DNS_API_DECLARE_H_ERRNO */
 
-/** define "hostent" variables storage: 0 if we use a static (but unprotected)
- * set of variables for lwip_gethostbyname, 1 if we use a local storage */
+/** LWIP_DNS_API_HOSTENT_STORAGE: if set to 0 (default), lwip_gethostbyname()
+ * returns the same global variabe for all calls (in all threads).
+ * When set to 1, your port should provide a function
+ *      struct hostent* sys_thread_hostent( struct hostent* h);
+ * which have to do a copy of "h" and return a pointer ont the "per-thread"
+ * copy.
+ */
 #ifndef LWIP_DNS_API_HOSTENT_STORAGE
 #define LWIP_DNS_API_HOSTENT_STORAGE 0
 #endif
 
-/** define "hostent" variables storage */
+/* define "hostent" variables storage */
 #if LWIP_DNS_API_HOSTENT_STORAGE
 #define HOSTENT_STORAGE
 #else
diff --git a/src/api/sockets.c b/src/api/sockets.c
index 7852635..b911194 100644
--- a/src/api/sockets.c
+++ b/src/api/sockets.c
@@ -85,9 +85,53 @@
 #define API_SELECT_CB_VAR_ALLOC(name, retblock)   API_VAR_ALLOC_EXT(struct lwip_select_cb, MEMP_SELECT_CB, name, retblock)
 #define API_SELECT_CB_VAR_FREE(name)              API_VAR_FREE(MEMP_SELECT_CB, name)
 
+#ifndef LWIP_SOCKET_HAVE_SA_LEN
+#define LWIP_SOCKET_HAVE_SA_LEN 0
+#endif /* LWIP_SOCKET_HAVE_SA_LEN */
+
+/* Address length safe read and write */
+#if LWIP_SOCKET_HAVE_SA_LEN
+
+#if LWIP_IPV4
+#define IP4ADDR_SOCKADDR_SET_LEN(sin) \
+      (sin)->sin_len = sizeof(struct sockaddr_in)
+#endif /* LWIP_IPV4 */
+
+#if LWIP_IPV6
+#define IP6ADDR_SOCKADDR_SET_LEN(sin6) \
+      (sin6)->sin6_len = sizeof(struct sockaddr_in6)
+#endif /* LWIP_IPV6 */
+
+#define IPADDR_SOCKADDR_GET_LEN(addr) \
+      (addr)->sa.sa_len
+
+#else
+
+#if LWIP_IPV4
+#define IP4ADDR_SOCKADDR_SET_LEN(addr)
+#endif /* LWIP_IPV4 */
+
+#if LWIP_IPV6
+#define IP6ADDR_SOCKADDR_SET_LEN(addr)
+#endif /* LWIP_IPV6 */
+
+#if LWIP_IPV4 && LWIP_IPV6
+#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))
+#elif LWIP_IPV4
+#define IPADDR_SOCKADDR_GET_LEN(addr) sizeof(struct sockaddr_in)
+#elif LWIP_IPV6
+#define IPADDR_SOCKADDR_GET_LEN(addr) sizeof(struct sockaddr_in6)
+#else
+#define IPADDR_SOCKADDR_GET_LEN(addr) sizeof(struct sockaddr)
+#endif /* LWIP_IPV4 && LWIP_IPV6 */
+
+#endif /* LWIP_SOCKET_HAVE_SA_LEN */
+
 #if LWIP_IPV4
 #define IP4ADDR_PORT_TO_SOCKADDR(sin, ipaddr, port) do { \
-      (sin)->sin_len = sizeof(struct sockaddr_in); \
+      IP4ADDR_SOCKADDR_SET_LEN(sin); \
       (sin)->sin_family = AF_INET; \
       (sin)->sin_port = lwip_htons((port)); \
       inet_addr_from_ip4addr(&(sin)->sin_addr, ipaddr); \
@@ -99,7 +143,7 @@
 
 #if LWIP_IPV6
 #define IP6ADDR_PORT_TO_SOCKADDR(sin6, ipaddr, port) do { \
-      (sin6)->sin6_len = sizeof(struct sockaddr_in6); \
+      IP6ADDR_SOCKADDR_SET_LEN(sin6); \
       (sin6)->sin6_family = AF_INET6; \
       (sin6)->sin6_port = lwip_htons((port)); \
       (sin6)->sin6_flowinfo = 0; \
@@ -156,7 +200,7 @@
                                                     IS_SOCK_ADDR_TYPE_VALID(name))
 #define SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock) (((name)->sa_family == AF_UNSPEC) || \
                                                     SOCK_ADDR_TYPE_MATCH(name, sock))
-#define IS_SOCK_ADDR_ALIGNED(name)      ((((mem_ptr_t)(name)) % 4) == 0)
+#define IS_SOCK_ADDR_ALIGNED(name)      ((((mem_ptr_t)(name)) % LWIP_MIN(4, MEM_ALIGNMENT)) == 0)
 
 
 #define LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype) do { if ((optlen) < sizeof(opttype)) { done_socket(sock); return EINVAL; }}while(0)
@@ -178,7 +222,7 @@
 #define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock) do { \
   name = (struct lwip_setgetsockopt_data *)memp_malloc(MEMP_SOCKET_SETGETSOCKOPT_DATA); \
   if (name == NULL) { \
-    sock_set_errno(sock, ENOMEM); \
+    set_errno(ENOMEM); \
     done_socket(sock); \
     return -1; \
   } }while(0)
@@ -278,11 +322,6 @@
 static struct lwip_select_cb *select_cb_list;
 #endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
 
-#define sock_set_errno(sk, e) do { \
-  const int sockerr = (e); \
-  set_errno(sockerr); \
-} while (0)
-
 /* Forward declaration of some functions */
 #if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
 static void event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len);
@@ -639,11 +678,11 @@
   if (err != ERR_OK) {
     LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_acept failed, err=%d\n", s, err));
     if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
-      sock_set_errno(sock, EOPNOTSUPP);
+      set_errno(EOPNOTSUPP);
     } else if (err == ERR_CLSD) {
-      sock_set_errno(sock, EINVAL);
+      set_errno(EINVAL);
     } else {
-      sock_set_errno(sock, err_to_errno(err));
+      set_errno(err_to_errno(err));
     }
     done_socket(sock);
     return -1;
@@ -653,7 +692,7 @@
   newsock = alloc_socket(newconn, 1);
   if (newsock == -1) {
     netconn_delete(newconn);
-    sock_set_errno(sock, ENFILE);
+    set_errno(ENFILE);
     done_socket(sock);
     return -1;
   }
@@ -666,8 +705,8 @@
    * so nsock->rcvevent is >= 1 here!
    */
   SYS_ARCH_PROTECT(lev);
-  recvevent = (s16_t)(-1 - newconn->socket);
-  newconn->socket = newsock;
+  recvevent = (s16_t)(-1 - newconn->callback_arg.socket);
+  newconn->callback_arg.socket = newsock;
   SYS_ARCH_UNPROTECT(lev);
 
   if (newconn->callback) {
@@ -689,14 +728,14 @@
     if (err != ERR_OK) {
       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_peer failed, err=%d\n", s, err));
       free_socket(nsock, 1);
-      sock_set_errno(sock, err_to_errno(err));
+      set_errno(err_to_errno(err));
       done_socket(sock);
       return -1;
     }
 
     IPADDR_PORT_TO_SOCKADDR(&tempaddr, &naddr, port);
-    if (*addrlen > tempaddr.sa.sa_len) {
-      *addrlen = tempaddr.sa.sa_len;
+    if (*addrlen > IPADDR_SOCKADDR_GET_LEN(&tempaddr)) {
+      *addrlen = IPADDR_SOCKADDR_GET_LEN(&tempaddr);
     }
     MEMCPY(addr, &tempaddr, *addrlen);
 
@@ -704,10 +743,10 @@
     ip_addr_debug_print_val(SOCKETS_DEBUG, naddr);
     LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", port));
   } else {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d", s, newsock));
+    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d\n", s, newsock));
   }
 
-  sock_set_errno(sock, 0);
+  set_errno(0);
   done_socket(sock);
   done_socket(nsock);
   return newsock;
@@ -728,7 +767,7 @@
 
   if (!SOCK_ADDR_TYPE_MATCH(name, sock)) {
     /* sockaddr does not match socket type (IPv4/IPv6) */
-    sock_set_errno(sock, err_to_errno(ERR_VAL));
+    set_errno(err_to_errno(ERR_VAL));
     done_socket(sock);
     return -1;
   }
@@ -736,7 +775,7 @@
   /* check size, family and alignment of 'name' */
   LWIP_ERROR("lwip_bind: invalid address", (IS_SOCK_ADDR_LEN_VALID(namelen) &&
              IS_SOCK_ADDR_TYPE_VALID(name) && IS_SOCK_ADDR_ALIGNED(name)),
-             sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
+             set_errno(err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
   LWIP_UNUSED_ARG(namelen);
 
   SOCKADDR_TO_IPADDR_PORT(name, &local_addr, local_port);
@@ -756,13 +795,13 @@
 
   if (err != ERR_OK) {
     LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) failed, err=%d\n", s, err));
-    sock_set_errno(sock, err_to_errno(err));
+    set_errno(err_to_errno(err));
     done_socket(sock);
     return -1;
   }
 
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) succeeded\n", s));
-  sock_set_errno(sock, 0);
+  set_errno(0);
   done_socket(sock);
   return 0;
 }
@@ -798,7 +837,7 @@
 
   err = netconn_prepare_delete(sock->conn);
   if (err != ERR_OK) {
-    sock_set_errno(sock, err_to_errno(err));
+    set_errno(err_to_errno(err));
     done_socket(sock);
     return -1;
   }
@@ -821,7 +860,7 @@
 
   if (!SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock)) {
     /* sockaddr does not match socket type (IPv4/IPv6) */
-    sock_set_errno(sock, err_to_errno(ERR_VAL));
+    set_errno(err_to_errno(ERR_VAL));
     done_socket(sock);
     return -1;
   }
@@ -837,7 +876,7 @@
     /* check size, family and alignment of 'name' */
     LWIP_ERROR("lwip_connect: invalid address", IS_SOCK_ADDR_LEN_VALID(namelen) &&
                IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name) && IS_SOCK_ADDR_ALIGNED(name),
-               sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
+               set_errno(err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
 
     SOCKADDR_TO_IPADDR_PORT(name, &remote_addr, remote_port);
     LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, addr=", s));
@@ -857,13 +896,13 @@
 
   if (err != ERR_OK) {
     LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) failed, err=%d\n", s, err));
-    sock_set_errno(sock, err_to_errno(err));
+    set_errno(err_to_errno(err));
     done_socket(sock);
     return -1;
   }
 
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) succeeded\n", s));
-  sock_set_errno(sock, 0);
+  set_errno(0);
   done_socket(sock);
   return 0;
 }
@@ -897,15 +936,15 @@
   if (err != ERR_OK) {
     LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d) failed, err=%d\n", s, err));
     if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
-      sock_set_errno(sock, EOPNOTSUPP);
+      set_errno(EOPNOTSUPP);
     } else {
-      sock_set_errno(sock, err_to_errno(err));
+      set_errno(err_to_errno(err));
     }
     done_socket(sock);
     return -1;
   }
 
-  sock_set_errno(sock, 0);
+  set_errno(0);
   done_socket(sock);
   return 0;
 }
@@ -954,7 +993,7 @@
         /* We should really do some error checking here. */
         LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: p == NULL, error is \"%s\"!\n",
                                     lwip_strerr(err)));
-        sock_set_errno(sock, err_to_errno(err));
+        set_errno(err_to_errno(err));
         if (err == ERR_CLSD) {
           return 0;
         } else {
@@ -973,7 +1012,7 @@
     } else {
       copylen = (u16_t)recv_left;
     }
-    if (recvd + copylen < recvd) {
+    if (recvd > SSIZE_MAX - copylen) {
       /* overflow */
       copylen = (u16_t)(SSIZE_MAX - recvd);
     }
@@ -1012,7 +1051,7 @@
     /* ensure window update after copying all data */
     netconn_tcp_recvd(sock->conn, (size_t)recvd);
   }
-  sock_set_errno(sock, 0);
+  set_errno(0);
   return recvd;
 }
 #endif
@@ -1040,10 +1079,10 @@
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
 
   IPADDR_PORT_TO_SOCKADDR(&saddr, fromaddr, port);
-  if (*fromlen < saddr.sa.sa_len) {
+  if (*fromlen < IPADDR_SOCKADDR_GET_LEN(&saddr)) {
     truncated = 1;
-  } else if (*fromlen > saddr.sa.sa_len) {
-    *fromlen = saddr.sa.sa_len;
+  } else if (*fromlen > IPADDR_SOCKADDR_GET_LEN(&saddr)) {
+    *fromlen = IPADDR_SOCKADDR_GET_LEN(&saddr);
   }
   MEMCPY(from, &saddr, *fromlen);
   return truncated;
@@ -1090,7 +1129,7 @@
   u8_t apiflags;
   err_t err;
   u16_t buflen, copylen, copied;
-  int i;
+  msg_iovlen_t i;
 
   LWIP_UNUSED_ARG(dbg_s);
   LWIP_ERROR("lwip_recvfrom_udp_raw: invalid arguments", (msg->msg_iov != NULL) || (msg->msg_iovlen <= 0), return ERR_ARG;);
@@ -1232,7 +1271,7 @@
     if (err != ERR_OK) {
       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom[UDP/RAW](%d): buf == NULL, error is \"%s\"!\n",
                                   s, lwip_strerr(err)));
-      sock_set_errno(sock, err_to_errno(err));
+      set_errno(err_to_errno(err));
       done_socket(sock);
       return -1;
     }
@@ -1242,7 +1281,7 @@
     }
   }
 
-  sock_set_errno(sock, 0);
+  set_errno(0);
   done_socket(sock);
   return ret;
 }
@@ -1280,7 +1319,7 @@
 lwip_recvmsg(int s, struct msghdr *message, int flags)
 {
   struct lwip_sock *sock;
-  int i;
+  msg_iovlen_t i;
   ssize_t buflen;
 
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvmsg(%d, message=%p, flags=0x%x)\n", s, (void *)message, flags));
@@ -1304,7 +1343,7 @@
     if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) ||
         ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) ||
         ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) {
-      sock_set_errno(sock, err_to_errno(ERR_VAL));
+      set_errno(err_to_errno(ERR_VAL));
       done_socket(sock);
       return -1;
     }
@@ -1338,13 +1377,13 @@
     }
     if (buflen > 0) {
       /* reset socket error since we have received something */
-      sock_set_errno(sock, 0);
+      set_errno(0);
     }
     /* " If the socket is connected, the msg_name and msg_namelen members shall be ignored." */
     done_socket(sock);
     return buflen;
 #else /* LWIP_TCP */
-    sock_set_errno(sock, err_to_errno(ERR_ARG));
+    set_errno(err_to_errno(ERR_ARG));
     done_socket(sock);
     return -1;
 #endif /* LWIP_TCP */
@@ -1358,7 +1397,7 @@
     if (err != ERR_OK) {
       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvmsg[UDP/RAW](%d): buf == NULL, error is \"%s\"!\n",
                                   s, lwip_strerr(err)));
-      sock_set_errno(sock, err_to_errno(err));
+      set_errno(err_to_errno(err));
       done_socket(sock);
       return -1;
     }
@@ -1366,12 +1405,12 @@
       message->msg_flags |= MSG_TRUNC;
     }
 
-    sock_set_errno(sock, 0);
+    set_errno(0);
     done_socket(sock);
     return (int)datagram_len;
   }
 #else /* LWIP_UDP || LWIP_RAW */
-  sock_set_errno(sock, err_to_errno(ERR_ARG));
+  set_errno(err_to_errno(ERR_ARG));
   done_socket(sock);
   return -1;
 #endif /* LWIP_UDP || LWIP_RAW */
@@ -1398,7 +1437,7 @@
     done_socket(sock);
     return lwip_sendto(s, data, size, flags, NULL, 0);
 #else /* (LWIP_UDP || LWIP_RAW) */
-    sock_set_errno(sock, err_to_errno(ERR_ARG));
+    set_errno(err_to_errno(ERR_ARG));
     done_socket(sock);
     return -1;
 #endif /* (LWIP_UDP || LWIP_RAW) */
@@ -1411,7 +1450,7 @@
   err = netconn_write_partly(sock->conn, data, size, write_flags, &written);
 
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) err=%d written=%"SZT_F"\n", s, err, written));
-  sock_set_errno(sock, err_to_errno(err));
+  set_errno(err_to_errno(err));
   done_socket(sock);
   /* casting 'written' to ssize_t is OK here since the netconn API limits it to SSIZE_MAX */
   return (err == ERR_OK ? (ssize_t)written : -1);
@@ -1433,13 +1472,13 @@
   }
 
   LWIP_ERROR("lwip_sendmsg: invalid msghdr", msg != NULL,
-             sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
+             set_errno(err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
   LWIP_ERROR("lwip_sendmsg: invalid msghdr iov", msg->msg_iov != NULL,
-             sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
+             set_errno(err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
   LWIP_ERROR("lwip_sendmsg: maximum iovs exceeded", (msg->msg_iovlen > 0) && (msg->msg_iovlen <= IOV_MAX),
-             sock_set_errno(sock, EMSGSIZE); done_socket(sock); return -1;);
+             set_errno(EMSGSIZE); done_socket(sock); return -1;);
   LWIP_ERROR("lwip_sendmsg: unsupported flags", (flags & ~(MSG_DONTWAIT | MSG_MORE)) == 0,
-             sock_set_errno(sock, EOPNOTSUPP); done_socket(sock); return -1;);
+             set_errno(EOPNOTSUPP); done_socket(sock); return -1;);
 
   LWIP_UNUSED_ARG(msg->msg_control);
   LWIP_UNUSED_ARG(msg->msg_controllen);
@@ -1453,12 +1492,12 @@
 
     written = 0;
     err = netconn_write_vectors_partly(sock->conn, (struct netvector *)msg->msg_iov, (u16_t)msg->msg_iovlen, write_flags, &written);
-    sock_set_errno(sock, err_to_errno(err));
+    set_errno(err_to_errno(err));
     done_socket(sock);
     /* casting 'written' to ssize_t is OK here since the netconn API limits it to SSIZE_MAX */
     return (err == ERR_OK ? (ssize_t)written : -1);
 #else /* LWIP_TCP */
-    sock_set_errno(sock, err_to_errno(ERR_ARG));
+    set_errno(err_to_errno(ERR_ARG));
     done_socket(sock);
     return -1;
 #endif /* LWIP_TCP */
@@ -1467,13 +1506,13 @@
 #if LWIP_UDP || LWIP_RAW
   {
     struct netbuf chain_buf;
-    int i;
+    msg_iovlen_t i;
     ssize_t size = 0;
 
     LWIP_UNUSED_ARG(flags);
     LWIP_ERROR("lwip_sendmsg: invalid msghdr name", (((msg->msg_name == NULL) && (msg->msg_namelen == 0)) ||
                IS_SOCK_ADDR_LEN_VALID(msg->msg_namelen)),
-               sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
+               set_errno(err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
 
     /* initialize chain buffer with destination */
     memset(&chain_buf, 0, sizeof(struct netbuf));
@@ -1564,17 +1603,17 @@
     /* deallocated the buffer */
     netbuf_free(&chain_buf);
 
-    sock_set_errno(sock, err_to_errno(err));
+    set_errno(err_to_errno(err));
     done_socket(sock);
     return (err == ERR_OK ? size : -1);
 sendmsg_emsgsize:
-    sock_set_errno(sock, EMSGSIZE);
+    set_errno(EMSGSIZE);
     netbuf_free(&chain_buf);
     done_socket(sock);
     return -1;
   }
 #else /* LWIP_UDP || LWIP_RAW */
-  sock_set_errno(sock, err_to_errno(ERR_ARG));
+  set_errno(err_to_errno(ERR_ARG));
   done_socket(sock);
   return -1;
 #endif /* LWIP_UDP || LWIP_RAW */
@@ -1601,7 +1640,7 @@
     return lwip_send(s, data, size, flags);
 #else /* LWIP_TCP */
     LWIP_UNUSED_ARG(flags);
-    sock_set_errno(sock, err_to_errno(ERR_ARG));
+    set_errno(err_to_errno(ERR_ARG));
     done_socket(sock);
     return -1;
 #endif /* LWIP_TCP */
@@ -1609,7 +1648,7 @@
 
   if (size > LWIP_MIN(0xFFFF, SSIZE_MAX)) {
     /* cannot fit into one datagram (at least for us) */
-    sock_set_errno(sock, EMSGSIZE);
+    set_errno(EMSGSIZE);
     done_socket(sock);
     return -1;
   }
@@ -1617,7 +1656,7 @@
   LWIP_ERROR("lwip_sendto: invalid address", (((to == NULL) && (tolen == 0)) ||
              (IS_SOCK_ADDR_LEN_VALID(tolen) &&
               ((to != NULL) && (IS_SOCK_ADDR_TYPE_VALID(to) && IS_SOCK_ADDR_ALIGNED(to))))),
-             sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
+             set_errno(err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
   LWIP_UNUSED_ARG(tolen);
 
   /* initialize a buffer */
@@ -1675,7 +1714,7 @@
   /* deallocated the buffer */
   netbuf_free(&buf);
 
-  sock_set_errno(sock, err_to_errno(err));
+  set_errno(err_to_errno(err));
   done_socket(sock);
   return (err == ERR_OK ? short_size : -1);
 }
@@ -1734,7 +1773,7 @@
     set_errno(ENFILE);
     return -1;
   }
-  conn->socket = i;
+  conn->callback_arg.socket = i;
   done_socket(&sockets[i - LWIP_SOCKET_OFFSET]);
   LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i));
   set_errno(0);
@@ -2076,7 +2115,7 @@
           set_errno(EBADF);
         } else if (!nready) {
           /* Still none ready, just wait to be woken */
-          if (timeout == 0) {
+          if (timeout == NULL) {
             /* Wait forever */
             msectimeout = 0;
           } else {
@@ -2490,7 +2529,7 @@
 
   /* Get socket */
   if (conn) {
-    s = conn->socket;
+    s = conn->callback_arg.socket;
     if (s < 0) {
       /* Data comes in right away after an accept, even though
        * the server task might not have created a new socket yet.
@@ -2498,16 +2537,16 @@
        * will use the data later. Note that only receive events
        * can happen before the new socket is set up. */
       SYS_ARCH_PROTECT(lev);
-      if (conn->socket < 0) {
+      if (conn->callback_arg.socket < 0) {
         if (evt == NETCONN_EVT_RCVPLUS) {
           /* conn->socket is -1 on initialization
              lwip_accept adjusts sock->recvevent if conn->socket < -1 */
-          conn->socket--;
+          conn->callback_arg.socket--;
         }
         SYS_ARCH_UNPROTECT(lev);
         return;
       }
-      s = conn->socket;
+      s = conn->callback_arg.socket;
       SYS_ARCH_UNPROTECT(lev);
     }
 
@@ -2673,12 +2712,12 @@
 
   if (sock->conn != NULL) {
     if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
-      sock_set_errno(sock, EOPNOTSUPP);
+      set_errno(EOPNOTSUPP);
       done_socket(sock);
       return -1;
     }
   } else {
-    sock_set_errno(sock, ENOTCONN);
+    set_errno(ENOTCONN);
     done_socket(sock);
     return -1;
   }
@@ -2691,13 +2730,13 @@
     shut_rx = 1;
     shut_tx = 1;
   } else {
-    sock_set_errno(sock, EINVAL);
+    set_errno(EINVAL);
     done_socket(sock);
     return -1;
   }
   err = netconn_shutdown(sock->conn, shut_rx, shut_tx);
 
-  sock_set_errno(sock, err_to_errno(err));
+  set_errno(err_to_errno(err));
   done_socket(sock);
   return (err == ERR_OK ? 0 : -1);
 }
@@ -2719,7 +2758,7 @@
   /* get the IP address and port */
   err = netconn_getaddr(sock->conn, &naddr, &port, local);
   if (err != ERR_OK) {
-    sock_set_errno(sock, err_to_errno(err));
+    set_errno(err_to_errno(err));
     done_socket(sock);
     return -1;
   }
@@ -2739,12 +2778,12 @@
   ip_addr_debug_print_val(SOCKETS_DEBUG, naddr);
   LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", port));
 
-  if (*namelen > saddr.sa.sa_len) {
-    *namelen = saddr.sa.sa_len;
+  if (*namelen > IPADDR_SOCKADDR_GET_LEN(&saddr)) {
+    *namelen = IPADDR_SOCKADDR_GET_LEN(&saddr);
   }
   MEMCPY(name, &saddr, *namelen);
 
-  sock_set_errno(sock, 0);
+  set_errno(0);
   done_socket(sock);
   return 0;
 }
@@ -2776,7 +2815,7 @@
   }
 
   if ((NULL == optval) || (NULL == optlen)) {
-    sock_set_errno(sock, EFAULT);
+    set_errno(EFAULT);
     done_socket(sock);
     return -1;
   }
@@ -2792,7 +2831,7 @@
 #if LWIP_MPU_COMPATIBLE
   /* MPU_COMPATIBLE copies the optval data, so check for max size here */
   if (*optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {
-    sock_set_errno(sock, ENOBUFS);
+    set_errno(ENOBUFS);
     done_socket(sock);
     return -1;
   }
@@ -2815,7 +2854,7 @@
   cberr = tcpip_callback(lwip_getsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data));
   if (cberr != ERR_OK) {
     LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);
-    sock_set_errno(sock, err_to_errno(cberr));
+    set_errno(err_to_errno(cberr));
     done_socket(sock);
     return -1;
   }
@@ -2828,12 +2867,12 @@
          LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen);
 #endif /* LWIP_MPU_COMPATIBLE */
 
-  /* maybe lwip_getsockopt_internal has changed err */
+  /* maybe lwip_getsockopt_impl has changed err */
   err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err;
   LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);
 #endif /* LWIP_TCPIP_CORE_LOCKING */
 
-  sock_set_errno(sock, err);
+  set_errno(err);
   done_socket(sock);
   return err ? -1 : 0;
 }
@@ -3222,7 +3261,7 @@
   }
 
   if (NULL == optval) {
-    sock_set_errno(sock, EFAULT);
+    set_errno(EFAULT);
     done_socket(sock);
     return -1;
   }
@@ -3238,7 +3277,7 @@
 #if LWIP_MPU_COMPATIBLE
   /* MPU_COMPATIBLE copies the optval data, so check for max size here */
   if (optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {
-    sock_set_errno(sock, ENOBUFS);
+    set_errno(ENOBUFS);
     done_socket(sock);
     return -1;
   }
@@ -3263,18 +3302,18 @@
   cberr = tcpip_callback(lwip_setsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data));
   if (cberr != ERR_OK) {
     LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);
-    sock_set_errno(sock, err_to_errno(cberr));
+    set_errno(err_to_errno(cberr));
     done_socket(sock);
     return -1;
   }
   sys_arch_sem_wait((sys_sem_t *)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0);
 
-  /* maybe lwip_getsockopt_internal has changed err */
+  /* maybe lwip_setsockopt_impl has changed err */
   err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err;
   LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);
 #endif  /* LWIP_TCPIP_CORE_LOCKING */
 
-  sock_set_errno(sock, err);
+  set_errno(err);
   done_socket(sock);
   return err ? -1 : 0;
 }
@@ -3762,7 +3801,7 @@
 #if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE
     case FIONREAD:
       if (!argp) {
-        sock_set_errno(sock, EINVAL);
+        set_errno(EINVAL);
         done_socket(sock);
         return -1;
       }
@@ -3805,7 +3844,7 @@
       *((int *)argp) = recv_avail;
 
       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %"U16_F"\n", s, argp, *((u16_t *)argp)));
-      sock_set_errno(sock, 0);
+      set_errno(0);
       done_socket(sock);
       return 0;
 #else /* LWIP_SO_RCVBUF */
@@ -3820,7 +3859,7 @@
       }
       netconn_set_nonblocking(sock->conn, val);
       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, val));
-      sock_set_errno(sock, 0);
+      set_errno(0);
       done_socket(sock);
       return 0;
 
@@ -3828,7 +3867,7 @@
       break;
   } /* switch (cmd) */
   LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\n", s, cmd, argp));
-  sock_set_errno(sock, ENOSYS); /* not yet implemented */
+  set_errno(ENOSYS); /* not yet implemented */
   done_socket(sock);
   return -1;
 }
@@ -3852,7 +3891,7 @@
   switch (cmd) {
     case F_GETFL:
       ret = netconn_is_nonblocking(sock->conn) ? O_NONBLOCK : 0;
-      sock_set_errno(sock, 0);
+      set_errno(0);
 
       if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
 #if LWIP_TCPIP_CORE_LOCKING
@@ -3893,14 +3932,14 @@
         /* only O_NONBLOCK, all other bits are zero */
         netconn_set_nonblocking(sock->conn, val & O_NONBLOCK);
         ret = 0;
-        sock_set_errno(sock, 0);
+        set_errno(0);
       } else {
-        sock_set_errno(sock, ENOSYS); /* not yet implemented */
+        set_errno(ENOSYS); /* not yet implemented */
       }
       break;
     default:
       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_fcntl(%d, UNIMPL: %d, %d)\n", s, cmd, val));
-      sock_set_errno(sock, ENOSYS); /* not yet implemented */
+      set_errno(ENOSYS); /* not yet implemented */
       break;
   }
   done_socket(sock);
@@ -4031,8 +4070,8 @@
 
   for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
     if ((socket_ipv4_multicast_memberships[i].sock == sock) &&
-        ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].if_addr, if_addr) &&
-        ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].multi_addr, multi_addr)) {
+        ip4_addr_eq(&socket_ipv4_multicast_memberships[i].if_addr, if_addr) &&
+        ip4_addr_eq(&socket_ipv4_multicast_memberships[i].multi_addr, multi_addr)) {
       socket_ipv4_multicast_memberships[i].sock = NULL;
       ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr);
       ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr);
@@ -4120,7 +4159,7 @@
   for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
     if ((socket_ipv6_multicast_memberships[i].sock   == sock) &&
         (socket_ipv6_multicast_memberships[i].if_idx == if_idx) &&
-        ip6_addr_cmp(&socket_ipv6_multicast_memberships[i].multi_addr, multi_addr)) {
+        ip6_addr_eq(&socket_ipv6_multicast_memberships[i].multi_addr, multi_addr)) {
       socket_ipv6_multicast_memberships[i].sock   = NULL;
       socket_ipv6_multicast_memberships[i].if_idx = NETIF_NO_INDEX;
       ip6_addr_set_zero(&socket_ipv6_multicast_memberships[i].multi_addr);
diff --git a/src/api/tcpip.c b/src/api/tcpip.c
index a7e312a..3aecbd4 100644
--- a/src/api/tcpip.c
+++ b/src/api/tcpip.c
@@ -166,6 +166,11 @@
       msg->msg.api_call.arg->err = msg->msg.api_call.function(msg->msg.api_call.arg);
       sys_sem_signal(msg->msg.api_call.sem);
       break;
+    case TCPIP_MSG_CALLBACK_STATIC_WAIT:
+      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK WAIT message %p\n", (void *)msg));
+      msg->msg.cb_wait.function(msg->msg.cb_wait.ctx);
+      sys_sem_signal(msg->msg.cb_wait.sem);
+      break;
 #endif /* !LWIP_TCPIP_CORE_LOCKING */
 
 #if !LWIP_TCPIP_CORE_LOCKING_INPUT
@@ -519,7 +524,7 @@
  * e.g. the message is allocated once and posted several times from an IRQ
  * using tcpip_callbackmsg_trycallback().
  * Example usage: Trigger execution of an ethernet IRQ DPC routine in lwIP thread context.
- * 
+ *
  * @param function the function to call
  * @param ctx parameter passed to function
  * @return a struct pointer to pass to tcpip_callbackmsg_trycallback().
@@ -590,6 +595,49 @@
 }
 
 /**
+ * Sends a message to TCPIP thread to call a function. Caller thread blocks
+ * until the function returns.
+ * It is recommended to use LWIP_TCPIP_CORE_LOCKING (preferred) or
+ * LWIP_NETCONN_SEM_PER_THREAD.
+ * If not, a semaphore is created and destroyed on every call which is usually
+ * an expensive/slow operation.
+ *
+ * @param function the function to call
+ * @param ctx parameter passed to f
+ * @return ERR_OK if the function was called, another err_t if not
+ */
+err_t
+tcpip_callback_wait(tcpip_callback_fn function, void *ctx)
+{
+#if LWIP_TCPIP_CORE_LOCKING
+  LOCK_TCPIP_CORE();
+  function(ctx);
+  UNLOCK_TCPIP_CORE();
+  return ERR_OK;
+#else /* LWIP_TCPIP_CORE_LOCKING */
+  err_t err;
+  sys_sem_t sem;
+  struct tcpip_msg msg;
+
+  LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
+
+  err = sys_sem_new(&sem, 0);
+  if (err != ERR_OK) {
+    return err;
+  }
+
+  msg.type = TCPIP_MSG_CALLBACK_STATIC_WAIT;
+  msg.msg.cb_wait.function = function;
+  msg.msg.cb_wait.ctx = ctx;
+  msg.msg.cb_wait.sem = &sem;
+  sys_mbox_post(&tcpip_mbox, &msg);
+  sys_arch_sem_wait(&sem, 0);
+  sys_sem_free(&sem);
+  return ERR_OK;
+#endif /* LWIP_TCPIP_CORE_LOCKING */
+}
+
+/**
  * @ingroup lwip_os
  * Initialize this module:
  * - initialize all sub modules
diff --git a/src/apps/altcp_tls/altcp_tls_mbedtls.c b/src/apps/altcp_tls/altcp_tls_mbedtls.c
index bb8e623..a8c2fc2 100644
--- a/src/apps/altcp_tls/altcp_tls_mbedtls.c
+++ b/src/apps/altcp_tls/altcp_tls_mbedtls.c
@@ -3,6 +3,8 @@
  * Application layered TCP/TLS connection API (to be used from TCPIP thread)
  *
  * This file provides a TLS layer using mbedTLS
+ * 
+ * This version is currently compatible with the 2.x.x branch (current LTS).
  */
 
 /*
@@ -50,6 +52,7 @@
  */
 
 #include "lwip/opt.h"
+#include "lwip/sys.h"
 
 #if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
 
@@ -70,7 +73,7 @@
 #include "mbedtls/certs.h"
 #include "mbedtls/x509.h"
 #include "mbedtls/ssl.h"
-#include "mbedtls/net.h"
+#include "mbedtls/net_sockets.h"
 #include "mbedtls/error.h"
 #include "mbedtls/debug.h"
 #include "mbedtls/platform.h"
@@ -88,6 +91,9 @@
 #ifndef ALTCP_MBEDTLS_ENTROPY_LEN
 #define ALTCP_MBEDTLS_ENTROPY_LEN   0
 #endif
+#ifndef ALTCP_MBEDTLS_RNG_FN
+#define ALTCP_MBEDTLS_RNG_FN   mbedtls_entropy_func
+#endif
 
 /* Variable prototype, the actual declaration is at the end of this file
    since it contains pointers to static functions declared here */
@@ -98,10 +104,10 @@
   mbedtls_ssl_config conf;
   mbedtls_x509_crt *cert;
   mbedtls_pk_context *pkey;
-  uint8_t cert_count;
-  uint8_t cert_max;
-  uint8_t pkey_count;
-  uint8_t pkey_max;
+  u8_t cert_count;
+  u8_t cert_max;
+  u8_t pkey_count;
+  u8_t pkey_max;
   mbedtls_x509_crt *ca;
 #if defined(MBEDTLS_SSL_CACHE_C) && ALTCP_MBEDTLS_USE_SESSION_CACHE
   /** Inter-connection cache for fast connection startup */
@@ -165,6 +171,7 @@
   struct altcp_pcb *conn = (struct altcp_pcb *)arg;
   LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */
   if (conn && conn->state) {
+    altcp_mbedtls_state_t *state;
     LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn);
     /* upper connected is called when handshake is done */
     if (err != ERR_OK) {
@@ -172,7 +179,10 @@
         return conn->connected(conn->arg, conn, err);
       }
     }
-    return altcp_mbedtls_lower_recv_process(conn, (altcp_mbedtls_state_t *)conn->state);
+    state = (altcp_mbedtls_state_t *)conn->state;
+    /* ensure overhead value is valid before first write */
+    state->overhead_bytes_adjust = 0;
+    return altcp_mbedtls_lower_recv_process(conn, state);
   }
   return ERR_VAL;
 }
@@ -240,7 +250,7 @@
     } else {
       /* before connection setup is done: call 'err' */
       if (conn->err) {
-        conn->err(conn->arg, ERR_CLSD);
+        conn->err(conn->arg, ERR_ABRT);
       }
       altcp_close(conn);
     }
@@ -354,7 +364,7 @@
   /* application may have close the connection */
   if (conn->state != state) {
     /* return error code to ensure altcp_mbedtls_handle_rx_appldata() exits the loop */
-    return ERR_CLSD;
+    return ERR_ARG;
   }
   return ERR_OK;
 }
@@ -498,27 +508,37 @@
 }
 
 /** Sent callback from lower connection (i.e. TCP)
- * This only informs the upper layer to try to send more, not about
- * the number of ACKed bytes.
+ * This only informs the upper layer the number of ACKed bytes.
+ * This now take care of TLS added bytes so application receive
+ * correct ACKed bytes.
  */
 static err_t
 altcp_mbedtls_lower_sent(void *arg, struct altcp_pcb *inner_conn, u16_t len)
 {
   struct altcp_pcb *conn = (struct altcp_pcb *)arg;
   LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */
-  LWIP_UNUSED_ARG(len);
   if (conn) {
+    int overhead;
+    u16_t app_len;
     altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state;
+    LWIP_ASSERT("state", state != NULL);
     LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn);
-    if (!state || !(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
-      /* @todo: do something here? */
-      return ERR_OK;
+    /* calculate TLS overhead part to not send it to application */
+    overhead = state->overhead_bytes_adjust + state->ssl_context.out_left;
+    if ((unsigned)overhead > len) {
+      overhead = len;
     }
-    /* try to send more if we failed before */
+    /* remove ACKed bytes from overhead adjust counter */
+    state->overhead_bytes_adjust -= len;
+    /* try to send more if we failed before (may increase overhead adjust counter) */
     mbedtls_ssl_flush_output(&state->ssl_context);
-    /* call upper sent with len==0 if the application already sent data */
-    if ((state->flags & ALTCP_MBEDTLS_FLAGS_APPLDATA_SENT) && conn->sent) {
-      return conn->sent(conn->arg, conn, 0);
+    /* remove calculated overhead from ACKed bytes len */
+    app_len = len - (u16_t)overhead;
+    /* update application write counter and inform application */
+    if (app_len) {
+      state->overhead_bytes_adjust += app_len;
+      if (conn->sent)
+        return conn->sent(conn->arg, conn, app_len);
     }
   }
   return ERR_OK;
@@ -639,6 +659,44 @@
   return ret;
 }
 
+void
+altcp_tls_init_session(struct altcp_tls_session *session)
+{
+  if (session)
+    mbedtls_ssl_session_init(&session->data);
+}
+
+err_t
+altcp_tls_get_session(struct altcp_pcb *conn, struct altcp_tls_session *session)
+{
+  if (session && conn && conn->state) {
+    altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state;
+    int ret = mbedtls_ssl_get_session(&state->ssl_context, &session->data);
+    return ret < 0 ? ERR_VAL : ERR_OK;
+  }
+  return ERR_ARG;
+}
+
+err_t
+altcp_tls_set_session(struct altcp_pcb *conn, struct altcp_tls_session *session)
+{
+  if (session && conn && conn->state) {
+    altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state;
+    int ret = -1;
+    if (session->data.start)
+      ret = mbedtls_ssl_set_session(&state->ssl_context, &session->data);
+    return ret < 0 ? ERR_VAL : ERR_OK;
+  }
+  return ERR_ARG;
+}
+
+void
+altcp_tls_free_session(struct altcp_tls_session *session)
+{
+  if (session)
+    mbedtls_ssl_session_free(&session->data);
+}
+
 void *
 altcp_tls_context(struct altcp_pcb *conn)
 {
@@ -659,16 +717,59 @@
   LWIP_UNUSED_ARG(str);
 
   if (level >= ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN) {
-    LWIP_DEBUGF(ALTCP_MBEDTLS_LIB_DEBUG, ("%s:%04d: %s", file, line, str));
+    LWIP_DEBUGF(ALTCP_MBEDTLS_LIB_DEBUG, ("%s:%04d: %s\n", file, line, str));
   }
 }
 #endif
 
+static err_t
+altcp_mbedtls_ref_entropy(void)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+
+  if (!altcp_tls_entropy_rng) {
+    altcp_tls_entropy_rng = (struct altcp_tls_entropy_rng *)altcp_mbedtls_alloc_config(sizeof(struct altcp_tls_entropy_rng));
+    if (altcp_tls_entropy_rng) {
+      int ret;
+      altcp_tls_entropy_rng->ref = 1;
+      mbedtls_entropy_init(&altcp_tls_entropy_rng->entropy);
+      mbedtls_ctr_drbg_init(&altcp_tls_entropy_rng->ctr_drbg);
+      /* Seed the RNG, only once */
+      ret = mbedtls_ctr_drbg_seed(&altcp_tls_entropy_rng->ctr_drbg,
+                                  ALTCP_MBEDTLS_RNG_FN, &altcp_tls_entropy_rng->entropy,
+                                  ALTCP_MBEDTLS_ENTROPY_PTR, ALTCP_MBEDTLS_ENTROPY_LEN);
+      if (ret != 0) {
+        LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ctr_drbg_seed failed: %d\n", ret));
+        mbedtls_ctr_drbg_free(&altcp_tls_entropy_rng->ctr_drbg);
+        mbedtls_entropy_free(&altcp_tls_entropy_rng->entropy);
+        altcp_mbedtls_free_config(altcp_tls_entropy_rng);
+        altcp_tls_entropy_rng = NULL;
+        return ERR_ARG;
+      }
+    } else {
+      return ERR_MEM;
+    }
+  } else {
+    altcp_tls_entropy_rng->ref++;
+  }
+  return ERR_OK;
+}
+
+static void
+altcp_mbedtls_unref_entropy(void)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+
+  if (altcp_tls_entropy_rng && altcp_tls_entropy_rng->ref) {
+      altcp_tls_entropy_rng->ref--;
+  }
+}
+
 /** Create new TLS configuration
  * ATTENTION: Server certificate and private key have to be added outside this function!
  */
 static struct altcp_tls_config *
-altcp_tls_create_config(int is_server, uint8_t cert_count, uint8_t pkey_count, int have_ca)
+altcp_tls_create_config(int is_server, u8_t cert_count, u8_t pkey_count, int have_ca)
 {
   size_t sz;
   int ret;
@@ -714,31 +815,9 @@
 
   mbedtls_ssl_config_init(&conf->conf);
 
-  if (!altcp_tls_entropy_rng) {
-    altcp_tls_entropy_rng = (struct altcp_tls_entropy_rng *)altcp_mbedtls_alloc_config(sizeof(struct altcp_tls_entropy_rng));
-    if (altcp_tls_entropy_rng) {
-      altcp_tls_entropy_rng->ref = 1;
-      mbedtls_entropy_init(&altcp_tls_entropy_rng->entropy);
-      mbedtls_ctr_drbg_init(&altcp_tls_entropy_rng->ctr_drbg);
-      /* Seed the RNG, only once */
-      ret = mbedtls_ctr_drbg_seed(&altcp_tls_entropy_rng->ctr_drbg,
-                                  mbedtls_entropy_func, &altcp_tls_entropy_rng->entropy,
-                                  ALTCP_MBEDTLS_ENTROPY_PTR, ALTCP_MBEDTLS_ENTROPY_LEN);
-      if (ret != 0) {
-        LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ctr_drbg_seed failed: %d\n", ret));
-        mbedtls_ctr_drbg_free(&altcp_tls_entropy_rng->ctr_drbg);
-        mbedtls_entropy_free(&altcp_tls_entropy_rng->entropy);
-        altcp_mbedtls_free_config(altcp_tls_entropy_rng);
-        altcp_tls_entropy_rng = NULL;
-        altcp_mbedtls_free_config(conf);
-        return NULL;
-      }
-    } else {
-      altcp_mbedtls_free_config(conf);
-      return NULL;
-    }
-  } else {
-    altcp_tls_entropy_rng->ref++;
+  if (altcp_mbedtls_ref_entropy() != ERR_OK) {
+    altcp_mbedtls_free_config(conf);
+    return NULL;
   }
 
   /* Setup ssl context (@todo: what's different for a client here? -> might better be done on listen/connect) */
@@ -746,16 +825,11 @@
                                     MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);
   if (ret != 0) {
     LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_config_defaults failed: %d\n", ret));
-    if (altcp_tls_entropy_rng->ref == 1) {
-      mbedtls_ctr_drbg_free(&altcp_tls_entropy_rng->ctr_drbg);
-      mbedtls_entropy_free(&altcp_tls_entropy_rng->entropy);
-      altcp_mbedtls_free_config(altcp_tls_entropy_rng);
-      altcp_tls_entropy_rng = NULL;
-    }
+    altcp_mbedtls_unref_entropy();
     altcp_mbedtls_free_config(conf);
     return NULL;
   }
-  mbedtls_ssl_conf_authmode(&conf->conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
+  mbedtls_ssl_conf_authmode(&conf->conf, ALTCP_MBEDTLS_AUTHMODE);
 
   mbedtls_ssl_conf_rng(&conf->conf, mbedtls_ctr_drbg_random, &altcp_tls_entropy_rng->ctr_drbg);
 #if ALTCP_MBEDTLS_LIB_DEBUG != LWIP_DBG_OFF
@@ -774,6 +848,7 @@
     ALTCP_MBEDTLS_SESSION_TICKET_CIPHER, ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS);
   if (ret) {
     LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_ticket_setup failed: %d\n", ret));
+    altcp_mbedtls_unref_entropy();
     altcp_mbedtls_free_config(conf);
     return NULL;
   }
@@ -785,7 +860,7 @@
   return conf;
 }
 
-struct altcp_tls_config *altcp_tls_create_config_server(uint8_t cert_count)
+struct altcp_tls_config *altcp_tls_create_config_server(u8_t cert_count)
 {
   struct altcp_tls_config *conf = altcp_tls_create_config(1, cert_count, cert_count, 0);
   if (conf == NULL) {
@@ -861,7 +936,7 @@
 
   if (altcp_tls_config_server_add_privkey_cert(conf, privkey, privkey_len,
     privkey_pass, privkey_pass_len, cert, cert_len) != ERR_OK) {
-    altcp_mbedtls_free_config(conf);
+    altcp_tls_free_config(conf);
     return NULL;
   }
 
@@ -884,8 +959,8 @@
     mbedtls_x509_crt_init(conf->ca);
     ret = mbedtls_x509_crt_parse(conf->ca, ca, ca_len);
     if (ret != 0) {
-      LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse ca failed: %d 0x%x", ret, -1*ret));
-      altcp_mbedtls_free_config(conf);
+      LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse ca failed: %d 0x%x\n", ret, -1*ret));
+      altcp_tls_free_config(conf);
       return NULL;
     }
 
@@ -909,7 +984,7 @@
   struct altcp_tls_config *conf;
 
   if (!cert || !privkey) {
-    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("altcp_tls_create_config_client_2wayauth: certificate and priv key required"));
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("altcp_tls_create_config_client_2wayauth: certificate and priv key required\n"));
     return NULL;
   }
 
@@ -922,29 +997,44 @@
   mbedtls_x509_crt_init(conf->cert);
   ret = mbedtls_x509_crt_parse(conf->cert, cert, cert_len);
   if (ret != 0) {
-    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse cert failed: %d 0x%x", ret, -1*ret));
-    altcp_mbedtls_free_config(conf->cert);
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse cert failed: %d 0x%x\n", ret, -1*ret));
+    altcp_tls_free_config(conf);
     return NULL;
   }
 
   mbedtls_pk_init(conf->pkey);
   ret = mbedtls_pk_parse_key(conf->pkey, privkey, privkey_len, privkey_pass, privkey_pass_len);
   if (ret != 0) {
-    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_pk_parse_key failed: %d 0x%x", ret, -1*ret));
-    altcp_mbedtls_free_config(conf);
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_pk_parse_key failed: %d 0x%x\n", ret, -1*ret));
+    altcp_tls_free_config(conf);
     return NULL;
   }
 
   ret = mbedtls_ssl_conf_own_cert(&conf->conf, conf->cert, conf->pkey);
   if (ret != 0) {
-    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_conf_own_cert failed: %d 0x%x", ret, -1*ret));
-    altcp_mbedtls_free_config(conf);
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_conf_own_cert failed: %d 0x%x\n", ret, -1*ret));
+    altcp_tls_free_config(conf);
     return NULL;
   }
 
   return conf;
 }
 
+int
+altcp_tls_configure_alpn_protocols(struct altcp_tls_config *conf, const char **protos)
+{
+#if defined(MBEDTLS_SSL_ALPN)
+  int ret = mbedtls_ssl_conf_alpn_protocols(&conf->conf, protos);
+  if (ret != 0) {
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_conf_alpn_protocols failed: %d\n", ret));
+  }
+
+  return ret;
+#else
+  return -1;
+#endif
+}
+
 void
 altcp_tls_free_config(struct altcp_tls_config *conf)
 {
@@ -957,14 +1047,16 @@
   if (conf->ca) {
     mbedtls_x509_crt_free(conf->ca);
   }
+  mbedtls_ssl_config_free(&conf->conf);
   altcp_mbedtls_free_config(conf);
-  if (altcp_tls_entropy_rng && altcp_tls_entropy_rng->ref)
-      altcp_tls_entropy_rng->ref--;
+  altcp_mbedtls_unref_entropy();
 }
 
 void
 altcp_tls_free_entropy(void)
 {
+  LWIP_ASSERT_CORE_LOCKED();
+
   if (altcp_tls_entropy_rng && altcp_tls_entropy_rng->ref == 0) {
     mbedtls_ctr_drbg_free(&altcp_tls_entropy_rng->ctr_drbg);
     mbedtls_entropy_free(&altcp_tls_entropy_rng->entropy);
@@ -999,7 +1091,7 @@
   }
   lower_recved = len;
   if (lower_recved > state->rx_passed_unrecved) {
-    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("bogus recved count (len > state->rx_passed_unrecved / %d / %d)",
+    LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("bogus recved count (len > state->rx_passed_unrecved / %d / %d)\n",
                                       len, state->rx_passed_unrecved));
     lower_recved = (u16_t)state->rx_passed_unrecved;
   }
@@ -1096,7 +1188,7 @@
           size_t max_len = 0xFFFF;
           size_t ret;
 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
-          /* @todo: adjust ssl_added to real value related to negociated cipher */
+          /* @todo: adjust ssl_added to real value related to negotiated cipher */
           size_t max_frag_len = mbedtls_ssl_get_max_frag_len(&state->ssl_context);
           max_len = LWIP_MIN(max_frag_len, max_len);
 #endif
@@ -1130,14 +1222,14 @@
   state = (altcp_mbedtls_state_t *)conn->state;
   if (state == NULL) {
     /* @todo: which error? */
-    return ERR_CLSD;
+    return ERR_ARG;
   }
   if (!(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
     /* @todo: which error? */
     return ERR_VAL;
   }
 
-  /* HACK: if thre is something left to send, try to flush it and only
+  /* HACK: if there is something left to send, try to flush it and only
      allow sending more if this succeeded (this is a hack because neither
      returning 0 nor MBEDTLS_ERR_SSL_WANT_WRITE worked for me) */
   if (state->ssl_context.out_left) {
@@ -1151,7 +1243,8 @@
   altcp_output(conn->inner_conn);
   if (ret >= 0) {
     if (ret == len) {
-      state->flags |= ALTCP_MBEDTLS_FLAGS_APPLDATA_SENT;
+      /* update application sent counter */
+      state->overhead_bytes_adjust -= ret;
       return ERR_OK;
     } else {
       /* @todo/@fixme: assumption: either everything sent or error */
@@ -1176,6 +1269,7 @@
 altcp_mbedtls_bio_send(void *ctx, const unsigned char *dataptr, size_t size)
 {
   struct altcp_pcb *conn = (struct altcp_pcb *) ctx;
+  altcp_mbedtls_state_t *state;
   int written = 0;
   size_t size_left = size;
   u8_t apiflags = TCP_WRITE_FLAG_COPY;
@@ -1184,6 +1278,8 @@
   if ((conn == NULL) || (conn->inner_conn == NULL)) {
     return MBEDTLS_ERR_NET_INVALID_CONTEXT;
   }
+  state = (altcp_mbedtls_state_t *)conn->state;
+  LWIP_ASSERT("state != NULL", state != NULL);
 
   while (size_left) {
     u16_t write_len = (u16_t)LWIP_MIN(size_left, 0xFFFF);
@@ -1191,6 +1287,7 @@
     if (err == ERR_OK) {
       written += write_len;
       size_left -= write_len;
+      state->overhead_bytes_adjust += write_len;
     } else if (err == ERR_MEM) {
       if (written) {
         return written;
diff --git a/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c b/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c
index 04d47ae..d2c3d58 100644
--- a/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c
+++ b/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c
@@ -70,7 +70,7 @@
 
 #if defined(MBEDTLS_PLATFORM_MEMORY) && \
    (!defined(MBEDTLS_PLATFORM_FREE_MACRO) || \
-    defined(MBEDTLS_PLATFORM_CALLOC_MACRO))
+    !defined(MBEDTLS_PLATFORM_CALLOC_MACRO))
 #define ALTCP_MBEDTLS_PLATFORM_ALLOC 1
 #else
 #define ALTCP_MBEDTLS_PLATFORM_ALLOC 0
@@ -114,13 +114,13 @@
   alloc_size = sizeof(altcp_mbedtls_malloc_helper_t) + (c * len);
   /* check for maximum allocation size, mainly to prevent mem_size_t overflow */
   if (alloc_size > MEM_SIZE) {
-    LWIP_DEBUGF(ALTCP_MBEDTLS_MEM_DEBUG, ("mbedtls allocation too big: %c * %d bytes vs MEM_SIZE=%d",
+    LWIP_DEBUGF(ALTCP_MBEDTLS_MEM_DEBUG, ("mbedtls allocation too big: %c * %d bytes vs MEM_SIZE=%d\n",
                                           (int)c, (int)len, (int)MEM_SIZE));
     return NULL;
   }
   hlpr = (altcp_mbedtls_malloc_helper_t *)mem_malloc((mem_size_t)alloc_size);
   if (hlpr == NULL) {
-    LWIP_DEBUGF(ALTCP_MBEDTLS_MEM_DEBUG, ("mbedtls alloc callback failed for %c * %d bytes", (int)c, (int)len));
+    LWIP_DEBUGF(ALTCP_MBEDTLS_MEM_DEBUG, ("mbedtls alloc callback failed for %c * %d bytes\n", (int)c, (int)len));
     return NULL;
   }
 #if ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS
diff --git a/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h b/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h
index 17efaaf..2ad2b60 100644
--- a/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h
+++ b/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h
@@ -60,7 +60,6 @@
 #define ALTCP_MBEDTLS_FLAGS_UPPER_CALLED      0x02
 #define ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED   0x04
 #define ALTCP_MBEDTLS_FLAGS_RX_CLOSED         0x08
-#define ALTCP_MBEDTLS_FLAGS_APPLDATA_SENT     0x10
 
 typedef struct altcp_mbedtls_state_s {
   void *conf;
@@ -72,6 +71,7 @@
   int rx_passed_unrecved;
   int bio_bytes_read;
   int bio_bytes_appl;
+  int overhead_bytes_adjust;
 } altcp_mbedtls_state_t;
 
 #ifdef __cplusplus
diff --git a/src/apps/http/altcp_proxyconnect.c b/src/apps/http/altcp_proxyconnect.c
index 9a0b2ba..3d5e7e8 100644
--- a/src/apps/http/altcp_proxyconnect.c
+++ b/src/apps/http/altcp_proxyconnect.c
@@ -133,7 +133,7 @@
     /* overflow */
     return ERR_MEM;
   }
-  /* Allocate a bufer for the request string */
+  /* Allocate a buffer for the request string */
   buffer = (char *)mem_malloc(alloc_len);
   if (buffer == NULL) {
     return ERR_MEM;
diff --git a/src/apps/http/fs.c b/src/apps/http/fs.c
index f15a480..e12e314 100644
--- a/src/apps/http/fs.c
+++ b/src/apps/http/fs.c
@@ -39,20 +39,6 @@
 #include HTTPD_FSDATA_FILE
 
 /*-----------------------------------------------------------------------------------*/
-
-#if LWIP_HTTPD_CUSTOM_FILES
-int fs_open_custom(struct fs_file *file, const char *name);
-void fs_close_custom(struct fs_file *file);
-#if LWIP_HTTPD_FS_ASYNC_READ
-u8_t fs_canread_custom(struct fs_file *file);
-u8_t fs_wait_read_custom(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg);
-int fs_read_async_custom(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg);
-#else /* LWIP_HTTPD_FS_ASYNC_READ */
-int fs_read_custom(struct fs_file *file, char *buffer, int count);
-#endif /* LWIP_HTTPD_FS_ASYNC_READ */
-#endif /* LWIP_HTTPD_CUSTOM_FILES */
-
-/*-----------------------------------------------------------------------------------*/
 err_t
 fs_open(struct fs_file *file, const char *name)
 {
@@ -64,10 +50,9 @@
 
 #if LWIP_HTTPD_CUSTOM_FILES
   if (fs_open_custom(file, name)) {
-    file->is_custom_file = 1;
+    file->flags |= FS_FILE_FLAGS_CUSTOM;
     return ERR_OK;
   }
-  file->is_custom_file = 0;
 #endif /* LWIP_HTTPD_CUSTOM_FILES */
 
   for (f = FS_ROOT; f != NULL; f = f->next) {
@@ -75,12 +60,14 @@
       file->data = (const char *)f->data;
       file->len = f->len;
       file->index = f->len;
-      file->pextension = NULL;
       file->flags = f->flags;
 #if HTTPD_PRECALCULATED_CHECKSUM
       file->chksum_count = f->chksum_count;
       file->chksum = f->chksum;
 #endif /* HTTPD_PRECALCULATED_CHECKSUM */
+#if LWIP_HTTPD_FILE_EXTENSION
+      file->pextension = NULL;
+#endif /* LWIP_HTTPD_FILE_EXTENSION */
 #if LWIP_HTTPD_FILE_STATE
       file->state = fs_state_init(file, name);
 #endif /* #if LWIP_HTTPD_FILE_STATE */
@@ -96,7 +83,7 @@
 fs_close(struct fs_file *file)
 {
 #if LWIP_HTTPD_CUSTOM_FILES
-  if (file->is_custom_file) {
+  if ((file->flags & FS_FILE_FLAGS_CUSTOM) != 0) {
     fs_close_custom(file);
   }
 #endif /* LWIP_HTTPD_CUSTOM_FILES */
@@ -124,7 +111,7 @@
   LWIP_UNUSED_ARG(callback_arg);
 #endif /* LWIP_HTTPD_FS_ASYNC_READ */
 #if LWIP_HTTPD_CUSTOM_FILES
-  if (file->is_custom_file) {
+  if ((file->flags & FS_FILE_FLAGS_CUSTOM) != 0) {
 #if LWIP_HTTPD_FS_ASYNC_READ
     return fs_read_async_custom(file, buffer, count, callback_fn, callback_arg);
 #else /* LWIP_HTTPD_FS_ASYNC_READ */
diff --git a/src/apps/http/fsdata.c b/src/apps/http/fsdata.c
index ab9da7e..50bc87a 100644
--- a/src/apps/http/fsdata.c
+++ b/src/apps/http/fsdata.c
@@ -334,4 +334,3 @@
 
 #define FS_ROOT file__index_html
 #define FS_NUMFILES 3
-
diff --git a/src/apps/http/http_client.c b/src/apps/http/http_client.c
index 82da60d..1973e79 100644
--- a/src/apps/http/http_client.c
+++ b/src/apps/http/http_client.c
@@ -337,8 +337,10 @@
   }
   if ((p != NULL) && (req->parse_state == HTTPC_PARSE_RX_DATA)) {
     req->rx_content_len += p->tot_len;
+    /* received valid data: reset timeout */
+    req->timeout_ticks = HTTPC_POLL_TIMEOUT;
     if (req->recv_fn != NULL) {
-      /* directly return here: the connection migth already be aborted from the callback! */
+      /* directly return here: the connection might already be aborted from the callback! */
       return req->recv_fn(req->callback_arg, pcb, p, r);
     } else {
       altcp_recved(pcb, p->tot_len);
@@ -615,7 +617,7 @@
 }
 
 /**
- * @ingroup httpc 
+ * @ingroup httpc
  * HTTP client API: get a file by passing server IP address
  *
  * @param server_addr IP address of the server to connect
@@ -660,7 +662,7 @@
 }
 
 /**
- * @ingroup httpc 
+ * @ingroup httpc
  * HTTP client API: get a file by passing server name as string (DNS name or IP address string)
  *
  * @param server_name server name as string (DNS name or IP address string)
@@ -718,7 +720,7 @@
 static void httpc_fs_result(void *arg, httpc_result_t httpc_result, u32_t rx_content_len,
   u32_t srv_res, err_t err);
 
-/** Initalize http client state for download to file system */
+/** Initialize http client state for download to file system */
 static err_t
 httpc_fs_init(httpc_filestate_t **filestate_out, const char* local_file_name,
               const httpc_connection_t *settings, void* callback_arg)
@@ -802,7 +804,7 @@
 }
 
 /**
- * @ingroup httpc 
+ * @ingroup httpc
  * HTTP client API: get a file to disk by passing server IP address
  *
  * @param server_addr IP address of the server to connect
@@ -854,7 +856,7 @@
 }
 
 /**
- * @ingroup httpc 
+ * @ingroup httpc
  * HTTP client API: get a file to disk by passing server name as string (DNS name or IP address string)
  *
  * @param server_name server name as string (DNS name or IP address string)
diff --git a/src/apps/http/httpd.c b/src/apps/http/httpd.c
index fc27e8e..9477e85 100644
--- a/src/apps/http/httpd.c
+++ b/src/apps/http/httpd.c
@@ -233,7 +233,7 @@
 
 struct http_ssi_tag_description {
   const char *lead_in;
-  const char *lead_out; 
+  const char *lead_out;
 };
 
 #endif /* LWIP_HTTPD_SSI */
@@ -871,14 +871,14 @@
     return;
   }
   /* We are dealing with a particular filename. Look for one other
-      special case.  We assume that any filename with "404" in it must be
-      indicative of a 404 server error whereas all other files require
-      the 200 OK header. */
-  if (strstr(uri, "404")) {
+     special case.  We assume that any filename with "404" in it must be
+     indicative of a 404 server error whereas all other files require
+     the 200 OK header. */
+  if (memcmp(uri, "/404.", 5) == 0) {
     hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_FOUND];
-  } else if (strstr(uri, "400")) {
+  } else if (memcmp(uri, "/400.", 5) == 0) {
     hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_BAD_REQUEST];
-  } else if (strstr(uri, "501")) {
+  } else if (memcmp(uri, "/501.", 5) == 0) {
     hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_IMPL];
   } else {
     hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_OK];
@@ -1610,6 +1610,11 @@
   }
 #endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
 
+#if LWIP_HTTPD_SSI
+  if (hs->ssi && (hs->ssi->tag_state == TAG_SENDING)) {
+    /* do not check the condition below */
+  } else
+#endif
   /* Have we run out of file data to send? If so, we need to read the next
    * block from the file. */
   if (hs->left == 0) {
@@ -1621,6 +1626,9 @@
 #if LWIP_HTTPD_SSI
   if (hs->ssi) {
     data_to_send = http_send_data_ssi(pcb, hs);
+    if (hs->ssi->tag_state == TAG_SENDING) {
+      return data_to_send;
+    }
   } else
 #endif /* LWIP_HTTPD_SSI */
   {
@@ -2071,7 +2079,7 @@
       }
 #endif /* LWIP_HTTPD_SUPPORT_V09 */
       uri_len = (u16_t)(sp2 - (sp1 + 1));
-      if ((sp2 != 0) && (sp2 > sp1)) {
+      if ((sp2 != NULL) && (sp2 > sp1)) {
         /* wait for CRLFCRLF (indicating end of HTTP headers) before parsing anything */
         if (lwip_strnstr(data, CRLF CRLF, data_len) != NULL) {
           char *uri = sp1 + 1;
@@ -2371,7 +2379,7 @@
     hs->file = file->data;
     LWIP_ASSERT("File length must be positive!", (file->len >= 0));
 #if LWIP_HTTPD_CUSTOM_FILES
-    if (file->is_custom_file && (file->data == NULL)) {
+    if (((file->flags & FS_FILE_FLAGS_CUSTOM) != 0) && (file->data == NULL)) {
       /* custom file, need to read data first (via fs_read_custom) */
       hs->left = 0;
     } else
@@ -2442,7 +2450,7 @@
   struct http_state *hs = (struct http_state *)arg;
   LWIP_UNUSED_ARG(err);
 
-  LWIP_DEBUGF(HTTPD_DEBUG, ("http_err: %s", lwip_strerr(err)));
+  LWIP_DEBUGF(HTTPD_DEBUG, ("http_err: %s\n", lwip_strerr(err)));
 
   if (hs != NULL) {
     http_state_free(hs);
diff --git a/src/apps/http/httpd_structs.h b/src/apps/http/httpd_structs.h
index 56b97a3..aa5bce2 100644
--- a/src/apps/http/httpd_structs.h
+++ b/src/apps/http/httpd_structs.h
@@ -113,11 +113,11 @@
 
 #endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
 
-#if LWIP_HTTPD_SSI
+#if LWIP_HTTPD_SSI && LWIP_HTTPD_SSI_BY_FILE_EXTENSION
 static const char *const g_pcSSIExtensions[] = {
-  ".shtml", ".shtm", ".ssi", ".xml", ".json"
+  LWIP_HTTPD_SSI_EXTENSIONS
 };
 #define NUM_SHTML_EXTENSIONS LWIP_ARRAYSIZE(g_pcSSIExtensions)
-#endif /* LWIP_HTTPD_SSI */
+#endif /* LWIP_HTTPD_SSI && LWIP_HTTPD_SSI_BY_FILE_EXTENSION */
 
 #endif /* LWIP_HTTPD_STRUCTS_H */
diff --git a/src/apps/http/makefsdata/makefsdata b/src/apps/http/makefsdata/makefsdata
index 37b4203..667eb88 100644
--- a/src/apps/http/makefsdata/makefsdata
+++ b/src/apps/http/makefsdata/makefsdata
@@ -90,7 +90,7 @@
     }
     print(OUTPUT "const struct fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, ");
     print(OUTPUT "data$fvar + ". (length($file) + 1) .", ");
-    print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n");
+    print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) .", FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT}};\n\n");
 }
 
 print(OUTPUT "#define FS_ROOT file$fvars[$i - 1]\n\n");
diff --git a/src/apps/http/makefsdata/makefsdata.c b/src/apps/http/makefsdata/makefsdata.c
index 695e94f..240c72e 100644
--- a/src/apps/http/makefsdata/makefsdata.c
+++ b/src/apps/http/makefsdata/makefsdata.c
@@ -21,16 +21,25 @@
 
 /** Makefsdata can generate *all* files deflate-compressed (where file size shrinks).
  * Since nearly all browsers support this, this is a good way to reduce ROM size.
- * To compress the files, "miniz.c" must be downloaded seperately.
+ * To compress the files, "miniz.c" must be downloaded separately OR
+ * MAKEFS_SUPPORT_DEFLATE_ZLIB must be set and the zlib library and headers
+ * must be present on the system compiling this program.
  */
 #ifndef MAKEFS_SUPPORT_DEFLATE
 #define MAKEFS_SUPPORT_DEFLATE 0
-#endif
+#ifndef MAKEFS_SUPPORT_DEFLATE_ZLIB
+#define MAKEFS_SUPPORT_DEFLATE_ZLIB 0
+#endif /* MAKEFS_SUPPORT_DEFLATE_ZLIB */
+#endif /* MAKEFS_SUPPORT_DEFLATE */
 
 #define COPY_BUFSIZE (1024*1024) /* 1 MByte */
 
 #if MAKEFS_SUPPORT_DEFLATE
+#if MAKEFS_SUPPORT_DEFLATE_ZLIB
+#include <zlib.h>
+#else
 #include "../miniz.c"
+#endif /* MAKEFS_SUPPORT_DEFLATE */
 
 typedef unsigned char uint8;
 typedef unsigned short uint16;
@@ -49,12 +58,13 @@
 static uint8 s_outbuf[OUT_BUF_SIZE];
 static uint8 s_checkbuf[OUT_BUF_SIZE];
 
+#ifndef MAKEFS_SUPPORT_DEFLATE_ZLIB
 /* tdefl_compressor contains all the state needed by the low-level compressor so it's a pretty big struct (~300k).
    This example makes it a global vs. putting it on the stack, of course in real-world usage you'll probably malloc() or new it. */
 tdefl_compressor g_deflator;
-tinfl_decompressor g_inflator;
+#endif /* MAKEFS_SUPPORT_DEFLATE_ZLIB */
 
-int deflate_level = 10; /* default compression level, can be changed via command line */
+static int deflate_level; /* default compression level, can be changed via command line */
 #define USAGE_ARG_DEFLATE " [-defl<:compr_level>]"
 #else /* MAKEFS_SUPPORT_DEFLATE */
 #define USAGE_ARG_DEFLATE ""
@@ -63,12 +73,14 @@
 #ifdef WIN32
 
 #define GETCWD(path, len)             GetCurrentDirectoryA(len, path)
+#define GETCWD_SUCCEEDED(ret)         (ret != 0)
 #define CHDIR(path)                   SetCurrentDirectoryA(path)
 #define CHDIR_SUCCEEDED(ret)          (ret == TRUE)
 
 #elif __linux__
 
 #define GETCWD(path, len)             getcwd(path, len)
+#define GETCWD_SUCCEEDED(ret)         (ret != NULL)
 #define CHDIR(path)                   chdir(path)
 #define CHDIR_SUCCEEDED(ret)          (ret == 0)
 
@@ -81,6 +93,10 @@
 #define NEWLINE     "\r\n"
 #define NEWLINE_LEN 2
 
+/* Define this here since we don't include any external C files and ports might override it */
+#define LWIP_PLATFORM_ASSERT(x) do {printf("Assertion \"%s\" failed at line %d in %s\n", \
+                                     x, __LINE__, __FILE__); fflush(NULL); abort();} while(0)
+
 /* define this to get the header variables we use to build HTTP headers */
 #define LWIP_HTTPD_DYNAMIC_HEADERS 1
 #define LWIP_HTTPD_SSI             1
@@ -92,8 +108,8 @@
 #include "../core/def.c"
 
 /** (Your server name here) */
-const char *serverID = "Server: "HTTPD_SERVER_AGENT"\r\n";
-char serverIDBuffer[1024];
+static const char *serverID = "Server: "HTTPD_SERVER_AGENT"\r\n";
+static char serverIDBuffer[1024];
 
 /* change this to suit your MEM_ALIGNMENT */
 #define PAYLOAD_ALIGNMENT 4
@@ -128,26 +144,26 @@
 /* 5 bytes per char + 3 bytes per line */
 static char file_buffer_c[COPY_BUFSIZE * 5 + ((COPY_BUFSIZE / HEX_BYTES_PER_LINE) * 3)];
 
-char curSubdir[MAX_PATH_LEN];
-char lastFileVar[MAX_PATH_LEN];
-char hdr_buf[4096];
+static char curSubdir[MAX_PATH_LEN-3];
+static char lastFileVar[MAX_PATH_LEN];
+static char hdr_buf[4096];
 
-unsigned char processSubs = 1;
-unsigned char includeHttpHeader = 1;
-unsigned char useHttp11 = 0;
-unsigned char supportSsi = 1;
-unsigned char precalcChksum = 0;
-unsigned char includeLastModified = 0;
+static unsigned char processSubs = 1;
+static unsigned char includeHttpHeader = 1;
+static unsigned char useHttp11 = 0;
+static unsigned char supportSsi = 1;
+static unsigned char precalcChksum = 0;
+static unsigned char includeLastModified = 0;
 #if MAKEFS_SUPPORT_DEFLATE
-unsigned char deflateNonSsiFiles = 0;
-size_t deflatedBytesReduced = 0;
-size_t overallDataBytes = 0;
+static unsigned char deflateNonSsiFiles = 0;
+static size_t deflatedBytesReduced = 0;
+static size_t overallDataBytes = 0;
 #endif
-const char *exclude_list = NULL;
-const char *ncompress_list = NULL;
+static const char *exclude_list = NULL;
+static const char *ncompress_list = NULL;
 
-struct file_entry *first_file = NULL;
-struct file_entry *last_file = NULL;
+static struct file_entry *first_file = NULL;
+static struct file_entry *last_file = NULL;
 
 static char *ssi_file_buffer;
 static char **ssi_file_lines;
@@ -190,7 +206,7 @@
   memset(path, 0, sizeof(path));
   memset(appPath, 0, sizeof(appPath));
 
-  printf(NEWLINE " makefsdata - HTML to C source converter" NEWLINE);
+  printf(NEWLINE " makefsdata v" LWIP_VERSION_STRING " - HTML to C source converter" NEWLINE);
   printf("     by Jim Pettinato               - circa 2003 " NEWLINE);
   printf("     extended by Simon Goldschmidt  - 2009 " NEWLINE NEWLINE);
 
@@ -229,19 +245,20 @@
         printf("Writing to file \"%s\"\n", targetfile);
       } else if (!strcmp(argv[i], "-m")) {
         includeLastModified = 1;
-      } else if (!strcmp(argv[i], "-defl")) {
+      } else if (strstr(argv[i], "-defl") == argv[i]) {
 #if MAKEFS_SUPPORT_DEFLATE
-        char *colon = strstr(argv[i], ":");
-        if (colon) {
-          if (colon[1] != 0) {
-            int defl_level = atoi(&colon[1]);
-            if ((defl_level >= 0) && (defl_level <= 10)) {
-              deflate_level = defl_level;
-            } else {
-              printf("ERROR: deflate level must be [0..10]" NEWLINE);
-              exit(0);
-            }
+        const char *colon = &argv[i][5];
+        if (*colon == ':') {
+          int defl_level = atoi(&colon[1]);
+          if ((colon[1] != 0) && (defl_level >= 0) && (defl_level <= 10)) {
+            deflate_level = defl_level;
+          } else {
+            printf("ERROR: deflate level must be [0..10]" NEWLINE);
+            exit(0);
           }
+        } else {
+          /* default to highest compression */
+          deflate_level = 10;
         }
         deflateNonSsiFiles = 1;
         printf("Deflating all non-SSI files with level %d (but only if size is reduced)" NEWLINE, deflate_level);
@@ -253,7 +270,7 @@
         printf("Excluding files with extensions %s" NEWLINE, exclude_list);
       } else if (strstr(argv[i], "-xc:") == argv[i]) {
         ncompress_list = &argv[i][4];
-        printf("Skipping compresion for files with extensions %s" NEWLINE, ncompress_list);
+        printf("Skipping compression for files with extensions %s" NEWLINE, ncompress_list);
       } else if ((strstr(argv[i], "-?")) || (strstr(argv[i], "-h"))) {
         print_usage();
         exit(0);
@@ -272,7 +289,10 @@
     exit(-1);
   }
 
-  GETCWD(appPath, MAX_PATH_LEN);
+  if(!GETCWD_SUCCEEDED(GETCWD(appPath, MAX_PATH_LEN))) {
+    printf("Unable to get current dir." NEWLINE);
+    exit(-1);
+  }
   /* if command line param or subdir named 'fs' not found spout usage verbiage */
   if (!CHDIR_SUCCEEDED(CHDIR(path))) {
     /* if no subdir named 'fs' (or the one which was given) exists, spout usage verbiage */
@@ -280,7 +300,10 @@
     print_usage();
     exit(-1);
   }
-  CHDIR(appPath);
+  if(!CHDIR_SUCCEEDED(CHDIR(appPath))) {
+    printf("Invalid path: \"%s\"." NEWLINE, appPath);
+    exit(-1);
+  }
 
   printf("HTTP %sheader will %s statically included." NEWLINE,
          (includeHttpHeader ? (useHttp11 ? "1.1 " : "1.0 ") : ""),
@@ -306,7 +329,10 @@
     exit(-1);
   }
 
-  CHDIR(path);
+  if(!CHDIR_SUCCEEDED(CHDIR(path))) {
+    printf("Invalid path: \"%s\"." NEWLINE, path);
+    exit(-1);
+  }
 
   fprintf(data_file, "#include \"lwip/apps/fs.h\"" NEWLINE);
   fprintf(data_file, "#include \"lwip/def.h\"" NEWLINE NEWLINE NEWLINE);
@@ -340,7 +366,11 @@
   fclose(data_file);
   fclose(struct_file);
 
-  CHDIR(appPath);
+  if(!CHDIR_SUCCEEDED(CHDIR(appPath))) {
+    printf("Invalid path: \"%s\"." NEWLINE, appPath);
+    exit(-1);
+  }
+
   /* append struct_file to data_file */
   printf(NEWLINE "Creating target file..." NEWLINE NEWLINE);
   concat_files("fsdata.tmp", "fshdr.tmp", targetfile);
@@ -469,13 +499,19 @@
             continue;
           }
           if (freelen > 0) {
-            CHDIR(currName);
+            if(!CHDIR_SUCCEEDED(CHDIR(currName))) {
+              printf("Invalid path: \"%s\"." NEWLINE, currName);
+              exit(-1);
+            }
             strncat(curSubdir, "/", freelen);
             strncat(curSubdir, currName, freelen - 1);
             curSubdir[sizeof(curSubdir) - 1] = 0;
             printf("processing subdirectory %s/..." NEWLINE, curSubdir);
             filesProcessed += process_sub(data_file, struct_file);
-            CHDIR("..");
+            if(!CHDIR_SUCCEEDED(CHDIR(".."))) {
+              printf("Unable to get back to parent dir of: \"%s\"." NEWLINE, currName);
+              exit(-1);
+            }
             curSubdir[sublen] = 0;
           } else {
             printf("WARNING: cannot process sub due to path length restrictions: \"%s/%s\"\n", curSubdir, currName);
@@ -562,11 +598,17 @@
     if (can_be_compressed) {
       if (fsize < OUT_BUF_SIZE) {
         u8_t *ret_buf;
+#ifndef MAKEFS_SUPPORT_DEFLATE_ZLIB
         tdefl_status status;
+#else /* MAKEFS_SUPPORT_DEFLATE_ZLIB */
+        int status;
+#endif /* MAKEFS_SUPPORT_DEFLATE_ZLIB */
         size_t in_bytes = fsize;
         size_t out_bytes = OUT_BUF_SIZE;
         const void *next_in = buf;
         void *next_out = s_outbuf;
+        memset(s_outbuf, 0, sizeof(s_outbuf));
+#ifndef MAKEFS_SUPPORT_DEFLATE_ZLIB
         /* create tdefl() compatible flags (we have to compose the low-level flags ourselves, or use tdefl_create_comp_flags_from_zip_params() but that means MINIZ_NO_ZLIB_APIS can't be defined). */
         mz_uint comp_flags = s_tdefl_num_probes[MZ_MIN(10, deflate_level)] | ((deflate_level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0);
         if (!deflate_level) {
@@ -577,12 +619,18 @@
           printf("tdefl_init() failed!\n");
           exit(-1);
         }
-        memset(s_outbuf, 0, sizeof(s_outbuf));
         status = tdefl_compress(&g_deflator, next_in, &in_bytes, next_out, &out_bytes, TDEFL_FINISH);
         if (status != TDEFL_STATUS_DONE) {
           printf("deflate failed: %d\n", status);
           exit(-1);
         }
+#else /* MAKEFS_SUPPORT_DEFLATE_ZLIB */
+        status = compress2(next_out, &out_bytes, next_in, in_bytes, deflate_level);
+        if (status != Z_OK) {
+          printf("deflate failed: %d\n", status);
+          exit(-1);
+        }
+#endif /*  MAKEFS_SUPPORT_DEFLATE_ZLIB */
         LWIP_ASSERT("out_bytes <= COPY_BUFSIZE", out_bytes <= OUT_BUF_SIZE);
         if (out_bytes < fsize) {
           ret_buf = (u8_t *)malloc(out_bytes);
@@ -590,16 +638,22 @@
           memcpy(ret_buf, s_outbuf, out_bytes);
           {
             /* sanity-check compression be inflating and comparing to the original */
-            tinfl_status dec_status;
-            tinfl_decompressor inflator;
             size_t dec_in_bytes = out_bytes;
             size_t dec_out_bytes = OUT_BUF_SIZE;
             next_out = s_checkbuf;
+            memset(s_checkbuf, 0, sizeof(s_checkbuf));
+#ifndef MAKEFS_SUPPORT_DEFLATE_ZLIB
+            tinfl_status dec_status;
+            tinfl_decompressor inflator;
 
             tinfl_init(&inflator);
-            memset(s_checkbuf, 0, sizeof(s_checkbuf));
             dec_status = tinfl_decompress(&inflator, (const mz_uint8 *)ret_buf, &dec_in_bytes, s_checkbuf, (mz_uint8 *)next_out, &dec_out_bytes, 0);
             LWIP_ASSERT("tinfl_decompress failed", dec_status == TINFL_STATUS_DONE);
+#else /* MAKEFS_SUPPORT_DEFLATE_ZLIB */
+            int dec_status;
+            dec_status = uncompress2 (s_checkbuf, &dec_out_bytes, ret_buf, &dec_in_bytes);
+            LWIP_ASSERT("tinfl_decompress failed", dec_status == Z_OK);
+#endif /* MAKEFS_SUPPORT_DEFLATE_ZLIB */
             LWIP_ASSERT("tinfl_decompress size mismatch", fsize == dec_out_bytes);
             LWIP_ASSERT("decompressed memcmp failed", !memcmp(s_checkbuf, buf, fsize));
           }
@@ -614,7 +668,7 @@
           printf(" - uncompressed: (would be %d bytes larger using deflate)" NEWLINE, (int)(out_bytes - fsize));
         }
       } else {
-        printf(" - uncompressed: (file is larger than deflate bufer)" NEWLINE);
+        printf(" - uncompressed: (file is larger than deflate buffer)" NEWLINE);
       }
     } else {
       printf(" - cannot be compressed" NEWLINE);
@@ -853,6 +907,7 @@
       }
       curSubdir[sublen] = 0;
       return ret;
+#if LWIP_HTTPD_SSI_BY_FILE_EXTENSION
     } else {
       /* check file extension */
       size_t loop;
@@ -861,6 +916,7 @@
           return 1;
         }
       }
+#endif /* LWIP_HTTPD_SSI_BY_FILE_EXTENSION */
     }
   }
   return 0;
@@ -920,9 +976,9 @@
   int flags_printed;
 
   /* create qualified name (@todo: prepend slash or not?) */
-  sprintf(qualifiedName, "%s/%s", curSubdir, filename);
+  snprintf(qualifiedName, sizeof(qualifiedName), "%s/%s", curSubdir, filename);
   /* create C variable name */
-  strcpy(varname, qualifiedName);
+  strncpy(varname, qualifiedName, sizeof(varname));
   /* convert slashes & dots to underscores */
   fix_filename_for_c(varname, MAX_PATH_LEN);
   register_filename(varname);
@@ -1042,17 +1098,17 @@
   }
 
   fprintf(data_file, NEWLINE "/* HTTP header */");
-  if (strstr(filename, "404") == filename) {
+  if (strstr(filename, "404.") == filename) {
     response_type = HTTP_HDR_NOT_FOUND;
     if (useHttp11) {
       response_type = HTTP_HDR_NOT_FOUND_11;
     }
-  } else if (strstr(filename, "400") == filename) {
+  } else if (strstr(filename, "400.") == filename) {
     response_type = HTTP_HDR_BAD_REQUEST;
     if (useHttp11) {
       response_type = HTTP_HDR_BAD_REQUEST_11;
     }
-  } else if (strstr(filename, "501") == filename) {
+  } else if (strstr(filename, "501.") == filename) {
     response_type = HTTP_HDR_NOT_IMPL;
     if (useHttp11) {
       response_type = HTTP_HDR_NOT_IMPL_11;
diff --git a/src/apps/http/makefsdata/readme.txt b/src/apps/http/makefsdata/readme.txt
index 3768585..929179a 100644
--- a/src/apps/http/makefsdata/readme.txt
+++ b/src/apps/http/makefsdata/readme.txt
@@ -11,3 +11,13 @@
 
   if targetdir not specified, makefsdata will attempt to
   process files in subdirectory 'fs'.
+
+The C version of this program can optionally store the none-SSI files in
+a compressed form in which they are also sent to the web client (which
+must support the Deflate content encoding). Files that grow during compression
+(due to being not compressible well), will stored umcompressed automatically.
+In order to do so, compile the program with MAKEFS_SUPPORT_DEFLATE set to 1. You must
+manually download minizip.c for this to work. As an alternative, you can additionally
+define MAKEFS_SUPPORT_DEFLATE_ZLIB to use your system's zlib instead.
+Compression of .html, .js, .css and .svg files usually yields very good compression
+rates and is a great way of reducing your program's size.
diff --git a/src/apps/http/makefsdata/tinydir.h b/src/apps/http/makefsdata/tinydir.h
index 32ae5e8..e08eb84 100644
--- a/src/apps/http/makefsdata/tinydir.h
+++ b/src/apps/http/makefsdata/tinydir.h
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2013-2017, tinydir authors:
+Copyright (c) 2013-2019, tinydir authors:
 - Cong Xu
 - Lautis Sun
 - Baudouin Feildel
@@ -45,7 +45,9 @@
 #include <stdlib.h>
 #include <string.h>
 #ifdef _MSC_VER
-# define WIN32_LEAN_AND_MEAN
+# ifndef WIN32_LEAN_AND_MEAN
+#  define WIN32_LEAN_AND_MEAN
+# endif
 # include <windows.h>
 # include <tchar.h>
 # pragma warning(push)
@@ -65,32 +67,44 @@
 
 /* Windows UNICODE wide character support */
 #if defined _MSC_VER || defined __MINGW32__
-#define _tinydir_char_t TCHAR
-#define TINYDIR_STRING(s) _TEXT(s)
-#define _tinydir_strlen _tcslen
-#define _tinydir_strcpy _tcscpy
-#define _tinydir_strcat _tcscat
-#define _tinydir_strcmp _tcscmp
-#define _tinydir_strrchr _tcsrchr
-#define _tinydir_strncmp _tcsncmp
+# define _tinydir_char_t TCHAR
+# define TINYDIR_STRING(s) _TEXT(s)
+# define _tinydir_strlen _tcslen
+# define _tinydir_strcpy _tcscpy
+# define _tinydir_strcat _tcscat
+# define _tinydir_strcmp _tcscmp
+# define _tinydir_strrchr _tcsrchr
+# define _tinydir_strncmp _tcsncmp
 #else
-#define _tinydir_char_t char
-#define TINYDIR_STRING(s) s
-#define _tinydir_strlen strlen
-#define _tinydir_strcpy strcpy
-#define _tinydir_strcat strcat
-#define _tinydir_strcmp strcmp
-#define _tinydir_strrchr strrchr
-#define _tinydir_strncmp strncmp
+# define _tinydir_char_t char
+# define TINYDIR_STRING(s) s
+# define _tinydir_strlen strlen
+# define _tinydir_strcpy strcpy
+# define _tinydir_strcat strcat
+# define _tinydir_strcmp strcmp
+# define _tinydir_strrchr strrchr
+# define _tinydir_strncmp strncmp
 #endif
 
 #if (defined _MSC_VER || defined __MINGW32__)
-#include <windows.h>
-#define _TINYDIR_PATH_MAX MAX_PATH
+# include <windows.h>
+# define _TINYDIR_PATH_MAX MAX_PATH
 #elif defined  __linux__
-#include <linux/limits.h>
-#define _TINYDIR_PATH_MAX PATH_MAX
-#else
+# include <limits.h>
+# ifdef PATH_MAX
+#  define _TINYDIR_PATH_MAX PATH_MAX
+# endif
+#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
+# include <sys/param.h>
+# if defined(BSD)
+#  include <limits.h>
+#  ifdef PATH_MAX
+#   define _TINYDIR_PATH_MAX PATH_MAX
+#  endif
+# endif
+#endif
+
+#ifndef _TINYDIR_PATH_MAX
 #define _TINYDIR_PATH_MAX 4096
 #endif
 
@@ -357,7 +371,7 @@
 	}
 	tinydir_close(dir);
 
-	if (tinydir_open(dir, path) == -1)
+	if (n_files == 0 || tinydir_open(dir, path) == -1)
 	{
 		return -1;
 	}
@@ -484,6 +498,7 @@
 _TINYDIR_FUNC
 int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file)
 {
+	const _tinydir_char_t *filename;
 	if (dir == NULL || file == NULL)
 	{
 		errno = EINVAL;
@@ -498,45 +513,38 @@
 		errno = ENOENT;
 		return -1;
 	}
-	if (_tinydir_strlen(dir->path) +
-		_tinydir_strlen(
+	filename =
 #ifdef _MSC_VER
-			dir->_f.cFileName
+		dir->_f.cFileName;
 #else
-			dir->_e->d_name
+		dir->_e->d_name;
 #endif
-		) + 1 + _TINYDIR_PATH_EXTRA >=
+	if (_tinydir_strlen(dir->path) +
+		_tinydir_strlen(filename) + 1 + _TINYDIR_PATH_EXTRA >=
 		_TINYDIR_PATH_MAX)
 	{
 		/* the path for the file will be too long */
 		errno = ENAMETOOLONG;
 		return -1;
 	}
-	if (_tinydir_strlen(
-#ifdef _MSC_VER
-			dir->_f.cFileName
-#else
-			dir->_e->d_name
-#endif
-		) >= _TINYDIR_FILENAME_MAX)
+	if (_tinydir_strlen(filename) >= _TINYDIR_FILENAME_MAX)
 	{
 		errno = ENAMETOOLONG;
 		return -1;
 	}
 
 	_tinydir_strcpy(file->path, dir->path);
-	_tinydir_strcat(file->path, TINYDIR_STRING("/"));
-	_tinydir_strcpy(file->name,
-#ifdef _MSC_VER
-		dir->_f.cFileName
-#else
-		dir->_e->d_name
-#endif
-	);
-	_tinydir_strcat(file->path, file->name);
+	if (_tinydir_strcmp(dir->path, TINYDIR_STRING("/")) != 0)
+		_tinydir_strcat(file->path, TINYDIR_STRING("/"));
+	_tinydir_strcpy(file->name, filename);
+	_tinydir_strcat(file->path, filename);
 #ifndef _MSC_VER
 #ifdef __MINGW32__
 	if (_tstat(
+#elif (defined _BSD_SOURCE) || (defined _DEFAULT_SOURCE)	\
+	|| ((defined _XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500))	\
+	|| ((defined _POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))
+	if (lstat(
 #else
 	if (stat(
 #endif
@@ -650,34 +658,34 @@
 	/* Get the parent path */
 #if (defined _MSC_VER || defined __MINGW32__)
 #if ((defined _MSC_VER) && (_MSC_VER >= 1400))
-		_tsplitpath_s(
-			path,
-			drive_buf, _TINYDIR_DRIVE_MAX,
-			dir_name_buf, _TINYDIR_FILENAME_MAX,
-			file_name_buf, _TINYDIR_FILENAME_MAX,
-			ext_buf, _TINYDIR_FILENAME_MAX);
+	errno = _tsplitpath_s(
+		path,
+		drive_buf, _TINYDIR_DRIVE_MAX,
+		dir_name_buf, _TINYDIR_FILENAME_MAX,
+		file_name_buf, _TINYDIR_FILENAME_MAX,
+		ext_buf, _TINYDIR_FILENAME_MAX);
 #else
-		_tsplitpath(
-			path,
-			drive_buf,
-			dir_name_buf,
-			file_name_buf,
-			ext_buf);
-#endif
-
-/* _splitpath_s not work fine with only filename and widechar support */
-#ifdef _UNICODE
-		if (drive_buf[0] == L'\xFEFE')
-			drive_buf[0] = '\0';
-		if (dir_name_buf[0] == L'\xFEFE')
-			dir_name_buf[0] = '\0';
+	_tsplitpath(
+		path,
+		drive_buf,
+		dir_name_buf,
+		file_name_buf,
+		ext_buf);
 #endif
 
 	if (errno)
 	{
-		errno = EINVAL;
 		return -1;
 	}
+
+/* _splitpath_s not work fine with only filename and widechar support */
+#ifdef _UNICODE
+	if (drive_buf[0] == L'\xFEFE')
+		drive_buf[0] = '\0';
+	if (dir_name_buf[0] == L'\xFEFE')
+		dir_name_buf[0] = '\0';
+#endif
+
 	/* Emulate the behavior of dirname by returning "." for dir name if it's
 	empty */
 	if (drive_buf[0] == '\0' && dir_name_buf[0] == '\0')
@@ -694,9 +702,24 @@
 	_tinydir_strcpy(dir_name_buf, path);
 	dir_name = dirname(dir_name_buf);
 	_tinydir_strcpy(file_name_buf, path);
-	base_name =basename(file_name_buf);
+	base_name = basename(file_name_buf);
 #endif
 
+	/* Special case: if the path is a root dir, open the parent dir as the file */
+#if (defined _MSC_VER || defined __MINGW32__)
+	if (_tinydir_strlen(base_name) == 0)
+#else
+	if ((_tinydir_strcmp(base_name, TINYDIR_STRING("/"))) == 0)
+#endif
+	{
+		memset(file, 0, sizeof * file);
+		file->is_dir = 1;
+		file->is_reg = 0;
+		_tinydir_strcpy(file->path, dir_name);
+		file->extension = file->path + _tinydir_strlen(file->path);
+		return 0;
+	}
+
 	/* Open the parent directory */
 	if (tinydir_open(&dir, dir_name) == -1)
 	{
diff --git a/src/apps/lwiperf/lwiperf.c b/src/apps/lwiperf/lwiperf.c
index dbec4da..26b1e3b 100644
--- a/src/apps/lwiperf/lwiperf.c
+++ b/src/apps/lwiperf/lwiperf.c
@@ -7,7 +7,7 @@
  * @defgroup iperf Iperf server
  * @ingroup apps
  *
- * This is a simple performance measuring client/server to check your bandwith using
+ * This is a simple performance measuring client/server to check your bandwidth using
  * iPerf2 on a PC as server/client.
  * It is currently a minimal implementation providing a TCP client/server only.
  *
@@ -53,6 +53,7 @@
 
 #include "lwip/tcp.h"
 #include "lwip/sys.h"
+#include "lwip/inet.h"
 
 #include <string.h>
 
@@ -263,7 +264,7 @@
       /* don't want to wait for free memory here... */
       tcp_abort(conn->conn_pcb);
     }
-  } else {
+  } else if (conn->server_pcb != NULL) {
     /* no conn pcb, this is the listener pcb */
     err = tcp_close(conn->server_pcb);
     LWIP_ASSERT("error", err == ERR_OK);
@@ -565,6 +566,11 @@
 {
   lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg;
   LWIP_UNUSED_ARG(err);
+
+  /* pcb is already deallocated, prevent double-free */
+  conn->conn_pcb = NULL;
+  conn->server_pcb = NULL;
+
   lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE);
 }
 
@@ -602,7 +608,7 @@
   LWIP_ASSERT("invalid conn pcb", s->conn_pcb == NULL);
   if (s->specific_remote) {
     LWIP_ASSERT("s->base.related_master_state != NULL", s->base.related_master_state != NULL);
-    if (!ip_addr_cmp(&newpcb->remote_ip, &s->remote_addr)) {
+    if (!ip_addr_eq(&newpcb->remote_ip, &s->remote_addr)) {
       /* this listener belongs to a client session, and this is not the correct remote */
       return ERR_VAL;
     }
diff --git a/src/apps/mdns/mdns.c b/src/apps/mdns/mdns.c
index aad2728..394d9d1 100644
--- a/src/apps/mdns/mdns.c
+++ b/src/apps/mdns/mdns.c
@@ -5,20 +5,19 @@
  * @defgroup mdns MDNS
  * @ingroup apps
  *
- * RFC 6762 - Multicast DNS\n
- * RFC 6763 - DNS-Based Service Discovery\n
+ * RFC 6762 - Multicast DNS<br>
+ * RFC 6763 - DNS-Based Service Discovery
+ *
+ * You need to increase MEMP_NUM_SYS_TIMEOUT by one if you use MDNS!
  *
  * @verbinclude mdns.txt
  *
  * Things left to implement:
  * -------------------------
  *
- * - Tiebreaking for simultaneous probing
  * - Sending goodbye messages (zero ttl) - shutdown, DHCP lease about to expire, DHCP turned off...
- * - Checking that source address of unicast requests are on the same network
- * - Limiting multicast responses to 1 per second per resource record
+ * - Sending negative responses NSEC
  * - Fragmenting replies if required
- * - Handling multi-packet known answers
  * - Individual known answer detection for all local IPv6 addresses
  * - Dynamic size of outgoing packet
  */
@@ -52,20 +51,26 @@
  * This file is part of the lwIP TCP/IP stack.
  *
  * Author: Erik Ekman <erik@kryo.se>
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
  *
  */
 
 #include "lwip/apps/mdns.h"
 #include "lwip/apps/mdns_priv.h"
+#include "lwip/apps/mdns_domain.h"
+#include "lwip/apps/mdns_out.h"
 #include "lwip/netif.h"
 #include "lwip/udp.h"
 #include "lwip/ip_addr.h"
 #include "lwip/mem.h"
+#include "lwip/memp.h"
 #include "lwip/prot/dns.h"
 #include "lwip/prot/iana.h"
 #include "lwip/timeouts.h"
+#include "lwip/sys.h"
 
-#include <string.h>
+#include <string.h> /* memset */
+#include <stdio.h>  /* snprintf */
 
 #if LWIP_MDNS_RESPONDER
 
@@ -78,6 +83,9 @@
 #if (!LWIP_UDP)
 #error "If you want to use MDNS, you have to define LWIP_UDP=1 in your lwipopts.h"
 #endif
+#ifndef LWIP_RAND
+#error "If you want to use MDNS, you have to define LWIP_RAND=(random function) in your lwipopts.h"
+#endif
 
 #if LWIP_IPV4
 #include "lwip/igmp.h"
@@ -91,14 +99,11 @@
 static const ip_addr_t v6group = DNS_MQUERY_IPV6_GROUP_INIT;
 #endif
 
-#define MDNS_TTL  255
+#define MDNS_IP_TTL  255
 
-/* Stored offsets to beginning of domain names
- * Used for compression.
- */
-#define NUM_DOMAIN_OFFSETS 10
-#define DOMAIN_JUMP_SIZE 2
-#define DOMAIN_JUMP 0xc000
+#if LWIP_MDNS_SEARCH
+static struct mdns_request mdns_requests[MDNS_MAX_REQUESTS];
+#endif
 
 static u8_t mdns_netif_client_id;
 static struct udp_pcb *mdns_pcb;
@@ -109,37 +114,18 @@
 
 #define NETIF_TO_HOST(netif) (struct mdns_host*)(netif_get_client_data(netif, mdns_netif_client_id))
 
-#define TOPDOMAIN_LOCAL "local"
+/** Delayed response defines */
+#define MDNS_RESPONSE_DELAY_MAX   120
+#define MDNS_RESPONSE_DELAY_MIN    20
+#define MDNS_RESPONSE_DELAY (LWIP_RAND() %(MDNS_RESPONSE_DELAY_MAX - \
+                             MDNS_RESPONSE_DELAY_MIN) + MDNS_RESPONSE_DELAY_MIN)
+/* Delayed response for truncated question defines */
+#define MDNS_RESPONSE_TC_DELAY_MAX   500
+#define MDNS_RESPONSE_TC_DELAY_MIN   400
+#define MDNS_RESPONSE_TC_DELAY_MS (LWIP_RAND() % (MDNS_RESPONSE_TC_DELAY_MAX - \
+                             MDNS_RESPONSE_TC_DELAY_MIN) + MDNS_RESPONSE_TC_DELAY_MIN)
 
-#define REVERSE_PTR_TOPDOMAIN "arpa"
-#define REVERSE_PTR_V4_DOMAIN "in-addr"
-#define REVERSE_PTR_V6_DOMAIN "ip6"
-
-#define SRV_PRIORITY 0
-#define SRV_WEIGHT   0
-
-/* Payload size allocated for each outgoing UDP packet */
-#define OUTPACKET_SIZE 500
-
-/* Lookup from hostname -> IPv4 */
-#define REPLY_HOST_A            0x01
-/* Lookup from IPv4/v6 -> hostname */
-#define REPLY_HOST_PTR_V4       0x02
-/* Lookup from hostname -> IPv6 */
-#define REPLY_HOST_AAAA         0x04
-/* Lookup from hostname -> IPv6 */
-#define REPLY_HOST_PTR_V6       0x08
-
-/* Lookup for service types */
-#define REPLY_SERVICE_TYPE_PTR  0x10
-/* Lookup for instances of service */
-#define REPLY_SERVICE_NAME_PTR  0x20
-/* Lookup for location of service instance */
-#define REPLY_SERVICE_SRV       0x40
-/* Lookup for text info on service instance */
-#define REPLY_SERVICE_TXT       0x80
-
-#define MDNS_PROBE_DELAY_MS       250
+/** Probing & announcing defines */
 #define MDNS_PROBE_COUNT          3
 #ifdef LWIP_RAND
 /* first probe timeout SHOULD be random 0-250 ms*/
@@ -148,48 +134,19 @@
 #define MDNS_INITIAL_PROBE_DELAY_MS MDNS_PROBE_DELAY_MS
 #endif
 
-#define MDNS_PROBING_NOT_STARTED  0
-#define MDNS_PROBING_ONGOING      1
-#define MDNS_PROBING_COMPLETE     2
+#define MDNS_PROBE_TIEBREAK_CONFLICT_DELAY_MS    1000
+#define MDNS_PROBE_TIEBREAK_MAX_ANSWERS          5
 
-static const char *dnssd_protos[] = {
-  "_udp", /* DNSSD_PROTO_UDP */
-  "_tcp", /* DNSSD_PROTO_TCP */
-};
+#define MDNS_LEXICOGRAPHICAL_EQUAL    0
+#define MDNS_LEXICOGRAPHICAL_EARLIER  1
+#define MDNS_LEXICOGRAPHICAL_LATER    2
 
-/** Description of a service */
-struct mdns_service {
-  /** TXT record to answer with */
-  struct mdns_domain txtdata;
-  /** Name of service, like 'myweb' */
-  char name[MDNS_LABEL_MAXLEN + 1];
-  /** Type of service, like '_http' */
-  char service[MDNS_LABEL_MAXLEN + 1];
-  /** Callback function and userdata
-   * to update txtdata buffer */
-  service_get_txt_fn_t txt_fn;
-  void *txt_userdata;
-  /** TTL in seconds of SRV/TXT replies */
-  u32_t dns_ttl;
-  /** Protocol, TCP or UDP */
-  u16_t proto;
-  /** Port of the service */
-  u16_t port;
-};
-
-/** Description of a host/netif */
-struct mdns_host {
-  /** Hostname */
-  char name[MDNS_LABEL_MAXLEN + 1];
-  /** Pointer to services */
-  struct mdns_service *services[MDNS_MAX_SERVICES];
-  /** TTL in seconds of A/AAAA/PTR replies */
-  u32_t dns_ttl;
-  /** Number of probes sent for the current name */
-  u8_t probes_sent;
-  /** State in probing sequence */
-  u8_t probing_state;
-};
+/* Delay between successive announcements (RFC6762 section 8.3)
+ * -> increase by a factor 2 with every response sent.
+ */
+#define MDNS_ANNOUNCE_DELAY_MS    1000
+/* Minimum 2 announces, may send up to 8 (RFC6762 section 8.3) */
+#define MDNS_ANNOUNCE_COUNT       2
 
 /** Information about received packet */
 struct mdns_packet {
@@ -198,8 +155,6 @@
   u16_t source_port;
   /** If packet was received unicast */
   u16_t recv_unicast;
-  /** Netif that received the packet */
-  struct netif *netif;
   /** Packet data */
   struct pbuf *pbuf;
   /** Current parsing offset in packet */
@@ -211,60 +166,29 @@
   u16_t questions;
   /** Number of unparsed questions */
   u16_t questions_left;
-  /** Number of answers in packet,
-   *  (sum of normal, authoritative and additional answers)
-   *  read from packet header */
+  /** Number of answers in packet */
   u16_t answers;
   /** Number of unparsed answers */
   u16_t answers_left;
-};
-
-/** Information about outgoing packet */
-struct mdns_outpacket {
-  /** Netif to send the packet on */
-  struct netif *netif;
-  /** Packet data */
-  struct pbuf *pbuf;
-  /** Current write offset in packet */
-  u16_t write_offset;
-  /** Identifier. Used in legacy queries */
-  u16_t tx_id;
-  /** Destination IP/port if sent unicast */
-  ip_addr_t dest_addr;
-  u16_t dest_port;
-  /** Number of questions written */
-  u16_t questions;
-  /** Number of normal answers written */
-  u16_t answers;
-  /** Number of authoritative answers written */
+  /** Number of authoritative answers in packet */
   u16_t authoritative;
-  /** Number of additional answers written */
+  /** Number of unparsed authoritative answers */
+  u16_t authoritative_left;
+  /** Number of additional answers in packet */
   u16_t additional;
-  /** Offsets for written domain names in packet.
-   *  Used for compression */
-  u16_t domain_offsets[NUM_DOMAIN_OFFSETS];
-  /** If all answers in packet should set cache_flush bit */
-  u8_t cache_flush;
-  /** If reply should be sent unicast */
-  u8_t unicast_reply;
-  /** If legacy query. (tx_id needed, and write
-   *  question again in reply before answer) */
-  u8_t legacy_query;
-  /* Reply bitmask for host information */
-  u8_t host_replies;
-  /* Bitmask for which reverse IPv6 hosts to answer */
-  u8_t host_reverse_v6_replies;
-  /* Reply bitmask per service */
-  u8_t serv_replies[MDNS_MAX_SERVICES];
+  /** Number of unparsed additional answers */
+  u16_t additional_left;
+  /** Chained list of known answer received after a truncated question */
+  struct mdns_packet *next_answer;
+  /** Chained list of truncated question that are waiting */
+  struct mdns_packet *next_tc_question;
 };
 
-/** Domain, type and class.
- *  Shared between questions and answers */
-struct mdns_rr_info {
-  struct mdns_domain domain;
-  u16_t type;
-  u16_t klass;
-};
+/* list of received questions with TC flags set, waiting for known answers */
+static struct mdns_packet *pending_tc_questions;
+
+/* pool of received packets */
+LWIP_MEMPOOL_DECLARE(MDNS_PKTS, MDNS_MAX_STORED_PKTS, sizeof (struct mdns_packet), "Stored mDNS packets")
 
 struct mdns_question {
   struct mdns_rr_info info;
@@ -272,389 +196,42 @@
   u16_t unicast;
 };
 
-struct mdns_answer {
-  struct mdns_rr_info info;
-  /** cache flush command bit */
-  u16_t cache_flush;
-  /* Validity time in seconds */
-  u32_t ttl;
-  /** Length of variable answer */
-  u16_t rd_length;
-  /** Offset of start of variable answer in packet */
-  u16_t rd_offset;
+struct mdns_answer_list {
+  u16_t offset[MDNS_PROBE_TIEBREAK_MAX_ANSWERS];
+  u16_t size;
 };
 
-static err_t mdns_send_outpacket(struct mdns_outpacket *outpkt, u8_t flags);
-static void mdns_probe(void* arg);
+static err_t mdns_parse_pkt_questions(struct netif *netif,
+                                      struct mdns_packet *pkt,
+                                      struct mdns_outmsg *reply);
+static void mdns_define_probe_rrs_to_send(struct netif *netif,
+                                          struct mdns_outmsg *outmsg);
+static void mdns_probe_and_announce(void* arg);
+static void mdns_conflict_save_time(struct netif *netif);
 
-static err_t
-mdns_domain_add_label_base(struct mdns_domain *domain, u8_t len)
-{
-  if (len > MDNS_LABEL_MAXLEN) {
-    return ERR_VAL;
-  }
-  if (len > 0 && (1 + len + domain->length >= MDNS_DOMAIN_MAXLEN)) {
-    return ERR_VAL;
-  }
-  /* Allow only zero marker on last byte */
-  if (len == 0 && (1 + domain->length > MDNS_DOMAIN_MAXLEN)) {
-    return ERR_VAL;
-  }
-  domain->name[domain->length] = len;
-  domain->length++;
-  return ERR_OK;
+/**
+ *  Construction to make mdns struct accessible from mdns_out.c
+ *  TODO:
+ *  can we add the mdns struct to the netif like we do for dhcp, autoip,...?
+ *  Then this is not needed any more.
+ *
+ *  @param netif  The network interface
+ *  @return       mdns struct
+ */
+struct mdns_host*
+netif_mdns_data(struct netif *netif) {
+  return NETIF_TO_HOST(netif);
 }
 
 /**
- * Add a label part to a domain
- * @param domain The domain to add a label to
- * @param label The label to add, like &lt;hostname&gt;, 'local', 'com' or ''
- * @param len The length of the label
- * @return ERR_OK on success, an err_t otherwise if label too long
+ *  Construction to access the mdns udp pcb.
+ *
+ *  @return   udp_pcb struct of mdns
  */
-err_t
-mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len)
+struct udp_pcb*
+get_mdns_pcb(void)
 {
-  err_t err = mdns_domain_add_label_base(domain, len);
-  if (err != ERR_OK) {
-    return err;
-  }
-  if (len) {
-    MEMCPY(&domain->name[domain->length], label, len);
-    domain->length += len;
-  }
-  return ERR_OK;
-}
-
-/**
- * Add a label part to a domain (@see mdns_domain_add_label but copy directly from pbuf)
- */
-static err_t
-mdns_domain_add_label_pbuf(struct mdns_domain *domain, const struct pbuf *p, u16_t offset, u8_t len)
-{
-  err_t err = mdns_domain_add_label_base(domain, len);
-  if (err != ERR_OK) {
-    return err;
-  }
-  if (len) {
-    if (pbuf_copy_partial(p, &domain->name[domain->length], len, offset) != len) {
-      /* take back the ++ done before */
-      domain->length--;
-      return ERR_ARG;
-    }
-    domain->length += len;
-  }
-  return ERR_OK;
-}
-
-/**
- * Internal readname function with max 6 levels of recursion following jumps
- * while decompressing name
- */
-static u16_t
-mdns_readname_loop(struct pbuf *p, u16_t offset, struct mdns_domain *domain, unsigned depth)
-{
-  u8_t c;
-
-  do {
-    if (depth > 5) {
-      /* Too many jumps */
-      return MDNS_READNAME_ERROR;
-    }
-
-    c = pbuf_get_at(p, offset);
-    offset++;
-
-    /* is this a compressed label? */
-    if ((c & 0xc0) == 0xc0) {
-      u16_t jumpaddr;
-      if (offset >= p->tot_len) {
-        /* Make sure both jump bytes fit in the packet */
-        return MDNS_READNAME_ERROR;
-      }
-      jumpaddr = (((c & 0x3f) << 8) | (pbuf_get_at(p, offset) & 0xff));
-      offset++;
-      if (jumpaddr >= SIZEOF_DNS_HDR && jumpaddr < p->tot_len) {
-        u16_t res;
-        /* Recursive call, maximum depth will be checked */
-        res = mdns_readname_loop(p, jumpaddr, domain, depth + 1);
-        /* Dont return offset since new bytes were not read (jumped to somewhere in packet) */
-        if (res == MDNS_READNAME_ERROR) {
-          return res;
-        }
-      } else {
-        return MDNS_READNAME_ERROR;
-      }
-      break;
-    }
-
-    /* normal label */
-    if (c <= MDNS_LABEL_MAXLEN) {
-      err_t res;
-
-      if (c + domain->length >= MDNS_DOMAIN_MAXLEN) {
-        return MDNS_READNAME_ERROR;
-      }
-      res = mdns_domain_add_label_pbuf(domain, p, offset, c);
-      if (res != ERR_OK) {
-        return MDNS_READNAME_ERROR;
-      }
-      offset += c;
-    } else {
-      /* bad length byte */
-      return MDNS_READNAME_ERROR;
-    }
-  } while (c != 0);
-
-  return offset;
-}
-
-/**
- * Read possibly compressed domain name from packet buffer
- * @param p The packet
- * @param offset start position of domain name in packet
- * @param domain The domain name destination
- * @return The new offset after the domain, or MDNS_READNAME_ERROR
- *         if reading failed
- */
-u16_t
-mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain)
-{
-  memset(domain, 0, sizeof(struct mdns_domain));
-  return mdns_readname_loop(p, offset, domain, 0);
-}
-
-/**
- * Print domain name to debug output
- * @param domain The domain name
- */
-static void
-mdns_domain_debug_print(struct mdns_domain *domain)
-{
-  u8_t *src = domain->name;
-  u8_t i;
-
-  while (*src) {
-    u8_t label_len = *src;
-    src++;
-    for (i = 0; i < label_len; i++) {
-      LWIP_DEBUGF(MDNS_DEBUG, ("%c", src[i]));
-    }
-    src += label_len;
-    LWIP_DEBUGF(MDNS_DEBUG, ("."));
-  }
-}
-
-/**
- * Return 1 if contents of domains match (case-insensitive)
- * @param a Domain name to compare 1
- * @param b Domain name to compare 2
- * @return 1 if domains are equal ignoring case, 0 otherwise
- */
-int
-mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b)
-{
-  u8_t *ptra, *ptrb;
-  u8_t len;
-  int res;
-
-  if (a->length != b->length) {
-    return 0;
-  }
-
-  ptra = a->name;
-  ptrb = b->name;
-  while (*ptra && *ptrb && ptra < &a->name[a->length]) {
-    if (*ptra != *ptrb) {
-      return 0;
-    }
-    len = *ptra;
-    ptra++;
-    ptrb++;
-    res = lwip_strnicmp((char *) ptra, (char *) ptrb, len);
-    if (res != 0) {
-      return 0;
-    }
-    ptra += len;
-    ptrb += len;
-  }
-  if (*ptra != *ptrb && ptra < &a->name[a->length]) {
-    return 0;
-  }
-  return 1;
-}
-
-/**
- * Call user supplied function to setup TXT data
- * @param service The service to build TXT record for
- */
-static void
-mdns_prepare_txtdata(struct mdns_service *service)
-{
-  memset(&service->txtdata, 0, sizeof(struct mdns_domain));
-  if (service->txt_fn) {
-    service->txt_fn(service, service->txt_userdata);
-  }
-}
-
-#if LWIP_IPV4
-/**
- * Build domain for reverse lookup of IPv4 address
- * like 12.0.168.192.in-addr.arpa. for 192.168.0.12
- * @param domain Where to write the domain name
- * @param addr Pointer to an IPv4 address to encode
- * @return ERR_OK if domain was written, an err_t otherwise
- */
-static err_t
-mdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr)
-{
-  int i;
-  err_t res;
-  const u8_t *ptr;
-
-  LWIP_UNUSED_ARG(res);
-  if (!domain || !addr) {
-    return ERR_ARG;
-  }
-  memset(domain, 0, sizeof(struct mdns_domain));
-  ptr = (const u8_t *) addr;
-  for (i = sizeof(ip4_addr_t) - 1; i >= 0; i--) {
-    char buf[4];
-    u8_t val = ptr[i];
-
-    lwip_itoa(buf, sizeof(buf), val);
-    res = mdns_domain_add_label(domain, buf, (u8_t)strlen(buf));
-    LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res);
-  }
-  res = mdns_domain_add_label(domain, REVERSE_PTR_V4_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V4_DOMAIN) - 1));
-  LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res);
-  res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN) - 1));
-  LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res);
-  res = mdns_domain_add_label(domain, NULL, 0);
-  LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res);
-
-  return ERR_OK;
-}
-#endif
-
-#if LWIP_IPV6
-/**
- * Build domain for reverse lookup of IP address
- * like b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. for 2001:db8::567:89ab
- * @param domain Where to write the domain name
- * @param addr Pointer to an IPv6 address to encode
- * @return ERR_OK if domain was written, an err_t otherwise
- */
-static err_t
-mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr)
-{
-  int i;
-  err_t res;
-  const u8_t *ptr;
-  LWIP_UNUSED_ARG(res);
-  if (!domain || !addr) {
-    return ERR_ARG;
-  }
-  memset(domain, 0, sizeof(struct mdns_domain));
-  ptr = (const u8_t *) addr;
-  for (i = sizeof(ip6_addr_p_t) - 1; i >= 0; i--) {
-    char buf;
-    u8_t byte = ptr[i];
-    int j;
-    for (j = 0; j < 2; j++) {
-      if ((byte & 0x0F) < 0xA) {
-        buf = '0' + (byte & 0x0F);
-      } else {
-        buf = 'a' + (byte & 0x0F) - 0xA;
-      }
-      res = mdns_domain_add_label(domain, &buf, sizeof(buf));
-      LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res);
-      byte >>= 4;
-    }
-  }
-  res = mdns_domain_add_label(domain, REVERSE_PTR_V6_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V6_DOMAIN) - 1));
-  LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res);
-  res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN) - 1));
-  LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res);
-  res = mdns_domain_add_label(domain, NULL, 0);
-  LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res);
-
-  return ERR_OK;
-}
-#endif
-
-/* Add .local. to domain */
-static err_t
-mdns_add_dotlocal(struct mdns_domain *domain)
-{
-  err_t res = mdns_domain_add_label(domain, TOPDOMAIN_LOCAL, (u8_t)(sizeof(TOPDOMAIN_LOCAL) - 1));
-  LWIP_UNUSED_ARG(res);
-  LWIP_ERROR("mdns_add_dotlocal: Failed to add label", (res == ERR_OK), return res);
-  return mdns_domain_add_label(domain, NULL, 0);
-}
-
-/**
- * Build the <hostname>.local. domain name
- * @param domain Where to write the domain name
- * @param mdns TMDNS netif descriptor.
- * @return ERR_OK if domain <hostname>.local. was written, an err_t otherwise
- */
-static err_t
-mdns_build_host_domain(struct mdns_domain *domain, struct mdns_host *mdns)
-{
-  err_t res;
-  LWIP_UNUSED_ARG(res);
-  memset(domain, 0, sizeof(struct mdns_domain));
-  LWIP_ERROR("mdns_build_host_domain: mdns != NULL", (mdns != NULL), return ERR_VAL);
-  res = mdns_domain_add_label(domain, mdns->name, (u8_t)strlen(mdns->name));
-  LWIP_ERROR("mdns_build_host_domain: Failed to add label", (res == ERR_OK), return res);
-  return mdns_add_dotlocal(domain);
-}
-
-/**
- * Build the lookup-all-services special DNS-SD domain name
- * @param domain Where to write the domain name
- * @return ERR_OK if domain _services._dns-sd._udp.local. was written, an err_t otherwise
- */
-static err_t
-mdns_build_dnssd_domain(struct mdns_domain *domain)
-{
-  err_t res;
-  LWIP_UNUSED_ARG(res);
-  memset(domain, 0, sizeof(struct mdns_domain));
-  res = mdns_domain_add_label(domain, "_services", (u8_t)(sizeof("_services") - 1));
-  LWIP_ERROR("mdns_build_dnssd_domain: Failed to add label", (res == ERR_OK), return res);
-  res = mdns_domain_add_label(domain, "_dns-sd", (u8_t)(sizeof("_dns-sd") - 1));
-  LWIP_ERROR("mdns_build_dnssd_domain: Failed to add label", (res == ERR_OK), return res);
-  res = mdns_domain_add_label(domain, dnssd_protos[DNSSD_PROTO_UDP], (u8_t)strlen(dnssd_protos[DNSSD_PROTO_UDP]));
-  LWIP_ERROR("mdns_build_dnssd_domain: Failed to add label", (res == ERR_OK), return res);
-  return mdns_add_dotlocal(domain);
-}
-
-/**
- * Build domain name for a service
- * @param domain Where to write the domain name
- * @param service The service struct, containing service name, type and protocol
- * @param include_name Whether to include the service name in the domain
- * @return ERR_OK if domain was written. If service name is included,
- *         <name>.<type>.<proto>.local. will be written, otherwise <type>.<proto>.local.
- *         An err_t is returned on error.
- */
-static err_t
-mdns_build_service_domain(struct mdns_domain *domain, struct mdns_service *service, int include_name)
-{
-  err_t res;
-  LWIP_UNUSED_ARG(res);
-  memset(domain, 0, sizeof(struct mdns_domain));
-  if (include_name) {
-    res = mdns_domain_add_label(domain, service->name, (u8_t)strlen(service->name));
-    LWIP_ERROR("mdns_build_service_domain: Failed to add label", (res == ERR_OK), return res);
-  }
-  res = mdns_domain_add_label(domain, service->service, (u8_t)strlen(service->service));
-  LWIP_ERROR("mdns_build_service_domain: Failed to add label", (res == ERR_OK), return res);
-  res = mdns_domain_add_label(domain, dnssd_protos[service->proto], (u8_t)strlen(dnssd_protos[service->proto]));
-  LWIP_ERROR("mdns_build_service_domain: Failed to add label", (res == ERR_OK), return res);
-  return mdns_add_dotlocal(domain);
+  return mdns_pcb;
 }
 
 /**
@@ -772,270 +349,44 @@
   return replies;
 }
 
+#if LWIP_MDNS_SEARCH
 /**
- * Return bytes needed to write before jump for best result of compressing supplied domain
- * against domain in outpacket starting at specified offset.
- * If a match is found, offset is updated to where to jump to
- * @param pbuf Pointer to pbuf with the partially constructed DNS packet
- * @param offset Start position of a domain written earlier. If this location is suitable
- *               for compression, the pointer is updated to where in the domain to jump to.
- * @param domain The domain to write
- * @return Number of bytes to write of the new domain before writing a jump to the offset.
- *         If compression can not be done against this previous domain name, the full new
- *         domain length is returned.
+ * Check if question belong to a specified request
+ * @param request A ongoing MDNS request
+ * @param rr Domain/type/class from an answer
+ * @return Bitmask of which matching replies
  */
-u16_t
-mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain)
+static int
+check_request(struct mdns_request *request, struct mdns_rr_info *rr)
 {
-  struct mdns_domain target;
-  u16_t target_end;
-  u8_t target_len;
-  u8_t writelen = 0;
-  u8_t *ptr;
-  if (pbuf == NULL) {
-    return domain->length;
-  }
-  target_end = mdns_readname(pbuf, *offset, &target);
-  if (target_end == MDNS_READNAME_ERROR) {
-    return domain->length;
-  }
-  target_len = (u8_t)(target_end - *offset);
-  ptr = domain->name;
-  while (writelen < domain->length) {
-    u8_t domainlen = (u8_t)(domain->length - writelen);
-    u8_t labellen;
-    if (domainlen <= target.length && domainlen > DOMAIN_JUMP_SIZE) {
-      /* Compare domains if target is long enough, and we have enough left of the domain */
-      u8_t targetpos = (u8_t)(target.length - domainlen);
-      if ((targetpos + DOMAIN_JUMP_SIZE) >= target_len) {
-        /* We are checking at or beyond a jump in the original, stop looking */
-        break;
-      }
-      if (target.length >= domainlen &&
-          memcmp(&domain->name[writelen], &target.name[targetpos], domainlen) == 0) {
-        *offset += targetpos;
-        return writelen;
-      }
-    }
-    /* Skip to next label in domain */
-    labellen = *ptr;
-    writelen += 1 + labellen;
-    ptr += 1 + labellen;
-  }
-  /* Nothing found */
-  return domain->length;
-}
-
-/**
- * Write domain to outpacket. Compression will be attempted,
- * unless domain->skip_compression is set.
- * @param outpkt The outpacket to write to
- * @param domain The domain name to write
- * @return ERR_OK on success, an err_t otherwise
- */
-static err_t
-mdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain)
-{
-  int i;
   err_t res;
-  u16_t writelen = domain->length;
-  u16_t jump_offset = 0;
-  u16_t jump;
+  int replies = 0;
+  struct mdns_domain mydomain;
 
-  if (!domain->skip_compression) {
-    for (i = 0; i < NUM_DOMAIN_OFFSETS; i++) {
-      u16_t offset = outpkt->domain_offsets[i];
-      if (offset) {
-        u16_t len = mdns_compress_domain(outpkt->pbuf, &offset, domain);
-        if (len < writelen) {
-          writelen = len;
-          jump_offset = offset;
-        }
-      }
-    }
+  if (rr->klass != DNS_RRCLASS_IN && rr->klass != DNS_RRCLASS_ANY) {
+    /* Invalid class */
+    return 0;
   }
 
-  if (writelen) {
-    /* Write uncompressed part of name */
-    res = pbuf_take_at(outpkt->pbuf, domain->name, writelen, outpkt->write_offset);
-    if (res != ERR_OK) {
-      return res;
-    }
-
-    /* Store offset of this new domain */
-    for (i = 0; i < NUM_DOMAIN_OFFSETS; i++) {
-      if (outpkt->domain_offsets[i] == 0) {
-        outpkt->domain_offsets[i] = outpkt->write_offset;
-        break;
-      }
-    }
-
-    outpkt->write_offset += writelen;
+  res = mdns_build_request_domain(&mydomain, request, 0);
+  if (res == ERR_OK && mdns_domain_eq(&rr->domain, &mydomain) &&
+      (rr->type == DNS_RRTYPE_PTR || rr->type == DNS_RRTYPE_ANY)) {
+    /* Request for the instance of my service */
+    replies |= REPLY_SERVICE_TYPE_PTR;
   }
-  if (jump_offset) {
-    /* Write jump */
-    jump = lwip_htons(DOMAIN_JUMP | jump_offset);
-    res = pbuf_take_at(outpkt->pbuf, &jump, DOMAIN_JUMP_SIZE, outpkt->write_offset);
-    if (res != ERR_OK) {
-      return res;
+  res = mdns_build_request_domain(&mydomain, request, 1);
+  if (res == ERR_OK && mdns_domain_eq(&rr->domain, &mydomain)) {
+    /* Request for info about my service */
+    if (rr->type == DNS_RRTYPE_SRV || rr->type == DNS_RRTYPE_ANY) {
+      replies |= REPLY_SERVICE_SRV;
     }
-    outpkt->write_offset += DOMAIN_JUMP_SIZE;
+    if (rr->type == DNS_RRTYPE_TXT || rr->type == DNS_RRTYPE_ANY) {
+      replies |= REPLY_SERVICE_TXT;
+    }
   }
-  return ERR_OK;
+  return replies;
 }
-
-/**
- * Write a question to an outpacket
- * A question contains domain, type and class. Since an answer also starts with these fields this function is also
- * called from mdns_add_answer().
- * @param outpkt The outpacket to write to
- * @param domain The domain name the answer is for
- * @param type The DNS type of the answer (like 'AAAA', 'SRV')
- * @param klass The DNS type of the answer (like 'IN')
- * @param unicast If highest bit in class should be set, to instruct the responder to
- *                reply with a unicast packet
- * @return ERR_OK on success, an err_t otherwise
- */
-static err_t
-mdns_add_question(struct mdns_outpacket *outpkt, struct mdns_domain *domain, u16_t type, u16_t klass, u16_t unicast)
-{
-  u16_t question_len;
-  u16_t field16;
-  err_t res;
-
-  if (!outpkt->pbuf) {
-    /* If no pbuf is active, allocate one */
-    outpkt->pbuf = pbuf_alloc(PBUF_TRANSPORT, OUTPACKET_SIZE, PBUF_RAM);
-    if (!outpkt->pbuf) {
-      return ERR_MEM;
-    }
-    outpkt->write_offset = SIZEOF_DNS_HDR;
-  }
-
-  /* Worst case calculation. Domain string might be compressed */
-  question_len = domain->length + sizeof(type) + sizeof(klass);
-  if (outpkt->write_offset + question_len > outpkt->pbuf->tot_len) {
-    /* No space */
-    return ERR_MEM;
-  }
-
-  /* Write name */
-  res = mdns_write_domain(outpkt, domain);
-  if (res != ERR_OK) {
-    return res;
-  }
-
-  /* Write type */
-  field16 = lwip_htons(type);
-  res = pbuf_take_at(outpkt->pbuf, &field16, sizeof(field16), outpkt->write_offset);
-  if (res != ERR_OK) {
-    return res;
-  }
-  outpkt->write_offset += sizeof(field16);
-
-  /* Write class */
-  if (unicast) {
-    klass |= 0x8000;
-  }
-  field16 = lwip_htons(klass);
-  res = pbuf_take_at(outpkt->pbuf, &field16, sizeof(field16), outpkt->write_offset);
-  if (res != ERR_OK) {
-    return res;
-  }
-  outpkt->write_offset += sizeof(field16);
-
-  return ERR_OK;
-}
-
-/**
- * Write answer to reply packet.
- * buf or answer_domain can be null. The rd_length written will be buf_length +
- * size of (compressed) domain. Most uses will need either buf or answer_domain,
- * special case is SRV that starts with 3 u16 and then a domain name.
- * @param reply The outpacket to write to
- * @param domain The domain name the answer is for
- * @param type The DNS type of the answer (like 'AAAA', 'SRV')
- * @param klass The DNS type of the answer (like 'IN')
- * @param cache_flush If highest bit in class should be set, to instruct receiver that
- *                    this reply replaces any earlier answer for this domain/type/class
- * @param ttl Validity time in seconds to send out for IP address data in DNS replies
- * @param buf Pointer to buffer of answer data
- * @param buf_length Length of variable data
- * @param answer_domain A domain to write after any buffer data as answer
- * @return ERR_OK on success, an err_t otherwise
- */
-static err_t
-mdns_add_answer(struct mdns_outpacket *reply, struct mdns_domain *domain, u16_t type, u16_t klass, u16_t cache_flush,
-                u32_t ttl, const u8_t *buf, size_t buf_length, struct mdns_domain *answer_domain)
-{
-  u16_t answer_len;
-  u16_t field16;
-  u16_t rdlen_offset;
-  u16_t answer_offset;
-  u32_t field32;
-  err_t res;
-
-  if (!reply->pbuf) {
-    /* If no pbuf is active, allocate one */
-    reply->pbuf = pbuf_alloc(PBUF_TRANSPORT, OUTPACKET_SIZE, PBUF_RAM);
-    if (!reply->pbuf) {
-      return ERR_MEM;
-    }
-    reply->write_offset = SIZEOF_DNS_HDR;
-  }
-
-  /* Worst case calculation. Domain strings might be compressed */
-  answer_len = domain->length + sizeof(type) + sizeof(klass) + sizeof(ttl) + sizeof(field16)/*rd_length*/;
-  if (buf) {
-    answer_len += (u16_t)buf_length;
-  }
-  if (answer_domain) {
-    answer_len += answer_domain->length;
-  }
-  if (reply->write_offset + answer_len > reply->pbuf->tot_len) {
-    /* No space */
-    return ERR_MEM;
-  }
-
-  /* Answer starts with same data as question, then more fields */
-  mdns_add_question(reply, domain, type, klass, cache_flush);
-
-  /* Write TTL */
-  field32 = lwip_htonl(ttl);
-  res = pbuf_take_at(reply->pbuf, &field32, sizeof(field32), reply->write_offset);
-  if (res != ERR_OK) {
-    return res;
-  }
-  reply->write_offset += sizeof(field32);
-
-  /* Store offsets and skip forward to the data */
-  rdlen_offset = reply->write_offset;
-  reply->write_offset += sizeof(field16);
-  answer_offset = reply->write_offset;
-
-  if (buf) {
-    /* Write static data */
-    res = pbuf_take_at(reply->pbuf, buf, (u16_t)buf_length, reply->write_offset);
-    if (res != ERR_OK) {
-      return res;
-    }
-    reply->write_offset += (u16_t)buf_length;
-  }
-
-  if (answer_domain) {
-    /* Write name answer (compressed if possible) */
-    res = mdns_write_domain(reply, answer_domain);
-    if (res != ERR_OK) {
-      return res;
-    }
-  }
-
-  /* Write rd_length after when we know the answer size */
-  field16 = lwip_htons(reply->write_offset - answer_offset);
-  res = pbuf_take_at(reply->pbuf, &field16, sizeof(field16), rdlen_offset);
-
-  return res;
-}
+#endif
 
 /**
  * Helper function for mdns_read_question/mdns_read_answer
@@ -1109,13 +460,14 @@
 /**
  * Read an answer from the packet
  * The variable length reply is not copied, its pbuf offset and length is stored instead.
- * @param pkt The MDNS packet to read. The answers_left field will be decremented and
+ * @param pkt The MDNS packet to read. The num_left field will be decremented and
  *            the parse_offset will be updated.
- * @param answer The struct to fill with answer data
+ * @param answer    The struct to fill with answer data
+ * @param num_left  number of answers left -> answers, authoritative or additional
  * @return ERR_OK on success, an err_t otherwise
  */
 static err_t
-mdns_read_answer(struct mdns_packet *pkt, struct mdns_answer *answer)
+mdns_read_answer(struct mdns_packet *pkt, struct mdns_answer *answer, u16_t *num_left)
 {
   /* Read questions first */
   if (pkt->questions_left) {
@@ -1127,11 +479,11 @@
     return ERR_VAL;
   }
 
-  if (pkt->answers_left) {
+  if (*num_left) {
     u16_t copied, field16;
     u32_t ttl;
     err_t res;
-    pkt->answers_left--;
+    (*num_left)--;
 
     memset(answer, 0, sizeof(struct mdns_answer));
     res = mdns_read_rr_info(pkt, &answer->info);
@@ -1165,351 +517,6 @@
   return ERR_VAL;
 }
 
-#if LWIP_IPV4
-/** Write an IPv4 address (A) RR to outpacket */
-static err_t
-mdns_add_a_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct netif *netif)
-{
-  struct mdns_domain host;
-  mdns_build_host_domain(&host, NETIF_TO_HOST(netif));
-  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with A record\n"));
-  return mdns_add_answer(reply, &host, DNS_RRTYPE_A, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, (const u8_t *) netif_ip4_addr(netif), sizeof(ip4_addr_t), NULL);
-}
-
-/** Write a 4.3.2.1.in-addr.arpa -> hostname.local PTR RR to outpacket */
-static err_t
-mdns_add_hostv4_ptr_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct netif *netif)
-{
-  struct mdns_domain host, revhost;
-  mdns_build_host_domain(&host, NETIF_TO_HOST(netif));
-  mdns_build_reverse_v4_domain(&revhost, netif_ip4_addr(netif));
-  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with v4 PTR record\n"));
-  return mdns_add_answer(reply, &revhost, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, NULL, 0, &host);
-}
-#endif
-
-#if LWIP_IPV6
-/** Write an IPv6 address (AAAA) RR to outpacket */
-static err_t
-mdns_add_aaaa_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct netif *netif, int addrindex)
-{
-  struct mdns_domain host;
-  mdns_build_host_domain(&host, NETIF_TO_HOST(netif));
-  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with AAAA record\n"));
-  return mdns_add_answer(reply, &host, DNS_RRTYPE_AAAA, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, (const u8_t *) netif_ip6_addr(netif, addrindex), sizeof(ip6_addr_p_t), NULL);
-}
-
-/** Write a x.y.z.ip6.arpa -> hostname.local PTR RR to outpacket */
-static err_t
-mdns_add_hostv6_ptr_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct netif *netif, int addrindex)
-{
-  struct mdns_domain host, revhost;
-  mdns_build_host_domain(&host, NETIF_TO_HOST(netif));
-  mdns_build_reverse_v6_domain(&revhost, netif_ip6_addr(netif, addrindex));
-  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with v6 PTR record\n"));
-  return mdns_add_answer(reply, &revhost, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, NULL, 0, &host);
-}
-#endif
-
-/** Write an all-services -> servicetype PTR RR to outpacket */
-static err_t
-mdns_add_servicetype_ptr_answer(struct mdns_outpacket *reply, struct mdns_service *service)
-{
-  struct mdns_domain service_type, service_dnssd;
-  mdns_build_service_domain(&service_type, service, 0);
-  mdns_build_dnssd_domain(&service_dnssd);
-  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with service type PTR record\n"));
-  return mdns_add_answer(reply, &service_dnssd, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, 0, service->dns_ttl, NULL, 0, &service_type);
-}
-
-/** Write a servicetype -> servicename PTR RR to outpacket */
-static err_t
-mdns_add_servicename_ptr_answer(struct mdns_outpacket *reply, struct mdns_service *service)
-{
-  struct mdns_domain service_type, service_instance;
-  mdns_build_service_domain(&service_type, service, 0);
-  mdns_build_service_domain(&service_instance, service, 1);
-  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with service name PTR record\n"));
-  return mdns_add_answer(reply, &service_type, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, 0, service->dns_ttl, NULL, 0, &service_instance);
-}
-
-/** Write a SRV RR to outpacket */
-static err_t
-mdns_add_srv_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct mdns_host *mdns, struct mdns_service *service)
-{
-  struct mdns_domain service_instance, srvhost;
-  u16_t srvdata[3];
-  mdns_build_service_domain(&service_instance, service, 1);
-  mdns_build_host_domain(&srvhost, mdns);
-  if (reply->legacy_query) {
-    /* RFC 6762 section 18.14:
-     * In legacy unicast responses generated to answer legacy queries,
-     * name compression MUST NOT be performed on SRV records.
-     */
-    srvhost.skip_compression = 1;
-  }
-  srvdata[0] = lwip_htons(SRV_PRIORITY);
-  srvdata[1] = lwip_htons(SRV_WEIGHT);
-  srvdata[2] = lwip_htons(service->port);
-  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with SRV record\n"));
-  return mdns_add_answer(reply, &service_instance, DNS_RRTYPE_SRV, DNS_RRCLASS_IN, cache_flush, service->dns_ttl,
-                         (const u8_t *) &srvdata, sizeof(srvdata), &srvhost);
-}
-
-/** Write a TXT RR to outpacket */
-static err_t
-mdns_add_txt_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct mdns_service *service)
-{
-  struct mdns_domain service_instance;
-  mdns_build_service_domain(&service_instance, service, 1);
-  mdns_prepare_txtdata(service);
-  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with TXT record\n"));
-  return mdns_add_answer(reply, &service_instance, DNS_RRTYPE_TXT, DNS_RRCLASS_IN, cache_flush, service->dns_ttl,
-                         (u8_t *) &service->txtdata.name, service->txtdata.length, NULL);
-}
-
-/**
- * Setup outpacket as a reply to the incoming packet
- */
-static void
-mdns_init_outpacket(struct mdns_outpacket *out, struct mdns_packet *in)
-{
-  memset(out, 0, sizeof(struct mdns_outpacket));
-  out->cache_flush = 1;
-  out->netif = in->netif;
-
-  /* Copy source IP/port to use when responding unicast, or to choose
-   * which pcb to use for multicast (IPv4/IPv6)
-   */
-  SMEMCPY(&out->dest_addr, &in->source_addr, sizeof(ip_addr_t));
-  out->dest_port = in->source_port;
-
-  if (in->source_port != LWIP_IANA_PORT_MDNS) {
-    out->unicast_reply = 1;
-    out->cache_flush = 0;
-    if (in->questions == 1) {
-      out->legacy_query = 1;
-      out->tx_id = in->tx_id;
-    }
-  }
-
-  if (in->recv_unicast) {
-    out->unicast_reply = 1;
-  }
-}
-
-/**
- * Send chosen answers as a reply
- *
- * Add all selected answers (first write will allocate pbuf)
- * Add additional answers based on the selected answers
- * Send the packet
- */
-static err_t
-mdns_send_outpacket(struct mdns_outpacket *outpkt, u8_t flags)
-{
-  struct mdns_service *service;
-  err_t res = ERR_ARG;
-  int i;
-  struct mdns_host *mdns = NETIF_TO_HOST(outpkt->netif);
-  u16_t answers = 0;
-
-  /* Write answers to host questions */
-#if LWIP_IPV4
-  if (outpkt->host_replies & REPLY_HOST_A) {
-    res = mdns_add_a_answer(outpkt, outpkt->cache_flush, outpkt->netif);
-    if (res != ERR_OK) {
-      goto cleanup;
-    }
-    answers++;
-  }
-  if (outpkt->host_replies & REPLY_HOST_PTR_V4) {
-    res = mdns_add_hostv4_ptr_answer(outpkt, outpkt->cache_flush, outpkt->netif);
-    if (res != ERR_OK) {
-      goto cleanup;
-    }
-    answers++;
-  }
-#endif
-#if LWIP_IPV6
-  if (outpkt->host_replies & REPLY_HOST_AAAA) {
-    int addrindex;
-    for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; addrindex++) {
-      if (ip6_addr_isvalid(netif_ip6_addr_state(outpkt->netif, addrindex))) {
-        res = mdns_add_aaaa_answer(outpkt, outpkt->cache_flush, outpkt->netif, addrindex);
-        if (res != ERR_OK) {
-          goto cleanup;
-        }
-        answers++;
-      }
-    }
-  }
-  if (outpkt->host_replies & REPLY_HOST_PTR_V6) {
-    u8_t rev_addrs = outpkt->host_reverse_v6_replies;
-    int addrindex = 0;
-    while (rev_addrs) {
-      if (rev_addrs & 1) {
-        res = mdns_add_hostv6_ptr_answer(outpkt, outpkt->cache_flush, outpkt->netif, addrindex);
-        if (res != ERR_OK) {
-          goto cleanup;
-        }
-        answers++;
-      }
-      addrindex++;
-      rev_addrs >>= 1;
-    }
-  }
-#endif
-
-  /* Write answers to service questions */
-  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
-    service = mdns->services[i];
-    if (!service) {
-      continue;
-    }
-
-    if (outpkt->serv_replies[i] & REPLY_SERVICE_TYPE_PTR) {
-      res = mdns_add_servicetype_ptr_answer(outpkt, service);
-      if (res != ERR_OK) {
-        goto cleanup;
-      }
-      answers++;
-    }
-
-    if (outpkt->serv_replies[i] & REPLY_SERVICE_NAME_PTR) {
-      res = mdns_add_servicename_ptr_answer(outpkt, service);
-      if (res != ERR_OK) {
-        goto cleanup;
-      }
-      answers++;
-    }
-
-    if (outpkt->serv_replies[i] & REPLY_SERVICE_SRV) {
-      res = mdns_add_srv_answer(outpkt, outpkt->cache_flush, mdns, service);
-      if (res != ERR_OK) {
-        goto cleanup;
-      }
-      answers++;
-    }
-
-    if (outpkt->serv_replies[i] & REPLY_SERVICE_TXT) {
-      res = mdns_add_txt_answer(outpkt, outpkt->cache_flush, service);
-      if (res != ERR_OK) {
-        goto cleanup;
-      }
-      answers++;
-    }
-  }
-
-  /* if this is a response, the data above is anwers, else this is a probe and the answers above goes into auth section */
-  if (flags & DNS_FLAG1_RESPONSE) {
-    outpkt->answers += answers;
-  } else {
-    outpkt->authoritative += answers;
-  }
-
-  /* All answers written, add additional RRs */
-  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
-    service = mdns->services[i];
-    if (!service) {
-      continue;
-    }
-
-    if (outpkt->serv_replies[i] & REPLY_SERVICE_NAME_PTR) {
-      /* Our service instance requested, include SRV & TXT
-       * if they are already not requested. */
-      if (!(outpkt->serv_replies[i] & REPLY_SERVICE_SRV)) {
-        res = mdns_add_srv_answer(outpkt, outpkt->cache_flush, mdns, service);
-        if (res != ERR_OK) {
-          goto cleanup;
-        }
-        outpkt->additional++;
-      }
-
-      if (!(outpkt->serv_replies[i] & REPLY_SERVICE_TXT)) {
-        res = mdns_add_txt_answer(outpkt, outpkt->cache_flush, service);
-        if (res != ERR_OK) {
-          goto cleanup;
-        }
-        outpkt->additional++;
-      }
-    }
-
-    /* If service instance, SRV, record or an IP address is requested,
-     * supply all addresses for the host
-     */
-    if ((outpkt->serv_replies[i] & (REPLY_SERVICE_NAME_PTR | REPLY_SERVICE_SRV)) ||
-        (outpkt->host_replies & (REPLY_HOST_A | REPLY_HOST_AAAA))) {
-#if LWIP_IPV6
-      if (!(outpkt->host_replies & REPLY_HOST_AAAA)) {
-        int addrindex;
-        for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; addrindex++) {
-          if (ip6_addr_isvalid(netif_ip6_addr_state(outpkt->netif, addrindex))) {
-            res = mdns_add_aaaa_answer(outpkt, outpkt->cache_flush, outpkt->netif, addrindex);
-            if (res != ERR_OK) {
-              goto cleanup;
-            }
-            outpkt->additional++;
-          }
-        }
-      }
-#endif
-#if LWIP_IPV4
-      if (!(outpkt->host_replies & REPLY_HOST_A) &&
-          !ip4_addr_isany_val(*netif_ip4_addr(outpkt->netif))) {
-        res = mdns_add_a_answer(outpkt, outpkt->cache_flush, outpkt->netif);
-        if (res != ERR_OK) {
-          goto cleanup;
-        }
-        outpkt->additional++;
-      }
-#endif
-    }
-  }
-
-  if (outpkt->pbuf) {
-    const ip_addr_t *mcast_destaddr;
-    struct dns_hdr hdr;
-
-    /* Write header */
-    memset(&hdr, 0, sizeof(hdr));
-    hdr.flags1 = flags;
-    hdr.numquestions = lwip_htons(outpkt->questions);
-    hdr.numanswers = lwip_htons(outpkt->answers);
-    hdr.numauthrr = lwip_htons(outpkt->authoritative);
-    hdr.numextrarr = lwip_htons(outpkt->additional);
-    hdr.id = lwip_htons(outpkt->tx_id);
-    pbuf_take(outpkt->pbuf, &hdr, sizeof(hdr));
-
-    /* Shrink packet */
-    pbuf_realloc(outpkt->pbuf, outpkt->write_offset);
-
-    if (IP_IS_V6_VAL(outpkt->dest_addr)) {
-#if LWIP_IPV6
-      mcast_destaddr = &v6group;
-#endif
-    } else {
-#if LWIP_IPV4
-      mcast_destaddr = &v4group;
-#endif
-    }
-    /* Send created packet */
-    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Sending packet, len=%d, unicast=%d\n", outpkt->write_offset, outpkt->unicast_reply));
-    if (outpkt->unicast_reply) {
-      res = udp_sendto_if(mdns_pcb, outpkt->pbuf, &outpkt->dest_addr, outpkt->dest_port, outpkt->netif);
-    } else {
-      res = udp_sendto_if(mdns_pcb, outpkt->pbuf, mcast_destaddr, LWIP_IANA_PORT_MDNS, outpkt->netif);
-    }
-  }
-
-cleanup:
-  if (outpkt->pbuf) {
-    pbuf_free(outpkt->pbuf);
-    outpkt->pbuf = NULL;
-  }
-  return res;
-}
-
 /**
  * Send unsolicited answer containing all our known data
  * @param netif The network interface to send on
@@ -1518,12 +525,11 @@
 static void
 mdns_announce(struct netif *netif, const ip_addr_t *destination)
 {
-  struct mdns_outpacket announce;
+  struct mdns_outmsg announce;
   int i;
   struct mdns_host *mdns = NETIF_TO_HOST(netif);
 
   memset(&announce, 0, sizeof(announce));
-  announce.netif = netif;
   announce.cache_flush = 1;
 #if LWIP_IPV4
   if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {
@@ -1549,32 +555,530 @@
 
   announce.dest_port = LWIP_IANA_PORT_MDNS;
   SMEMCPY(&announce.dest_addr, destination, sizeof(announce.dest_addr));
-  mdns_send_outpacket(&announce, DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE);
+  announce.flags = DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE;
+  mdns_send_outpacket(&announce, netif);
 }
 
 /**
- * Handle question MDNS packet
- * 1. Parse all questions and set bits what answers to send
- * 2. Clear pending answers if known answers are supplied
- * 3. Put chosen answers in new packet and send as reply
+ * Perform lexicographical comparison to define the lexicographical order of the
+ * records.
+ *
+ * @param pkt_a   first packet (needed for rr data)
+ * @param pkt_b   second packet (needed for rr data)
+ * @param ans_a   first rr
+ * @param ans_b   second rr
+ * @param result  pointer to save result in ->  MDNS_LEXICOGRAPHICAL_EQUAL,
+ *                MDNS_LEXICOGRAPHICAL_LATER or MDNS_LEXICOGRAPHICAL_EARLIER.
+ * @return err_t  ERR_OK if result is good, ERR_VAL if domain decompression failed.
  */
-static void
-mdns_handle_question(struct mdns_packet *pkt)
+static err_t
+mdns_lexicographical_comparison(struct mdns_packet *pkt_a, struct mdns_packet *pkt_b,
+                                struct mdns_answer *ans_a, struct mdns_answer *ans_b,
+                                u8_t *result)
 {
-  struct mdns_service *service;
-  struct mdns_outpacket reply;
-  int replies = 0;
-  int i;
-  err_t res;
-  struct mdns_host *mdns = NETIF_TO_HOST(pkt->netif);
+  int len, i;
+  u8_t a_rd, b_rd;
+  u16_t res;
+  struct mdns_domain domain_a, domain_b;
 
-  if (mdns->probing_state != MDNS_PROBING_COMPLETE) {
-    /* Don't answer questions until we've verified our domains via probing */
-    /* @todo we should check incoming questions during probing for tiebreaking */
-    return;
+  /* Compare classes */
+  if (ans_a->info.klass != ans_b->info.klass) {
+    if (ans_a->info.klass > ans_b->info.klass) {
+      *result = MDNS_LEXICOGRAPHICAL_LATER;
+      return ERR_OK;
+    }
+    else {
+      *result = MDNS_LEXICOGRAPHICAL_EARLIER;
+      return ERR_OK;
+    }
+  }
+  /* Compare types */
+  if (ans_a->info.type != ans_b->info.type) {
+    if (ans_a->info.type > ans_b->info.type) {
+      *result = MDNS_LEXICOGRAPHICAL_LATER;
+      return ERR_OK;
+    }
+    else {
+      *result = MDNS_LEXICOGRAPHICAL_EARLIER;
+      return ERR_OK;
+    }
   }
 
-  mdns_init_outpacket(&reply, pkt);
+  /* Compare rr data section
+   * Name compression:
+   * We have 4 different RR types in our authoritative section (if IPv4 and IPv6 is enabled): A,
+   * AAAA, SRV and TXT. Only one of the 4 can be subject to name compression in the rdata, the SRV
+   * record. As stated in the RFC6762 section 8.2: the names must be uncompressed before comparison.
+   * We only need to take the SRV record into account. It's the only one that in a comparison with
+   * compressed data could lead to rdata comparison. Others will already stop after the type
+   * comparison. So if we get passed the class and type comparison we need to check if the
+   * comparison contains an SRV record. If so, we need a different comparison method.
+   */
+
+  /* The answers do not contain an SRV record */
+  if (ans_a->info.type != DNS_RRTYPE_SRV && ans_b->info.type != DNS_RRTYPE_SRV) {
+    len = LWIP_MIN(ans_a->rd_length, ans_b->rd_length);
+    for (i = 0; i < len; i++) {
+      a_rd = pbuf_get_at(pkt_a->pbuf, (u16_t)(ans_a->rd_offset + i));
+      b_rd = pbuf_get_at(pkt_b->pbuf, (u16_t)(ans_b->rd_offset + i));
+      if (a_rd != b_rd) {
+        if (a_rd > b_rd) {
+          *result = MDNS_LEXICOGRAPHICAL_LATER;
+          return ERR_OK;
+        }
+        else {
+          *result = MDNS_LEXICOGRAPHICAL_EARLIER;
+          return ERR_OK;
+        }
+      }
+    }
+    /* If the overlapping data is the same, compare the length */
+    if (ans_a->rd_length != ans_b->rd_length) {
+      if (ans_a->rd_length > ans_b->rd_length) {
+        *result = MDNS_LEXICOGRAPHICAL_LATER;
+        return ERR_OK;
+      }
+      else {
+        *result = MDNS_LEXICOGRAPHICAL_EARLIER;
+        return ERR_OK;
+      }
+    }
+  }
+  /* Because the types are guaranteed equal here, we know they are both SRV RRs */
+  else {
+    /* We will first compare the priority, weight and port */
+    for (i = 0; i < 6; i++) {
+      a_rd = pbuf_get_at(pkt_a->pbuf, (u16_t)(ans_a->rd_offset + i));
+      b_rd = pbuf_get_at(pkt_b->pbuf, (u16_t)(ans_b->rd_offset + i));
+      if (a_rd != b_rd) {
+        if (a_rd > b_rd) {
+          *result = MDNS_LEXICOGRAPHICAL_LATER;
+          return ERR_OK;
+        }
+        else {
+          *result = MDNS_LEXICOGRAPHICAL_EARLIER;
+          return ERR_OK;
+        }
+      }
+    }
+    /* Decompress names if compressed and save in domain_a or domain_b */
+    res = mdns_readname(pkt_a->pbuf, ans_a->rd_offset + 6, &domain_a);
+    if (res == MDNS_READNAME_ERROR) {
+      return ERR_VAL;
+    }
+    res = mdns_readname(pkt_b->pbuf, ans_b->rd_offset + 6, &domain_b);
+    if (res == MDNS_READNAME_ERROR) {
+      return ERR_VAL;
+    }
+    LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: domain a: len = %d, name = ", domain_a.name[0]));
+    mdns_domain_debug_print(&domain_a);
+    LWIP_DEBUGF(MDNS_DEBUG, ("\n"));
+    LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: domain b: len = %d, name = ", domain_b.name[0]));
+    mdns_domain_debug_print(&domain_b);
+    LWIP_DEBUGF(MDNS_DEBUG, ("\n"));
+    /* Compare names pairwise */
+    len = LWIP_MIN(domain_a.length, domain_b.length);
+    for (i = 0; i < len; i++) {
+      if (domain_a.name[i] != domain_b.name[i]) {
+        if (domain_a.name[i] > domain_b.name[i]) {
+          *result = MDNS_LEXICOGRAPHICAL_LATER;
+          return ERR_OK;
+        }
+        else {
+          *result = MDNS_LEXICOGRAPHICAL_EARLIER;
+          return ERR_OK;
+        }
+      }
+    }
+    /* If the overlapping data is the same, compare the length */
+    if (domain_a.length != domain_b.length) {
+      if (domain_a.length > domain_b.length) {
+        *result = MDNS_LEXICOGRAPHICAL_LATER;
+        return ERR_OK;
+      }
+      else {
+        *result = MDNS_LEXICOGRAPHICAL_EARLIER;
+        return ERR_OK;
+      }
+    }
+  }
+  /* They are exactly the same */
+  *result = MDNS_LEXICOGRAPHICAL_EQUAL;
+  return ERR_OK;
+}
+
+/**
+ * Clear authoritative answer list
+ *
+ * @param a_list  answer list to clear
+ */
+static void
+mdns_init_answer_list(struct mdns_answer_list *a_list)
+{
+  int i;
+  a_list->size = 0;
+  for(i = 0; i < MDNS_PROBE_TIEBREAK_MAX_ANSWERS; i++) {
+    a_list->offset[i] = 0;
+  }
+}
+
+/**
+ * Pushes the offset of the answer on a lexicographically later sorted list.
+ * We use a simple insertion sort because most of the time we are only sorting
+ * two items. The answers are sorted from the smallest to the largest.
+ *
+ * @param a_list      Answer list to which to add the answer
+ * @param pkt         Packet where answer originated
+ * @param new_offset  Offset of the new answer in the packet
+ * @param new_answer  The new answer
+ * @return err_t ERR_MEM if list is full
+ */
+static err_t
+mdns_push_answer_to_sorted_list(struct mdns_answer_list *a_list,
+                                struct mdns_packet *pkt,
+                                u16_t new_offset,
+                                struct mdns_answer *new_answer)
+{
+  int i;
+  struct mdns_answer a;
+  int pos = a_list->size;
+  err_t res = ERR_OK;
+  u8_t result;
+  u16_t num_left = pkt->authoritative;
+  u16_t parse_offset = pkt->parse_offset;
+
+  /* Check size */
+  if ((a_list->size + 1) >= MDNS_PROBE_TIEBREAK_MAX_ANSWERS) {
+    return ERR_MEM;
+  }
+  /* Search location and open a location */
+  for (i = 0; i < a_list->size; i++) {
+    /* Read answers already in the list from pkt */
+    pkt->parse_offset = a_list->offset[i];
+    res = mdns_read_answer(pkt, &a, &num_left);
+    if (res != ERR_OK) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse answer, skipping probe packet\n"));
+      return res;
+    }
+    /* Compare them with the new answer to find it's place */
+    res = mdns_lexicographical_comparison(pkt, pkt, &a, new_answer, &result);
+    if (res != ERR_OK) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to compare answers, skipping probe packet\n"));
+      return res;
+    }
+    if (result == MDNS_LEXICOGRAPHICAL_LATER) {
+      int j;
+      pos = i;
+      for (j = (a_list->size + 1); j>i; j--) {
+        a_list->offset[j] = a_list->offset[j-1];
+      }
+      break;
+    }
+  }
+  /* Insert new value */
+  a_list->offset[pos] = new_offset;
+  a_list->size++;
+  /* Reset parse offset for further evaluation */
+  pkt->parse_offset = parse_offset;
+  return res;
+}
+
+/**
+ * Check if the given answer answers the give question
+ *
+ * @param q     query to find answer for
+ * @param a     answer to given query
+ * @return      1 it a answers q, 0 if not
+ */
+static u8_t
+mdns_is_answer_to_question(struct mdns_question *q, struct mdns_answer *a)
+{
+  if (q->info.type == DNS_RRTYPE_ANY || q->info.type == a->info.type) {
+    /* The types match or question type is any */
+    if (mdns_domain_eq(&q->info.domain, &a->info.domain)) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+/**
+ * Converts the output packet to the input packet format for probe tiebreaking
+ *
+ * @param inpkt   destination packet for conversion
+ * @param outpkt  source packet for conversion
+ */
+static void
+mdns_convert_out_to_in_pkt(struct mdns_packet *inpkt, struct mdns_outpacket *outpkt)
+{
+  inpkt->pbuf = outpkt->pbuf;
+  inpkt->parse_offset = SIZEOF_DNS_HDR;
+
+  inpkt->questions = inpkt->questions_left = outpkt->questions;
+  inpkt->answers = inpkt->answers_left = outpkt->answers;
+  inpkt->authoritative = inpkt->authoritative_left = outpkt->authoritative;
+  inpkt->additional = inpkt->additional_left = outpkt->additional;
+}
+
+/**
+ * Debug print to print the answer part that is lexicographically compared
+ *
+ * @param pkt Packet where answer originated
+ * @param a   The answer to print
+ */
+static void
+mdns_debug_print_answer(struct mdns_packet *pkt, struct mdns_answer *a)
+{
+#ifdef LWIP_DEBUG
+  /* Arbitrarily chose 200 -> don't want to see more then that. It's only
+   * for debug so not that important. */
+  char string[200];
+  int i;
+  int pos;
+
+  pos = snprintf(string, sizeof(string), "Type = %2d, class = %1d, rdata = ", a->info.type, a->info.klass);
+  for (i = 0; ((i < a->rd_length) && ((pos + 4*i) < 195)) ; i++) {
+    snprintf(&string[pos + 4*i], 5, "%3d ", (u8_t)pbuf_get_at(pkt->pbuf, (u16_t)(a->rd_offset + i)));
+  }
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: %s\n", string));
+#else
+  LWIP_UNUSED_ARG(pkt);
+  LWIP_UNUSED_ARG(a);
+#endif
+}
+
+/**
+ * Perform probe tiebreaking according to RFC6762 section 8.2
+ *
+ * @param netif network interface of incoming packet
+ * @param pkt   incoming packet
+ */
+static void
+mdns_handle_probe_tiebreaking(struct netif *netif, struct mdns_packet *pkt)
+{
+  struct mdns_question pkt_q, my_q, q_dummy;
+  struct mdns_answer pkt_a, my_a;
+  struct mdns_outmsg myprobe_msg;
+  struct mdns_outpacket myprobe_outpkt;
+  struct mdns_packet myprobe_inpkt;
+  struct mdns_answer_list pkt_a_list, my_a_list;
+  u16_t save_parse_offset;
+  u16_t pkt_parse_offset, myprobe_parse_offset, myprobe_questions_left;
+  err_t res;
+  u8_t match, result;
+  int min, i;
+
+  /* Generate probe packet to perform comparison.
+   * This is a lot of calculation at this stage without any pre calculation
+   * needed. It should be evaluated if this is the best approach.
+   */
+  mdns_define_probe_rrs_to_send(netif, &myprobe_msg);
+  memset(&myprobe_outpkt, 0, sizeof(myprobe_outpkt));
+  memset(&myprobe_inpkt, 0, sizeof(myprobe_inpkt));
+  res = mdns_create_outpacket(netif, &myprobe_msg, &myprobe_outpkt);
+  if (res != ERR_OK) {
+    goto cleanup;
+  }
+  mdns_convert_out_to_in_pkt(&myprobe_inpkt, &myprobe_outpkt);
+
+  /* Loop over all our probes to search for matches */
+  while (myprobe_inpkt.questions_left) {
+    /* Read one of our probe questions to check if pkt contains same question */
+    res = mdns_read_question(&myprobe_inpkt, &my_q);
+    if (res != ERR_OK) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse question, skipping probe packet\n"));
+      goto cleanup;
+    }
+    /* Remember parse offsets so we can restart the search for the next question */
+    pkt_parse_offset = pkt->parse_offset;
+    myprobe_parse_offset = myprobe_inpkt.parse_offset;
+    /* Remember questions left of our probe packet */
+    myprobe_questions_left = myprobe_inpkt.questions_left;
+    /* Reset match flag */
+    match = 0;
+    /* Search for a matching probe in the incoming packet */
+    while (pkt->questions_left) {
+      /* Read probe questions one by one */
+      res = mdns_read_question(pkt, &pkt_q);
+      if (res != ERR_OK) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse question, skipping probe packet\n"));
+        goto cleanup;
+      }
+      /* Stop evaluating if the class is not supported */
+      if (pkt_q.info.klass != DNS_RRCLASS_IN && pkt_q.info.klass != DNS_RRCLASS_ANY) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: question class not supported, skipping probe packet\n"));
+        goto cleanup;
+      }
+      /* We probe for type any, so we do not have to compare types */
+      /* Compare if we are probing for the same domain */
+      if (mdns_domain_eq(&pkt_q.info.domain, &my_q.info.domain)) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: We are probing for the same rr\n"));
+        match = 1;
+        break;
+      }
+    }
+    /* When matched start evaluating the authoritative section */
+    if (match) {
+      /* Ignore all following questions to be able to get to the authoritative answers */
+      while (pkt->questions_left) {
+        res = mdns_read_question(pkt, &q_dummy);
+        if (res != ERR_OK) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse question, skipping probe packet\n"));
+          goto cleanup;
+        }
+      }
+      while (myprobe_inpkt.questions_left) {
+        res = mdns_read_question(&myprobe_inpkt, &q_dummy);
+        if (res != ERR_OK) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse question, skipping probe packet\n"));
+          goto cleanup;
+        }
+      }
+
+      /* Extract and sort our authoritative answers that answer our question */
+      mdns_init_answer_list(&my_a_list);
+      while(myprobe_inpkt.authoritative_left) {
+        save_parse_offset = myprobe_inpkt.parse_offset;
+        res = mdns_read_answer(&myprobe_inpkt, &my_a, &myprobe_inpkt.authoritative_left);
+        if (res != ERR_OK) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse answer, skipping probe packet\n"));
+          goto cleanup;
+        }
+        if (mdns_is_answer_to_question(&my_q, &my_a)) {
+          /* Add to list */
+          res = mdns_push_answer_to_sorted_list(&my_a_list, &myprobe_inpkt, save_parse_offset, &my_a);
+          if (res != ERR_OK) {
+            LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to add answer, skipping probe packet\n"));
+            goto cleanup;
+          }
+        }
+      }
+      /* Extract and sort the packets authoritative answers that answer the
+         question */
+      mdns_init_answer_list(&pkt_a_list);
+      while(pkt->authoritative_left) {
+        save_parse_offset = pkt->parse_offset;
+        res = mdns_read_answer(pkt, &pkt_a, &pkt->authoritative_left);
+        if (res != ERR_OK) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse answer, skipping probe packet\n"));
+          goto cleanup;
+        }
+        if (mdns_is_answer_to_question(&my_q, &pkt_a)) {
+          /* Add to list */
+          res = mdns_push_answer_to_sorted_list(&pkt_a_list, pkt, save_parse_offset, &pkt_a);
+          if (res != ERR_OK) {
+            LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to add answer, skipping probe packet\n"));
+            goto cleanup;
+          }
+        }
+      }
+
+      /* Reinitiate authoritative left */
+      myprobe_inpkt.authoritative_left = myprobe_inpkt.authoritative;
+      pkt->authoritative_left = pkt->authoritative;
+
+      /* Compare pairwise.
+       *  - lexicographically later? -> we win, ignore the packet.
+       *  - lexicographically earlier? -> we loose, wait one second and retry.
+       *  - lexicographically equal? -> no conflict, check other probes.
+       */
+      min = LWIP_MIN(my_a_list.size, pkt_a_list.size);
+      for (i = 0; i < min; i++) {
+        /* Get answer of our own list */
+        myprobe_inpkt.parse_offset = my_a_list.offset[i];
+        res = mdns_read_answer(&myprobe_inpkt, &my_a, &myprobe_inpkt.authoritative_left);
+        if (res != ERR_OK) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse answer, skipping probe packet\n"));
+          goto cleanup;
+        }
+        /* Get answer of the packets list  */
+        pkt->parse_offset = pkt_a_list.offset[i];
+        res = mdns_read_answer(pkt, &pkt_a, &pkt->authoritative_left);
+        if (res != ERR_OK) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse answer, skipping probe packet\n"));
+          goto cleanup;
+        }
+        /* Print both answers for debugging */
+        mdns_debug_print_answer(pkt, &pkt_a);
+        mdns_debug_print_answer(&myprobe_inpkt, &my_a);
+        /* Define the winner */
+        res = mdns_lexicographical_comparison(&myprobe_inpkt, pkt, &my_a, &pkt_a, &result);
+        if (res != ERR_OK) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to compare answers, skipping probe packet\n"));
+          goto cleanup;
+        }
+        if (result == MDNS_LEXICOGRAPHICAL_LATER) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: we win, we are lexicographically later\n"));
+          goto cleanup;
+        }
+        else if (result == MDNS_LEXICOGRAPHICAL_EARLIER) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: we loose, we are lexicographically earlier. 1s timeout started\n"));
+          /* Increase the number of conflicts occurred */
+          mdns_conflict_save_time(netif);
+          /* then restart with 1s delay */
+          mdns_resp_restart_delay(netif, MDNS_PROBE_TIEBREAK_CONFLICT_DELAY_MS);
+          goto cleanup;
+        }
+        else {
+          LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: lexicographically equal, so no conclusion\n"));
+        }
+      }
+      /* All compared RR were equal, otherwise we would not be here
+       * -> check if one of both have more answers to the question */
+      if (my_a_list.size != pkt_a_list.size) {
+        if (my_a_list.size > pkt_a_list.size) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: we win, we have more records answering the probe\n"));
+          goto cleanup;
+        }
+        else {
+          LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: we loose, we have less records. 1s timeout started\n"));
+          /* Increase the number of conflicts occurred */
+          mdns_conflict_save_time(netif);
+          /* then restart with 1s delay */
+          mdns_resp_restart_delay(netif, MDNS_PROBE_TIEBREAK_CONFLICT_DELAY_MS);
+          goto cleanup;
+        }
+      }
+      else {
+        /* There is no conflict on this probe, both devices have the same data
+         * in the authoritative section. We should still check the other probes
+         * for conflicts. */
+        LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: no conflict, all records answering the probe are equal\n"));
+      }
+    }
+    /* Evaluate other probes if any. */
+    /* Reinitiate parse offsets */
+    pkt->parse_offset = pkt_parse_offset;
+    myprobe_inpkt.parse_offset = myprobe_parse_offset;
+    /* Reinitiate questions_left and authoritative_left */
+    pkt->questions_left = pkt->questions;
+    pkt->authoritative_left = pkt->authoritative;
+    myprobe_inpkt.questions_left = myprobe_questions_left;
+    myprobe_inpkt.authoritative_left = myprobe_inpkt.authoritative;
+  }
+
+cleanup:
+  if (myprobe_inpkt.pbuf != NULL) {
+    pbuf_free(myprobe_inpkt.pbuf);
+  }
+}
+
+/**
+ * Check the incoming packet and parse all questions
+ *
+ * @param netif network interface of incoming packet
+ * @param pkt   incoming packet
+ * @param reply outgoing message
+ * @return err_t
+ */
+static err_t
+mdns_parse_pkt_questions(struct netif *netif, struct mdns_packet *pkt,
+                         struct mdns_outmsg *reply)
+{
+  struct mdns_host *mdns = NETIF_TO_HOST(netif);
+  struct mdns_service *service;
+  int i;
+  err_t res;
 
   while (pkt->questions_left) {
     struct mdns_question q;
@@ -1582,7 +1086,7 @@
     res = mdns_read_question(pkt, &q);
     if (res != ERR_OK) {
       LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse question, skipping query packet\n"));
-      return;
+      return res;
     }
 
     LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Query for domain "));
@@ -1590,42 +1094,51 @@
     LWIP_DEBUGF(MDNS_DEBUG, (" type %d class %d\n", q.info.type, q.info.klass));
 
     if (q.unicast) {
-      /* Reply unicast if any question is unicast */
-      reply.unicast_reply = 1;
+      /* Reply unicast if it is requested in the question */
+      reply->unicast_reply_requested = 1;
     }
 
-    reply.host_replies |= check_host(pkt->netif, &q.info, &reply.host_reverse_v6_replies);
-    replies |= reply.host_replies;
+    reply->host_replies |= check_host(netif, &q.info, &reply->host_reverse_v6_replies);
 
     for (i = 0; i < MDNS_MAX_SERVICES; i++) {
       service = mdns->services[i];
       if (!service) {
         continue;
       }
-      reply.serv_replies[i] |= check_service(service, &q.info);
-      replies |= reply.serv_replies[i];
-    }
-
-    if (replies && reply.legacy_query) {
-      /* Add question to reply packet (legacy packet only has 1 question) */
-      res = mdns_add_question(&reply, &q.info.domain, q.info.type, q.info.klass, 0);
-      reply.questions = 1;
-      if (res != ERR_OK) {
-        goto cleanup;
-      }
+      reply->serv_replies[i] |= check_service(service, &q.info);
     }
   }
 
-  /* Handle known answers */
+  return ERR_OK;
+}
+
+/**
+ * Check the incoming packet and parse all (known) answers
+ *
+ * @param netif network interface of incoming packet
+ * @param pkt   incoming packet
+ * @param reply outgoing message
+ * @return err_t
+ */
+static err_t
+mdns_parse_pkt_known_answers(struct netif *netif, struct mdns_packet *pkt,
+                             struct mdns_outmsg *reply)
+{
+  struct mdns_host *mdns = NETIF_TO_HOST(netif);
+  struct mdns_service *service;
+  int i;
+  err_t res;
+
   while (pkt->answers_left) {
     struct mdns_answer ans;
     u8_t rev_v6;
     int match;
+    u32_t rr_ttl = MDNS_TTL_120;
 
-    res = mdns_read_answer(pkt, &ans);
+    res = mdns_read_answer(pkt, &ans, &pkt->answers_left);
     if (res != ERR_OK) {
       LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse answer, skipping query packet\n"));
-      goto cleanup;
+      return res;
     }
 
     LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Known answer for domain "));
@@ -1639,8 +1152,8 @@
     }
 
     rev_v6 = 0;
-    match = reply.host_replies & check_host(pkt->netif, &ans.info, &rev_v6);
-    if (match && (ans.ttl > (mdns->dns_ttl / 2))) {
+    match = reply->host_replies & check_host(netif, &ans.info, &rev_v6);
+    if (match && (ans.ttl > (rr_ttl / 2))) {
       /* The RR in the known answer matches an RR we are planning to send,
        * and the TTL is less than half gone.
        * If the payload matches we should not send that answer.
@@ -1655,15 +1168,15 @@
 #if LWIP_IPV4
           if (match & REPLY_HOST_PTR_V4) {
             LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: v4 PTR\n"));
-            reply.host_replies &= ~REPLY_HOST_PTR_V4;
+            reply->host_replies &= ~REPLY_HOST_PTR_V4;
           }
 #endif
 #if LWIP_IPV6
           if (match & REPLY_HOST_PTR_V6) {
             LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: v6 PTR\n"));
-            reply.host_reverse_v6_replies &= ~rev_v6;
-            if (reply.host_reverse_v6_replies == 0) {
-              reply.host_replies &= ~REPLY_HOST_PTR_V6;
+            reply->host_reverse_v6_replies &= ~rev_v6;
+            if (reply->host_reverse_v6_replies == 0) {
+              reply->host_replies &= ~REPLY_HOST_PTR_V6;
             }
           }
 #endif
@@ -1671,18 +1184,18 @@
       } else if (match & REPLY_HOST_A) {
 #if LWIP_IPV4
         if (ans.rd_length == sizeof(ip4_addr_t) &&
-            pbuf_memcmp(pkt->pbuf, ans.rd_offset, netif_ip4_addr(pkt->netif), ans.rd_length) == 0) {
+            pbuf_memcmp(pkt->pbuf, ans.rd_offset, netif_ip4_addr(netif), ans.rd_length) == 0) {
           LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: A\n"));
-          reply.host_replies &= ~REPLY_HOST_A;
+          reply->host_replies &= ~REPLY_HOST_A;
         }
 #endif
       } else if (match & REPLY_HOST_AAAA) {
 #if LWIP_IPV6
         if (ans.rd_length == sizeof(ip6_addr_p_t) &&
             /* TODO this clears all AAAA responses if first addr is set as known */
-            pbuf_memcmp(pkt->pbuf, ans.rd_offset, netif_ip6_addr(pkt->netif, 0), ans.rd_length) == 0) {
+            pbuf_memcmp(pkt->pbuf, ans.rd_offset, netif_ip6_addr(netif, 0), ans.rd_length) == 0) {
           LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: AAAA\n"));
-          reply.host_replies &= ~REPLY_HOST_AAAA;
+          reply->host_replies &= ~REPLY_HOST_AAAA;
         }
 #endif
       }
@@ -1693,8 +1206,11 @@
       if (!service) {
         continue;
       }
-      match = reply.serv_replies[i] & check_service(service, &ans.info);
-      if (match && (ans.ttl > (service->dns_ttl / 2))) {
+      match = reply->serv_replies[i] & check_service(service, &ans.info);
+      if (match & REPLY_SERVICE_TYPE_PTR) {
+        rr_ttl = MDNS_TTL_4500;
+      }
+      if (match && (ans.ttl > (rr_ttl / 2))) {
         /* The RR in the known answer matches an RR we are planning to send,
          * and the TTL is less than half gone.
          * If the payload matches we should not send that answer.
@@ -1709,14 +1225,14 @@
               res = mdns_build_service_domain(&my_ans, service, 0);
               if (res == ERR_OK && mdns_domain_eq(&known_ans, &my_ans)) {
                 LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: service type PTR\n"));
-                reply.serv_replies[i] &= ~REPLY_SERVICE_TYPE_PTR;
+                reply->serv_replies[i] &= ~REPLY_SERVICE_TYPE_PTR;
               }
             }
             if (match & REPLY_SERVICE_NAME_PTR) {
               res = mdns_build_service_domain(&my_ans, service, 1);
               if (res == ERR_OK && mdns_domain_eq(&known_ans, &my_ans)) {
                 LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: service name PTR\n"));
-                reply.serv_replies[i] &= ~REPLY_SERVICE_NAME_PTR;
+                reply->serv_replies[i] &= ~REPLY_SERVICE_NAME_PTR;
               }
             }
           }
@@ -1751,56 +1267,595 @@
               break;
             }
             LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: SRV\n"));
-            reply.serv_replies[i] &= ~REPLY_SERVICE_SRV;
+            reply->serv_replies[i] &= ~REPLY_SERVICE_SRV;
           } while (0);
         } else if (match & REPLY_SERVICE_TXT) {
           mdns_prepare_txtdata(service);
           if (service->txtdata.length == ans.rd_length &&
               pbuf_memcmp(pkt->pbuf, ans.rd_offset, service->txtdata.name, ans.rd_length) == 0) {
             LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: TXT\n"));
-            reply.serv_replies[i] &= ~REPLY_SERVICE_TXT;
+            reply->serv_replies[i] &= ~REPLY_SERVICE_TXT;
           }
         }
       }
     }
   }
 
-  mdns_send_outpacket(&reply, DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE);
+  return ERR_OK;
+}
 
-cleanup:
-  if (reply.pbuf) {
-    /* This should only happen if we fail to alloc/write question for legacy query */
-    pbuf_free(reply.pbuf);
-    reply.pbuf = NULL;
+/**
+ * Check the incoming packet and parse all authoritative answers to see if the
+ * query is a probe query.
+ *
+ * @param netif network interface of incoming packet
+ * @param pkt   incoming packet
+ * @param reply outgoing message
+ * @return err_t
+ */
+static err_t
+mdns_parse_pkt_authoritative_answers(struct netif *netif, struct mdns_packet *pkt,
+                                     struct mdns_outmsg *reply)
+{
+  struct mdns_host *mdns = NETIF_TO_HOST(netif);
+  struct mdns_service *service;
+  int i;
+  err_t res;
+
+  while (pkt->authoritative_left) {
+    struct mdns_answer ans;
+    u8_t rev_v6;
+    int match;
+
+    res = mdns_read_answer(pkt, &ans, &pkt->authoritative_left);
+    if (res != ERR_OK) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse answer, skipping query packet\n"));
+      return res;
+    }
+
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Authoritative answer for domain "));
+    mdns_domain_debug_print(&ans.info.domain);
+    LWIP_DEBUGF(MDNS_DEBUG, (" type %d class %d\n", ans.info.type, ans.info.klass));
+
+
+    if (ans.info.type == DNS_RRTYPE_ANY || ans.info.klass == DNS_RRCLASS_ANY) {
+      /* Skip known answers for ANY type & class */
+      continue;
+    }
+
+    rev_v6 = 0;
+    match = reply->host_replies & check_host(netif, &ans.info, &rev_v6);
+    if (match) {
+      reply->probe_query_recv = 1;
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Probe for own host info received\n"));
+    }
+
+    for (i = 0; i < MDNS_MAX_SERVICES; i++) {
+      service = mdns->services[i];
+      if (!service) {
+        continue;
+      }
+      match = reply->serv_replies[i] & check_service(service, &ans.info);
+
+      if (match) {
+        reply->probe_query_recv = 1;
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Probe for own service info received\n"));
+      }
+    }
+  }
+
+  return ERR_OK;
+}
+
+/**
+ * Add / copy message to delaying message buffer.
+ *
+ * @param dest destination msg struct
+ * @param src  source msg struct
+ */
+static void
+mdns_add_msg_to_delayed(struct mdns_outmsg *dest, struct mdns_outmsg *src)
+{
+  int i;
+
+  dest->host_questions |= src->host_questions;
+  dest->host_replies |= src->host_replies;
+  dest->host_reverse_v6_replies |= src->host_reverse_v6_replies;
+  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
+    dest->serv_questions[i] |= src->serv_questions[i];
+    dest->serv_replies[i] |= src->serv_replies[i];
+  }
+
+  dest->flags = src->flags;
+  dest->cache_flush = src->cache_flush;
+  dest->tx_id = src->tx_id;
+  dest->legacy_query = src->legacy_query;
+}
+
+/**
+ * Handle question MDNS packet
+ * - Perform probe tiebreaking when in probing state
+ * - Parse all questions and set bits what answers to send
+ * - Clear pending answers if known answers are supplied
+ * - Define which type of answer is requested
+ * - Send out packet or put it on hold until after random time
+ *
+ * @param pkt   incoming packet (in stack)
+ * @param netif network interface of incoming packet
+ */
+static void
+mdns_handle_question(struct mdns_packet *pkt, struct netif *netif)
+{
+  struct mdns_host *mdns = NETIF_TO_HOST(netif);
+  struct mdns_outmsg reply;
+  u8_t rrs_to_send;
+  u8_t shared_answer = 0;
+  u8_t delay_response = 1;
+  u8_t send_unicast = 0;
+  u8_t listen_to_QU_bit = 0;
+  int i;
+  err_t res;
+
+  if ((mdns->state == MDNS_STATE_PROBING) ||
+      (mdns->state == MDNS_STATE_ANNOUNCE_WAIT)) {
+    /* Probe Tiebreaking */
+    /* Check if packet is a probe message */
+    if ((pkt->questions > 0) && (pkt->answers == 0) &&
+        (pkt->authoritative > 0) && (pkt->additional == 0)) {
+      /* This should be a probe message -> call probe handler */
+      mdns_handle_probe_tiebreaking(netif, pkt);
+    }
+  }
+
+  if ((mdns->state != MDNS_STATE_COMPLETE) &&
+      (mdns->state != MDNS_STATE_ANNOUNCING)) {
+    /* Don't answer questions until we've verified our domains via probing */
+    /* @todo we should check incoming questions during probing for tiebreaking */
+    return;
+  }
+
+  memset(&reply, 0, sizeof(struct mdns_outmsg));
+
+  /* Parse question */
+  res = mdns_parse_pkt_questions(netif, pkt, &reply);
+  if (res != ERR_OK) {
+    return;
+  }
+  /* Parse answers -> count as known answers because it's a question */
+  res = mdns_parse_pkt_known_answers(netif, pkt, &reply);
+  if (res != ERR_OK) {
+    return;
+  }
+  if (pkt->next_answer) {
+    /* Also parse known-answers from additional packets */
+    struct mdns_packet *pkta = pkt->next_answer;
+    while (pkta) {
+      res = mdns_parse_pkt_known_answers(netif, pkta, &reply);
+      if (res != ERR_OK) {
+        return;
+      }
+      pkta = pkta->next_answer;
+    }
+  }
+  /* Parse authoritative answers -> probing */
+  /* If it's a probe query, we need to directly answer via unicast. */
+  res = mdns_parse_pkt_authoritative_answers(netif, pkt, &reply);
+  if (res != ERR_OK) {
+    return;
+  }
+  /* Ignore additional answers -> do not have any need for them at the moment */
+  if(pkt->additional) {
+    LWIP_DEBUGF(MDNS_DEBUG,
+      ("MDNS: Query contains additional answers -> they are discarded\n"));
+  }
+
+  /* Any replies on question? */
+  rrs_to_send = reply.host_replies | reply.host_questions;
+  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
+    rrs_to_send |= reply.serv_replies[i] | reply.serv_questions[i];
+  }
+
+  if (!rrs_to_send) {
+    /* This case is most common */
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Nothing to answer\n"));
+    return;
+  }
+
+  reply.flags =  DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE;
+
+  /* Detect if it's a legacy querier asking the question
+   * How to detect legacy DNS query? (RFC6762 section 6.7)
+   *  - source port != 5353
+   *  - a legacy query can only contain 1 question
+   */
+  if (pkt->source_port != LWIP_IANA_PORT_MDNS) {
+    if (pkt->questions == 1) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: request from legacy querier\n"));
+      reply.legacy_query = 1;
+      reply.tx_id = pkt->tx_id;
+      reply.cache_flush = 0;
+    }
+    else {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: ignore query if (src UDP port != 5353) && (!= legacy query)\n"));
+      return;
+    }
+  }
+  else {
+    reply.cache_flush = 1;
+  }
+
+  /* Delaying response. (RFC6762 section 6)
+   * Always delay the response, unicast or multicast, except when:
+   *  - Answering to a single question with a unique answer (not a probe).
+   *  - Answering to a probe query via unicast.
+   *  - Answering to a probe query via multicast if not multicasted within 250ms.
+   *
+   * unique answer? -> not if it includes service type or name ptr's
+   */
+  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
+    shared_answer |= (reply.serv_replies[i] &
+                      (REPLY_SERVICE_TYPE_PTR | REPLY_SERVICE_NAME_PTR));
+  }
+  if (   ((pkt->questions == 1) && (!shared_answer) && !reply.probe_query_recv)
+      || (reply.probe_query_recv && reply.unicast_reply_requested)) {
+    delay_response = 0;
+  }
+#if LWIP_IPV6
+  if (IP_IS_V6_VAL(pkt->source_addr) && reply.probe_query_recv
+      && !reply.unicast_reply_requested && !mdns->ipv6.multicast_probe_timeout) {
+    delay_response = 0;
+  }
+#endif
+#if LWIP_IPV4
+  if (IP_IS_V4_VAL(pkt->source_addr) && reply.probe_query_recv
+      && !reply.unicast_reply_requested && !mdns->ipv4.multicast_probe_timeout) {
+    delay_response = 0;
+  }
+#endif
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: response %s delayed\n", (delay_response ? "randomly" : "not")));
+
+  /* Unicast / multicast response:
+   * Answering to (m)DNS querier via unicast response.
+   * When:
+   *  a) Unicast reply requested && recently multicasted 1/4ttl (RFC6762 section 5.4)
+   *  b) Direct unicast query to port 5353 (RFC6762 section 5.5)
+   *  c) Reply to Legacy DNS querier (RFC6762 section 6.7)
+   *  d) A probe message is received requesting unicast (RFC6762 section 6)
+   */
+
+#if LWIP_IPV6
+  if ((IP_IS_V6_VAL(pkt->source_addr) && mdns->ipv6.multicast_timeout_25TTL)) {
+    listen_to_QU_bit = 1;
+  }
+#endif
+#if LWIP_IPV4
+  if ((IP_IS_V4_VAL(pkt->source_addr) && mdns->ipv4.multicast_timeout_25TTL)) {
+    listen_to_QU_bit = 1;
+  }
+#endif
+  if (   (reply.unicast_reply_requested && listen_to_QU_bit)
+      || pkt->recv_unicast
+      || reply.legacy_query
+      || (reply.probe_query_recv && reply.unicast_reply_requested)) {
+    send_unicast = 1;
+  }
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: send response via %s\n", (send_unicast ? "unicast" : "multicast")));
+
+  /* Send out or put on waiting list */
+  if (delay_response) {
+    if (send_unicast) {
+#if LWIP_IPV6
+      /* Add answers to IPv6 waiting list if:
+       *  - it's a IPv6 incoming packet
+       *  - no message is in it yet
+       */
+      if (IP_IS_V6_VAL(pkt->source_addr) && !mdns->ipv6.unicast_msg_in_use) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: add answers to unicast IPv6 waiting list\n"));
+        SMEMCPY(&mdns->ipv6.delayed_msg_unicast.dest_addr, &pkt->source_addr, sizeof(ip_addr_t));
+        mdns->ipv6.delayed_msg_unicast.dest_port = pkt->source_port;
+
+        mdns_add_msg_to_delayed(&mdns->ipv6.delayed_msg_unicast, &reply);
+
+        mdns_set_timeout(netif, MDNS_RESPONSE_DELAY, mdns_send_unicast_msg_delayed_ipv6,
+                         &mdns->ipv6.unicast_msg_in_use);
+      }
+#endif
+#if LWIP_IPV4
+      /* Add answers to IPv4 waiting list if:
+       *  - it's a IPv4 incoming packet
+       *  - no message is in it yet
+       */
+      if (IP_IS_V4_VAL(pkt->source_addr) && !mdns->ipv4.unicast_msg_in_use) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: add answers to unicast IPv4 waiting list\n"));
+        SMEMCPY(&mdns->ipv4.delayed_msg_unicast.dest_addr, &pkt->source_addr, sizeof(ip_addr_t));
+        mdns->ipv4.delayed_msg_unicast.dest_port = pkt->source_port;
+
+        mdns_add_msg_to_delayed(&mdns->ipv4.delayed_msg_unicast, &reply);
+
+        mdns_set_timeout(netif, MDNS_RESPONSE_DELAY, mdns_send_unicast_msg_delayed_ipv4,
+                         &mdns->ipv4.unicast_msg_in_use);
+      }
+#endif
+    }
+    else {
+#if LWIP_IPV6
+      /* Add answers to IPv6 waiting list if:
+       *  - it's a IPv6 incoming packet
+       *  - the 1 second timeout is passed (RFC6762 section 6)
+       *  - and it's not a probe packet
+       * Or if:
+       *  - it's a IPv6 incoming packet
+       *  - and it's a probe packet
+       */
+      if (IP_IS_V6_VAL(pkt->source_addr) && !mdns->ipv6.multicast_timeout
+          && !reply.probe_query_recv) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: add answers to multicast IPv6 waiting list\n"));
+
+        mdns_add_msg_to_delayed(&mdns->ipv6.delayed_msg_multicast, &reply);
+
+        mdns_set_timeout(netif, MDNS_RESPONSE_DELAY, mdns_send_multicast_msg_delayed_ipv6,
+                         &mdns->ipv6.multicast_msg_waiting);
+      }
+      else if (IP_IS_V6_VAL(pkt->source_addr) && reply.probe_query_recv) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: add answers to probe multicast IPv6 waiting list\n"));
+
+        mdns_add_msg_to_delayed(&mdns->ipv6.delayed_msg_multicast, &reply);
+
+        mdns->ipv6.multicast_msg_waiting = 1;
+      }
+#endif
+#if LWIP_IPV4
+      /* Add answers to IPv4 waiting list if:
+       *  - it's a IPv4 incoming packet
+       *  - the 1 second timeout is passed (RFC6762 section 6)
+       *  - and it's not a probe packet
+       * Or if:
+       *  - it's a IPv4 incoming packet
+       *  - and it's a probe packet
+       */
+      if (IP_IS_V4_VAL(pkt->source_addr) && !mdns->ipv4.multicast_timeout
+          && !reply.probe_query_recv) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: add answers to multicast IPv4 waiting list\n"));
+
+        mdns_add_msg_to_delayed(&mdns->ipv4.delayed_msg_multicast, &reply);
+
+        mdns_set_timeout(netif, MDNS_RESPONSE_DELAY, mdns_send_multicast_msg_delayed_ipv4,
+                         &mdns->ipv4.multicast_msg_waiting);
+      }
+      else if (IP_IS_V4_VAL(pkt->source_addr) && reply.probe_query_recv) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: add answers to probe multicast IPv4 waiting list\n"));
+
+        mdns_add_msg_to_delayed(&mdns->ipv4.delayed_msg_multicast, &reply);
+
+        mdns->ipv4.multicast_msg_waiting = 1;
+      }
+#endif
+    }
+  }
+  else {
+    if (send_unicast) {
+      /* Copy source IP/port to use when responding unicast */
+      SMEMCPY(&reply.dest_addr, &pkt->source_addr, sizeof(ip_addr_t));
+      reply.dest_port = pkt->source_port;
+      /* send answer directly via unicast */
+      res = mdns_send_outpacket(&reply, netif);
+      if (res != ERR_OK) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Unicast answer could not be send\n"));
+      }
+      else {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Unicast answer send successfully\n"));
+      }
+      return;
+    }
+    else {
+      /* Set IP/port to use when responding multicast */
+#if LWIP_IPV6
+      if (IP_IS_V6_VAL(pkt->source_addr)) {
+        if (mdns->ipv6.multicast_timeout && !reply.probe_query_recv) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: we just multicasted, ignore question\n"));
+          return;
+        }
+        SMEMCPY(&reply.dest_addr, &v6group, sizeof(ip_addr_t));
+      }
+#endif
+#if LWIP_IPV4
+      if (IP_IS_V4_VAL(pkt->source_addr)) {
+        if (mdns->ipv4.multicast_timeout && !reply.probe_query_recv) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: we just multicasted, ignore question\n"));
+          return;
+        }
+        SMEMCPY(&reply.dest_addr, &v4group, sizeof(ip_addr_t));
+      }
+#endif
+      reply.dest_port = LWIP_IANA_PORT_MDNS;
+      /* send answer directly via multicast */
+      res = mdns_send_outpacket(&reply, netif);
+      if (res != ERR_OK) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Multicast answer could not be send\n"));
+      }
+      else {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Multicast answer send successfully\n"));
+#if LWIP_IPV6
+        if (IP_IS_V6_VAL(pkt->source_addr)) {
+          mdns_start_multicast_timeouts_ipv6(netif);
+        }
+#endif
+#if LWIP_IPV4
+        if (IP_IS_V4_VAL(pkt->source_addr)) {
+          mdns_start_multicast_timeouts_ipv4(netif);
+        }
+#endif
+      }
+      return;
+    }
   }
 }
 
 /**
- * Handle response MDNS packet
- * Only prints debug for now. Will need more code to do conflict resolution.
+ * Handle truncated question MDNS packet
+ * - Called by timer
+ * - Call mdns_handle_question
+ * - Do cleanup
+ *
+ * @param arg   incoming packet (in pool)
  */
 static void
-mdns_handle_response(struct mdns_packet *pkt)
+mdns_handle_tc_question(void *arg)
 {
-  struct mdns_host* mdns = NETIF_TO_HOST(pkt->netif);
+  struct mdns_packet *pkt = (struct mdns_packet *)arg;
+  struct netif *from = netif_get_by_index(pkt->pbuf->if_idx);
+  /* timer as elapsed, now handle this question */
+  mdns_handle_question(pkt, from);
+  /* remove from pending list */
+  if (pending_tc_questions == pkt) {
+    pending_tc_questions = pkt->next_tc_question;
+  }
+  else {
+    struct mdns_packet *prev = pending_tc_questions;
+    while (prev && prev->next_tc_question != pkt) {
+      prev = prev->next_tc_question;
+    }
+    LWIP_ASSERT("pkt not found in pending_tc_questions list", prev != NULL);
+    prev->next_tc_question = pkt->next_tc_question;
+  }
+  /* free linked answers and this question */
+  while (pkt->next_answer) {
+    struct mdns_packet *ans = pkt->next_answer;
+    pkt->next_answer = ans->next_answer;
+    pbuf_free(ans->pbuf);
+    LWIP_MEMPOOL_FREE(MDNS_PKTS, ans);
+  }
+  pbuf_free(pkt->pbuf);
+  LWIP_MEMPOOL_FREE(MDNS_PKTS, pkt);
+}
+
+/**
+ * Save time when a probe conflict occurs:
+ *  - Check if we exceeded the maximum of 15 conflicts in 10seconds.
+ *
+ * @param netif network interface on which the conflict occurred.
+ */
+static void
+mdns_conflict_save_time(struct netif *netif)
+{
+  struct mdns_host* mdns = NETIF_TO_HOST(netif);
+  int i;
+  u32_t diff;
+  u8_t index2;
+
+  /* Increase the number of conflicts occurred */
+  mdns->num_conflicts++;
+  mdns->conflict_time[mdns->index] = sys_now();
+  /* Print timestamp list */
+  LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: conflict timestamp list, insert index = %d\n", mdns->index));
+  for(i = 0; i < MDNS_PROBE_MAX_CONFLICTS_BEFORE_RATE_LIMIT; i++) {
+    LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: time no. %d = %"U32_F"\n", i, mdns->conflict_time[i]));
+  }
+  /* Check if we had enough conflicts, minimum 15 */
+  if (mdns->num_conflicts >= MDNS_PROBE_MAX_CONFLICTS_BEFORE_RATE_LIMIT) {
+    /* Get the index to the oldest timestamp */
+    index2 = (mdns->index + 1) % MDNS_PROBE_MAX_CONFLICTS_BEFORE_RATE_LIMIT;
+    /* Compare the oldest vs newest time stamp */
+    diff = mdns->conflict_time[mdns->index] - mdns->conflict_time[index2];
+    /* If they are less then 10 seconds apart, initiate rate limit */
+    if (diff < MDNS_PROBE_MAX_CONFLICTS_TIME_WINDOW) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: probe rate limit enabled\n"));
+      mdns->rate_limit_activated = 1;
+    }
+  }
+  /* Increase index */
+  mdns->index = (mdns->index + 1) % MDNS_PROBE_MAX_CONFLICTS_BEFORE_RATE_LIMIT;
+}
+
+/**
+ * Handle a probe conflict:
+ *  - Check if we exceeded the maximum of 15 conflicts in 10seconds.
+ *  - Let the user know there is a conflict.
+ *
+ * @param netif network interface on which the conflict occurred.
+ * @param slot service index +1 on which the conflict occurred (0 indicate hostname conflict).
+ */
+static void
+mdns_probe_conflict(struct netif *netif, s8_t slot)
+{
+  /* Increase the number of conflicts occurred and check rate limiting */
+  mdns_conflict_save_time(netif);
+
+  /* Disable currently running probe / announce timer */
+  sys_untimeout(mdns_probe_and_announce, netif);
+
+  /* Inform the host on the conflict, if a callback is set */
+  if (mdns_name_result_cb != NULL) {
+    mdns_name_result_cb(netif, MDNS_PROBING_CONFLICT, slot);
+  }
+  /* TODO: rename and call restart if no mdns_name_result_cb was set? */
+}
+
+/**
+ * Loockup matching request for response MDNS packet
+ */
+#if LWIP_MDNS_SEARCH
+static struct mdns_request *
+mdns_lookup_request(struct mdns_rr_info *rr)
+{
+  int i;
+  /* search originating request */
+  for (i = 0; i < MDNS_MAX_REQUESTS; i++) {
+    if ((mdns_requests[i].result_fn != NULL) &&
+        (check_request(&mdns_requests[i], rr) != 0)) {
+      return &mdns_requests[i];
+    }
+  }
+  return NULL;
+}
+#endif
+
+/**
+ * Handle response MDNS packet:
+ *  - Handle responses on probe query
+ *  - Perform conflict resolution on every packet (RFC6762 section 9)
+ *
+ * @param pkt   incoming packet
+ * @param netif network interface on which packet was received
+ */
+static void
+mdns_handle_response(struct mdns_packet *pkt, struct netif *netif)
+{
+  struct mdns_host* mdns = NETIF_TO_HOST(netif);
+  u16_t total_answers_left;
+#if LWIP_MDNS_SEARCH
+  struct mdns_request *req = NULL;
+  s8_t first = 1;
+#endif
+
+  /* Ignore responses with a source port different from 5353
+   * (LWIP_IANA_PORT_MDNS) -> RFC6762 section 6 */
+  if (pkt->source_port != LWIP_IANA_PORT_MDNS) {
+    return;
+  }
 
   /* Ignore all questions */
   while (pkt->questions_left) {
     struct mdns_question q;
     err_t res;
-
     res = mdns_read_question(pkt, &q);
     if (res != ERR_OK) {
       LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse question, skipping response packet\n"));
       return;
     }
+#if LWIP_MDNS_SEARCH
+    else {
+      req = mdns_lookup_request(&q.info);
+    }
+#endif
   }
-
-  while (pkt->answers_left) {
+  /* We need to check all resource record sections: answers, authoritative and additional */
+  total_answers_left = pkt->answers_left + pkt->authoritative_left + pkt->additional_left;
+  while (total_answers_left) {
     struct mdns_answer ans;
     err_t res;
 
-    res = mdns_read_answer(pkt, &ans);
+    res = mdns_read_answer(pkt, &ans, &total_answers_left);
     if (res != ERR_OK) {
       LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Failed to parse answer, skipping response packet\n"));
       return;
@@ -1810,17 +1865,81 @@
     mdns_domain_debug_print(&ans.info.domain);
     LWIP_DEBUGF(MDNS_DEBUG, (" type %d class %d\n", ans.info.type, ans.info.klass));
 
-    /*"Apparently conflicting Multicast DNS responses received *before* the first probe packet is sent MUST
-      be silently ignored" so drop answer if we haven't started probing yet*/
-    if ((mdns->probing_state == MDNS_PROBING_ONGOING) && (mdns->probes_sent > 0)) {
+    if (ans.info.type == DNS_RRTYPE_ANY || ans.info.klass != DNS_RRCLASS_IN) {
+      /* Skip answers for ANY type or if class != IN */
+      continue;
+    }
+
+#if LWIP_MDNS_SEARCH
+    if (req && req->only_ptr) {
+      /* Need to recheck that this answer match request that match previous answer */
+      if (memcmp (req->service.name, ans.info.domain.name, req->service.length) != 0)
+        req = NULL;
+    }
+    if (!req) {
+      /* Try hard to search matching request */
+      req = mdns_lookup_request(&ans.info);
+    }
+    if (req && req->result_fn) {
+      u16_t offset;
+      struct pbuf *p;
+      int flags = (first ? MDNS_SEARCH_RESULT_FIRST : 0) |
+          (!total_answers_left ? MDNS_SEARCH_RESULT_LAST : 0);
+      if (req->only_ptr) {
+          if (ans.info.type != DNS_RRTYPE_PTR)
+              continue; /* Ignore non matching answer type */
+          flags = MDNS_SEARCH_RESULT_FIRST | MDNS_SEARCH_RESULT_LAST;
+      }
+      p = pbuf_skip(pkt->pbuf, ans.rd_offset, &offset);
+      if (p == NULL) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Malformed response packet, aborting\n"));
+        return;
+      }
+      if (ans.info.type == DNS_RRTYPE_PTR || ans.info.type == DNS_RRTYPE_SRV) {
+        /* Those RR types have compressed domain name. Must uncompress here,
+           since cannot be done without pbuf. */
+        struct {
+          u16_t values[3];        /* SRV: Prio, Weight, Port */
+          struct mdns_domain dom; /* PTR & SRV: Domain (uncompressed) */
+        } data;
+        u16_t off = (ans.info.type == DNS_RRTYPE_SRV ? 6 : 0);
+        u16_t len = mdns_readname(pkt->pbuf, ans.rd_offset + off, &data.dom);
+        if (len == MDNS_READNAME_ERROR) {
+          /* Ensure result_fn is called anyway, just copy failed domain as is */
+          data.dom.length = ans.rd_length - off;
+          memcpy(&data.dom, (const char *)p->payload + offset + off, data.dom.length);
+        }
+        /* Adjust len/off according RR type */
+        if (ans.info.type == DNS_RRTYPE_SRV) {
+          memcpy(&data, (const char *)p->payload + offset, 6);
+          len = data.dom.length + 6;
+          off = 0;
+        } else {
+          len = data.dom.length;
+          off = 6;
+        }
+        req->result_fn(&ans, (const char *)&data + off, len, flags, req->arg);
+      } else {
+        /* Direct call result_fn with varpart pointing in pbuf payload */
+        req->result_fn(&ans, (const char *)p->payload + offset, ans.rd_length, flags, req->arg);
+      }
+      first = 0;
+    }
+#endif
+
+    /* "Conflicting Multicast DNS responses received *before* the first probe
+     * packet is sent MUST be silently ignored" so drop answer if we haven't
+     * started probing yet. */
+    if ((mdns->state == MDNS_STATE_PROBING) ||
+        (mdns->state == MDNS_STATE_ANNOUNCE_WAIT)) {
       struct mdns_domain domain;
       u8_t i;
-      u8_t conflict = 0;
 
       res = mdns_build_host_domain(&domain, mdns);
       if (res == ERR_OK && mdns_domain_eq(&ans.info.domain, &domain)) {
-        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Probe response matches host domain!"));
-        conflict = 1;
+        LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Probe response matches host domain!\n"));
+        mdns_probe_conflict(netif, 0);
+        break;
       }
 
       for (i = 0; i < MDNS_MAX_SERVICES; i++) {
@@ -1830,19 +1949,126 @@
         }
         res = mdns_build_service_domain(&domain, service, 1);
         if ((res == ERR_OK) && mdns_domain_eq(&ans.info.domain, &domain)) {
-          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Probe response matches service domain!"));
-          conflict = 1;
+          LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Probe response matches service domain!\n"));
+          mdns_probe_conflict(netif, i + 1);
+          break;
         }
       }
+      if (i < MDNS_MAX_SERVICES)
+        break;
+    }
+    /* Perform conflict resolution (RFC6762 section 9):
+     * We assume a conflict if the hostname or service name matches the answers
+     * domain. Only if the rdata matches exactly we reset our assumption to no
+     * conflict. As stated in the RFC:
+     * What may be considered inconsistent is context sensitive, except that
+     * resource records with identical rdata are never considered inconsistent,
+     * even if they originate from different hosts.
+     */
+    else if ((mdns->state == MDNS_STATE_ANNOUNCING) ||
+             (mdns->state == MDNS_STATE_COMPLETE)) {
+      struct mdns_domain domain;
+      u8_t i;
+      u8_t conflict = 0;
 
-      if (conflict != 0) {
-        sys_untimeout(mdns_probe, pkt->netif);
-        if (mdns_name_result_cb != NULL) {
-          mdns_name_result_cb(pkt->netif, MDNS_PROBING_CONFLICT);
+      /* Evaluate unique hostname records -> A and AAAA */
+      res = mdns_build_host_domain(&domain, mdns);
+      if (res == ERR_OK && mdns_domain_eq(&ans.info.domain, &domain)) {
+        LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: response matches host domain, assuming conflict\n"));
+        /* This means a conflict has taken place, except when the packet contains
+         * exactly the same rdata. */
+        conflict = 1;
+        /* Evaluate rdata -> to see if it's a copy of our own data */
+        if (ans.info.type == DNS_RRTYPE_A) {
+#if LWIP_IPV4
+          if (ans.rd_length == sizeof(ip4_addr_t) &&
+              pbuf_memcmp(pkt->pbuf, ans.rd_offset, netif_ip4_addr(netif), ans.rd_length) == 0) {
+            LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: response equals our own IPv4 address record -> no conflict\n"));
+            conflict = 0;
+          }
+#endif
         }
+        else if (ans.info.type == DNS_RRTYPE_AAAA) {
+#if LWIP_IPV6
+          if (ans.rd_length == sizeof(ip6_addr_p_t)) {
+            for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
+              if (pbuf_memcmp(pkt->pbuf, ans.rd_offset, netif_ip6_addr(netif, i), ans.rd_length) == 0) {
+                LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: response equals our own iPv6 address record, num = %d -> no conflict\n",i));
+                conflict = 0;
+              }
+            }
+          }
+#endif
+        }
+      }
+      /* Evaluate unique service name records -> SRV and TXT */
+      for (i = 0; i < MDNS_MAX_SERVICES; i++) {
+        struct mdns_service* service = mdns->services[i];
+        if (!service) {
+          continue;
+        }
+        res = mdns_build_service_domain(&domain, service, 1);
+        if ((res == ERR_OK) && mdns_domain_eq(&ans.info.domain, &domain)) {
+          LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: response matches service domain, assuming conflict\n"));
+          /* This means a conflict has taken place, except when the packet contains
+           * exactly the same rdata. */
+          conflict = 1;
+          /* Evaluate rdata -> to see if it's a copy of our own data */
+          if (ans.info.type == DNS_RRTYPE_SRV) {
+            /* Read and compare to with our SRV record */
+            u16_t field16, len, read_pos;
+            struct mdns_domain srv_ans, my_ans;
+            read_pos = ans.rd_offset;
+            do {
+              /* Check priority field */
+              len = pbuf_copy_partial(pkt->pbuf, &field16, sizeof(field16), read_pos);
+              if (len != sizeof(field16) || lwip_ntohs(field16) != SRV_PRIORITY) {
+                break;
+              }
+              read_pos += len;
+              /* Check weight field */
+              len = pbuf_copy_partial(pkt->pbuf, &field16, sizeof(field16), read_pos);
+              if (len != sizeof(field16) || lwip_ntohs(field16) != SRV_WEIGHT) {
+                break;
+              }
+              read_pos += len;
+              /* Check port field */
+              len = pbuf_copy_partial(pkt->pbuf, &field16, sizeof(field16), read_pos);
+              if (len != sizeof(field16) || lwip_ntohs(field16) != service->port) {
+                break;
+              }
+              read_pos += len;
+              /* Check host field */
+              len = mdns_readname(pkt->pbuf, read_pos, &srv_ans);
+              mdns_build_host_domain(&my_ans, mdns);
+              if (len == MDNS_READNAME_ERROR || !mdns_domain_eq(&srv_ans, &my_ans)) {
+                break;
+              }
+              LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: response equals our own SRV record -> no conflict\n"));
+              conflict = 0;
+            } while (0);
+          } else if (ans.info.type == DNS_RRTYPE_TXT) {
+            mdns_prepare_txtdata(service);
+            if (service->txtdata.length == ans.rd_length &&
+                pbuf_memcmp(pkt->pbuf, ans.rd_offset, service->txtdata.name, ans.rd_length) == 0) {
+              LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: response equals our own TXT record -> no conflict\n"));
+              conflict = 0;
+            }
+          }
+        }
+      }
+      if (conflict != 0) {
+        /* Reset host to probing to reconfirm uniqueness */
+        LWIP_DEBUGF(MDNS_DEBUG, ("mDNS: Conflict resolution -> reset to probing state\n"));
+        mdns_resp_restart(netif);
+        break;
       }
     }
   }
+  /* Clear all xxx_left variables because we parsed all answers */
+  pkt->answers_left = 0;
+  pkt->authoritative_left = 0;
+  pkt->additional_left = 0;
 }
 
 /**
@@ -1881,33 +2107,88 @@
   memset(&packet, 0, sizeof(packet));
   SMEMCPY(&packet.source_addr, addr, sizeof(packet.source_addr));
   packet.source_port = port;
-  packet.netif = recv_netif;
   packet.pbuf = p;
   packet.parse_offset = offset;
   packet.tx_id = lwip_ntohs(hdr.id);
   packet.questions = packet.questions_left = lwip_ntohs(hdr.numquestions);
-  packet.answers = packet.answers_left = lwip_ntohs(hdr.numanswers) + lwip_ntohs(hdr.numauthrr) + lwip_ntohs(hdr.numextrarr);
+  packet.answers = packet.answers_left = lwip_ntohs(hdr.numanswers);
+  packet.authoritative = packet.authoritative_left = lwip_ntohs(hdr.numauthrr);
+  packet.additional = packet.additional_left = lwip_ntohs(hdr.numextrarr);
 
+  /*  Source address check (RFC6762 section 11) -> for responses.
+   *  Source address check (RFC6762 section 5.5) -> for queries.
+   *  When the dest addr == multicast addr we know the packet originated on that
+   *  link. If not, we need to check the source address. We only accept queries
+   *  that originated on the link. Others are discarded.
+   */
 #if LWIP_IPV6
   if (IP_IS_V6(ip_current_dest_addr())) {
     /* instead of having one 'v6group' per netif, just compare zoneless here */
-    if (!ip_addr_cmp_zoneless(ip_current_dest_addr(), &v6group)) {
+    if (!ip_addr_zoneless_eq(ip_current_dest_addr(), &v6group)) {
       packet.recv_unicast = 1;
+
+      if (ip6_addr_ismulticast_global(ip_2_ip6(ip_current_src_addr()))
+          || ip6_addr_isglobal(ip_2_ip6(ip_current_src_addr()))) {
+        goto dealloc;
+      }
     }
   }
 #endif
 #if LWIP_IPV4
   if (!IP_IS_V6(ip_current_dest_addr())) {
-    if (!ip_addr_cmp(ip_current_dest_addr(), &v4group)) {
+    if (!ip_addr_eq(ip_current_dest_addr(), &v4group)) {
       packet.recv_unicast = 1;
+
+      if (!ip4_addr_net_eq(ip_2_ip4(ip_current_src_addr()),
+                          netif_ip4_addr(recv_netif),
+                          netif_ip4_netmask(recv_netif))){
+           goto dealloc;
+         }
     }
   }
 #endif
 
   if (hdr.flags1 & DNS_FLAG1_RESPONSE) {
-    mdns_handle_response(&packet);
+    mdns_handle_response(&packet, recv_netif);
   } else {
-    mdns_handle_question(&packet);
+    if (packet.questions && hdr.flags1 & DNS_FLAG1_TRUNC) {
+      /* this is a new truncated question */
+      struct mdns_packet *pkt = (struct mdns_packet *)LWIP_MEMPOOL_ALLOC(MDNS_PKTS);
+      if (!pkt)
+        goto dealloc; /* don't reply truncated question if alloc error */
+      SMEMCPY(pkt, &packet, sizeof(packet));
+      /* insert this question in pending list */
+      pkt->next_tc_question = pending_tc_questions;
+      pending_tc_questions = pkt;
+      /* question with truncated flags, need to wait 400-500ms before replying */
+      sys_timeout(MDNS_RESPONSE_TC_DELAY_MS, mdns_handle_tc_question, pkt);
+      /* return without dealloc pbuf */
+      return;
+    }
+    else if (!packet.questions && packet.answers && pending_tc_questions) {
+      /* this packet is a known-answer packet for a truncated question previously received */
+      struct mdns_packet *q = pending_tc_questions;
+      while (q) {
+        if ((packet.source_port == q->source_port) &&
+            ip_addr_eq(&packet.source_addr, &q->source_addr))
+          break;
+        q = q->next_tc_question;
+      }
+      if (q) {
+        /* found question from the same source */
+        struct mdns_packet *pkt = (struct mdns_packet *)LWIP_MEMPOOL_ALLOC(MDNS_PKTS);
+        if (!pkt)
+          goto dealloc; /* don't reply truncated question if alloc error */
+        SMEMCPY(pkt, &packet, sizeof(packet));
+        /* insert this known-ansert in question */
+        pkt->next_answer = q->next_answer;
+        q->next_answer = pkt;
+        /* nothing more to do */
+        return;
+      }
+    }
+    /* if previous tests fail, handle this question normally */
+    mdns_handle_question(&packet, recv_netif);
   }
 
 dealloc:
@@ -1939,55 +2220,40 @@
   if (reason & (LWIP_NSC_IPV4_ADDRESS_CHANGED | LWIP_NSC_IPV4_GATEWAY_CHANGED |
       LWIP_NSC_IPV4_NETMASK_CHANGED | LWIP_NSC_IPV4_SETTINGS_CHANGED |
       LWIP_NSC_IPV6_SET | LWIP_NSC_IPV6_ADDR_STATE_CHANGED)) {
-    mdns_resp_announce(netif);
+    mdns_resp_restart(netif);
   }
 }
 #endif /* LWIP_NETIF_EXT_STATUS_CALLBACK && MDNS_RESP_USENETIF_EXTCALLBACK */
 
-static err_t
-mdns_send_probe(struct netif* netif, const ip_addr_t *destination)
+static void
+mdns_define_probe_rrs_to_send(struct netif *netif, struct mdns_outmsg *outmsg)
 {
-  struct mdns_host* mdns;
-  struct mdns_outpacket pkt;
-  struct mdns_domain domain;
-  u8_t i;
-  err_t res;
+  struct mdns_host *mdns = NETIF_TO_HOST(netif);
+  int i;
 
-  mdns = NETIF_TO_HOST(netif);
-
-  memset(&pkt, 0, sizeof(pkt));
-  pkt.netif = netif;
+  memset(outmsg, 0, sizeof(struct mdns_outmsg));
 
   /* Add unicast questions with rtype ANY for all our desired records */
-  mdns_build_host_domain(&domain, mdns);
-  res = mdns_add_question(&pkt, &domain, DNS_RRTYPE_ANY, DNS_RRCLASS_IN, 1);
-  if (res != ERR_OK) {
-    goto cleanup;
-  }
-  pkt.questions++;
+  outmsg->host_questions = QUESTION_PROBE_HOST_ANY;
+
   for (i = 0; i < MDNS_MAX_SERVICES; i++) {
     struct mdns_service* service = mdns->services[i];
     if (!service) {
       continue;
     }
-    mdns_build_service_domain(&domain, service, 1);
-    res = mdns_add_question(&pkt, &domain, DNS_RRTYPE_ANY, DNS_RRCLASS_IN, 1);
-    if (res != ERR_OK) {
-      goto cleanup;
-    }
-    pkt.questions++;
+    outmsg->serv_questions[i] = QUESTION_PROBE_SERVICE_NAME_ANY;
   }
 
   /* Add answers to the questions above into the authority section for tiebreaking */
 #if LWIP_IPV4
   if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {
-    pkt.host_replies = REPLY_HOST_A;
+    outmsg->host_replies = REPLY_HOST_A;
   }
 #endif
 #if LWIP_IPV6
   for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) {
-      pkt.host_replies |= REPLY_HOST_AAAA;
+      outmsg->host_replies |= REPLY_HOST_AAAA;
     }
   }
 #endif
@@ -1995,54 +2261,97 @@
   for (i = 0; i < MDNS_MAX_SERVICES; i++) {
     struct mdns_service *serv = mdns->services[i];
     if (serv) {
-      pkt.serv_replies[i] = REPLY_SERVICE_SRV | REPLY_SERVICE_TXT;
+      outmsg->serv_replies[i] = REPLY_SERVICE_SRV;
     }
   }
+}
 
-  pkt.tx_id = 0;
-  pkt.dest_port = LWIP_IANA_PORT_MDNS;
-  SMEMCPY(&pkt.dest_addr, destination, sizeof(pkt.dest_addr));
-  res = mdns_send_outpacket(&pkt, 0);
+static err_t
+mdns_send_probe(struct netif* netif, const ip_addr_t *destination)
+{
+  struct mdns_outmsg outmsg;
 
-cleanup:
-  if (pkt.pbuf) {
-    pbuf_free(pkt.pbuf);
-    pkt.pbuf = NULL;
-  }
-  return res;
+  mdns_define_probe_rrs_to_send(netif, &outmsg);
+
+  outmsg.tx_id = 0;
+  outmsg.dest_port = LWIP_IANA_PORT_MDNS;
+  SMEMCPY(&outmsg.dest_addr, destination, sizeof(outmsg.dest_addr));
+  return mdns_send_outpacket(&outmsg, netif);
 }
 
 /**
- * Timer callback for probing network.
+ * Timer callback for probing and announcing on the network.
  */
 static void
-mdns_probe(void* arg)
+mdns_probe_and_announce(void* arg)
 {
   struct netif *netif = (struct netif *)arg;
   struct mdns_host* mdns = NETIF_TO_HOST(netif);
+  u32_t announce_delay;
 
-  if(mdns->probes_sent >= MDNS_PROBE_COUNT) {
-    /* probing successful, announce the new name */
-    mdns->probing_state = MDNS_PROBING_COMPLETE;
-    mdns_resp_announce(netif);
-    if (mdns_name_result_cb != NULL) {
-      mdns_name_result_cb(netif, MDNS_PROBING_SUCCESSFUL);
-    }
-  } else {
+
+  switch (mdns->state) {
+    case MDNS_STATE_OFF:
+    case MDNS_STATE_PROBE_WAIT:
+    case MDNS_STATE_PROBING:
 #if LWIP_IPV4
-    /*if ipv4 wait with probing until address is set*/
-    if (!ip4_addr_isany_val(*netif_ip4_addr(netif)) &&
-        mdns_send_probe(netif, IP4_ADDR_ANY) == ERR_OK)
-#endif
-    {
-#if LWIP_IPV6
-      if (mdns_send_probe(netif, IP6_ADDR_ANY) == ERR_OK)
+      /*if ipv4 wait with probing until address is set*/
+      if (!ip4_addr_isany_val(*netif_ip4_addr(netif)) &&
+          mdns_send_probe(netif, &v4group) == ERR_OK)
 #endif
       {
-        mdns->probes_sent++;
+#if LWIP_IPV6
+        if (mdns_send_probe(netif, &v6group) == ERR_OK)
+#endif
+        {
+          mdns->state = MDNS_STATE_PROBING;
+          mdns->sent_num++;
+        }
       }
-    }
-    sys_timeout(MDNS_PROBE_DELAY_MS, mdns_probe, netif);
+
+      if (mdns->sent_num >= MDNS_PROBE_COUNT) {
+        mdns->state = MDNS_STATE_ANNOUNCE_WAIT;
+        mdns->sent_num = 0;
+      }
+
+      if (mdns->sent_num && mdns->rate_limit_activated == 1) {
+        /* delay second probe if rate limiting activated */
+        sys_timeout(MDNS_PROBE_MAX_CONFLICTS_TIMEOUT, mdns_probe_and_announce, netif);
+      }
+      else {
+        sys_timeout(MDNS_PROBE_DELAY_MS, mdns_probe_and_announce, netif);
+      }
+      break;
+    case MDNS_STATE_ANNOUNCE_WAIT:
+    case MDNS_STATE_ANNOUNCING:
+      if (mdns->sent_num == 0) {
+        /* probing was successful, announce all records */
+        mdns->state = MDNS_STATE_ANNOUNCING;
+        /* Reset rate limit max probe conflict timeout flag */
+        mdns->rate_limit_activated = 0;
+        /* Let the client know probing was successful */
+        if (mdns_name_result_cb != NULL) {
+          mdns_name_result_cb(netif, MDNS_PROBING_SUCCESSFUL, 0);
+        }
+      }
+
+      mdns_resp_announce(netif);
+      mdns->sent_num++;
+
+      if (mdns->sent_num >= MDNS_ANNOUNCE_COUNT) {
+        /* Announcing and probing complete */
+        mdns->state = MDNS_STATE_COMPLETE;
+        mdns->sent_num = 0;
+      }
+      else {
+        announce_delay = MDNS_ANNOUNCE_DELAY_MS * (1 << (mdns->sent_num - 1));
+        sys_timeout(announce_delay, mdns_probe_and_announce, netif);
+      }
+      break;
+    case MDNS_STATE_COMPLETE:
+    default:
+      /* Do nothing */
+      break;
   }
 }
 
@@ -2053,11 +2362,10 @@
  * @param hostname Name to use. Queries for &lt;hostname&gt;.local will be answered
  *                 with the IP addresses of the netif. The hostname will be copied, the
  *                 given pointer can be on the stack.
- * @param dns_ttl Validity time in seconds to send out for IP address data in DNS replies
  * @return ERR_OK if netif was added, an err_t otherwise
  */
 err_t
-mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl)
+mdns_resp_add_netif(struct netif *netif, const char *hostname)
 {
   err_t res;
   struct mdns_host *mdns;
@@ -2073,9 +2381,19 @@
   netif_set_client_data(netif, mdns_netif_client_id, mdns);
 
   MEMCPY(&mdns->name, hostname, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(hostname)));
-  mdns->dns_ttl = dns_ttl;
-  mdns->probes_sent = 0;
-  mdns->probing_state = MDNS_PROBING_NOT_STARTED;
+
+  /* Init delayed message structs with address and port */
+#if LWIP_IPV4
+  mdns->ipv4.delayed_msg_multicast.dest_port = LWIP_IANA_PORT_MDNS;
+  SMEMCPY(&mdns->ipv4.delayed_msg_multicast.dest_addr, &v4group,
+            sizeof(ip_addr_t));
+#endif
+
+#if LWIP_IPV6
+  mdns->ipv6.delayed_msg_multicast.dest_port = LWIP_IANA_PORT_MDNS;
+  SMEMCPY(&mdns->ipv6.delayed_msg_multicast.dest_addr, &v6group,
+            sizeof(ip_addr_t));
+#endif
 
   /* Join multicast groups */
 #if LWIP_IPV4
@@ -2119,9 +2437,7 @@
   mdns = NETIF_TO_HOST(netif);
   LWIP_ERROR("mdns_resp_remove_netif: Not an active netif", (mdns != NULL), return ERR_VAL);
 
-  if (mdns->probing_state == MDNS_PROBING_ONGOING) {
-    sys_untimeout(mdns_probe, netif);
-  }
+  sys_untimeout(mdns_probe_and_announce, netif);
 
   for (i = 0; i < MDNS_MAX_SERVICES; i++) {
     struct mdns_service *service = mdns->services[i];
@@ -2168,13 +2484,25 @@
   MEMCPY(&mdns->name, hostname, LWIP_MIN(MDNS_LABEL_MAXLEN, len));
   mdns->name[len] = '\0'; /* null termination in case new name is shorter than previous */
 
-  mdns_resp_restart(netif);
+  mdns_resp_restart_delay(netif, MDNS_PROBE_DELAY_MS);
 
   return ERR_OK;
 }
 
 /**
  * @ingroup mdns
+ * Checks if an MDNS responder is active for a given network interface.
+ * @param netif The network interface to test.
+ * @return nonzero if responder active, zero otherwise.
+ */
+int
+mdns_resp_netif_active(struct netif *netif)
+{
+	return NETIF_TO_HOST(netif) != NULL;
+}
+
+/**
+ * @ingroup mdns
  * Add a service to the selected network interface.
  * @param netif The network interface to publish this service on
  * @param name The name of the service
@@ -2182,17 +2510,15 @@
  * @param proto The service protocol, DNSSD_PROTO_TCP for TCP ("_tcp") and DNSSD_PROTO_UDP
  *              for others ("_udp")
  * @param port The port the service listens to
- * @param dns_ttl Validity time in seconds to send out for service data in DNS replies
  * @param txt_fn Callback to get TXT data. Will be called each time a TXT reply is created to
  *               allow dynamic replies.
  * @param txt_data Userdata pointer for txt_fn
  * @return service_id if the service was added to the netif, an err_t otherwise
  */
 s8_t
-mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_data)
+mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, service_get_txt_fn_t txt_fn, void *txt_data)
 {
-  s8_t i;
-  s8_t slot = -1;
+  u8_t slot;
   struct mdns_service *srv;
   struct mdns_host *mdns;
 
@@ -2205,13 +2531,12 @@
   LWIP_ERROR("mdns_resp_add_service: Service too long", (strlen(service) <= MDNS_LABEL_MAXLEN), return ERR_VAL);
   LWIP_ERROR("mdns_resp_add_service: Bad proto (need TCP or UDP)", (proto == DNSSD_PROTO_TCP || proto == DNSSD_PROTO_UDP), return ERR_VAL);
 
-  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
-    if (mdns->services[i] == NULL) {
-      slot = i;
+  for (slot = 0; slot < MDNS_MAX_SERVICES; slot++) {
+    if (mdns->services[slot] == NULL) {
       break;
     }
   }
-  LWIP_ERROR("mdns_resp_add_service: Service list full (increase MDNS_MAX_SERVICES)", (slot >= 0), return ERR_MEM);
+  LWIP_ERROR("mdns_resp_add_service: Service list full (increase MDNS_MAX_SERVICES)", (slot < MDNS_MAX_SERVICES), return ERR_MEM);
 
   srv = (struct mdns_service *)mem_calloc(1, sizeof(struct mdns_service));
   LWIP_ERROR("mdns_resp_add_service: Alloc failed", (srv != NULL), return ERR_MEM);
@@ -2222,7 +2547,6 @@
   srv->txt_userdata = txt_data;
   srv->proto = (u16_t)proto;
   srv->port = port;
-  srv->dns_ttl = dns_ttl;
 
   mdns->services[slot] = srv;
 
@@ -2239,14 +2563,14 @@
  * @return ERR_OK if the service was removed from the netif, an err_t otherwise
  */
 err_t
-mdns_resp_del_service(struct netif *netif, s8_t slot)
+mdns_resp_del_service(struct netif *netif, u8_t slot)
 {
   struct mdns_host *mdns;
   struct mdns_service *srv;
   LWIP_ASSERT("mdns_resp_del_service: netif != NULL", netif);
   mdns = NETIF_TO_HOST(netif);
   LWIP_ERROR("mdns_resp_del_service: Not an mdns netif", (mdns != NULL), return ERR_VAL);
-  LWIP_ERROR("mdns_resp_del_service: Invalid Service ID", (slot >= 0) && (slot < MDNS_MAX_SERVICES), return ERR_VAL);
+  LWIP_ERROR("mdns_resp_del_service: Invalid Service ID", slot < MDNS_MAX_SERVICES, return ERR_VAL);
   LWIP_ERROR("mdns_resp_del_service: Invalid Service ID", (mdns->services[slot] != NULL), return ERR_VAL);
 
   srv = mdns->services[slot];
@@ -2264,7 +2588,7 @@
  * @return ERR_OK if name could be set on service, an err_t otherwise
  */
 err_t
-mdns_resp_rename_service(struct netif *netif, s8_t slot, const char *name)
+mdns_resp_rename_service(struct netif *netif, u8_t slot, const char *name)
 {
   struct mdns_service *srv;
   struct mdns_host *mdns;
@@ -2276,7 +2600,7 @@
   mdns = NETIF_TO_HOST(netif);
   LWIP_ERROR("mdns_resp_rename_service: Not an mdns netif", (mdns != NULL), return ERR_VAL);
   LWIP_ERROR("mdns_resp_rename_service: Name too long", (len <= MDNS_LABEL_MAXLEN), return ERR_VAL);
-  LWIP_ERROR("mdns_resp_rename_service: Invalid Service ID", (slot >= 0) && (slot < MDNS_MAX_SERVICES), return ERR_VAL);
+  LWIP_ERROR("mdns_resp_rename_service: Invalid Service ID", slot < MDNS_MAX_SERVICES, return ERR_VAL);
   LWIP_ERROR("mdns_resp_rename_service: Invalid Service ID", (mdns->services[slot] != NULL), return ERR_VAL);
 
   srv = mdns->services[slot];
@@ -2284,7 +2608,7 @@
   MEMCPY(&srv->name, name, LWIP_MIN(MDNS_LABEL_MAXLEN, len));
   srv->name[len] = '\0'; /* null termination in case new name is shorter than previous */
 
-  mdns_resp_restart(netif);
+  mdns_resp_restart_delay(netif, MDNS_PROBE_DELAY_MS);
 
   return ERR_OK;
 }
@@ -2308,6 +2632,86 @@
   return mdns_domain_add_label(&service->txtdata, txt, txt_len);
 }
 
+#if LWIP_MDNS_SEARCH
+/**
+ * @ingroup mdns
+ * Stop a search request.
+ * @param request_id The search request to stop
+ */
+void
+mdns_search_stop(u8_t request_id)
+{
+  struct mdns_request *req;
+  LWIP_ASSERT("mdns_search_stop: bad request_id", request_id < MDNS_MAX_REQUESTS);
+  req = &mdns_requests[request_id];
+  if (req && req->result_fn) {
+    req->result_fn = NULL;
+  }
+}
+
+/**
+ * @ingroup mdns
+ * Search a specific service on the network.
+ * @param name The name of the service
+ * @param service The service type, like "_http"
+ * @param proto The service protocol, DNSSD_PROTO_TCP for TCP ("_tcp") and DNSSD_PROTO_UDP
+ *              for others ("_udp")
+ * @param netif The network interface where to send search request
+ * @param result_fn Callback to send answer received. Will be called for each answer of a
+ *                  response frame matching request sent.
+ * @param arg Userdata pointer for result_fn
+ * @param request_id Returned request identifier to allow stop it.
+ * @return ERR_OK if the search request was created and sent, an err_t otherwise
+ */
+err_t
+mdns_search_service(const char *name, const char *service, enum mdns_sd_proto proto,
+                    struct netif *netif, search_result_fn_t result_fn, void *arg,
+                    u8_t *request_id)
+{
+  u8_t slot;
+  struct mdns_request *req;
+  if (name) {
+    LWIP_ERROR("mdns_search_service: Name too long", (strlen(name) <= MDNS_LABEL_MAXLEN), return ERR_VAL);
+  }
+  LWIP_ERROR("mdns_search_service: Service too long", (strlen(service) < MDNS_DOMAIN_MAXLEN), return ERR_VAL);
+  LWIP_ERROR("mdns_search_service: Bad reqid pointer", request_id, return ERR_VAL);
+  LWIP_ERROR("mdns_search_service: Bad proto (need TCP or UDP)", (proto == DNSSD_PROTO_TCP || proto == DNSSD_PROTO_UDP), return ERR_VAL);
+  for (slot = 0; slot < MDNS_MAX_REQUESTS; slot++) {
+    if (mdns_requests[slot].result_fn == NULL) {
+      break;
+    }
+  }
+  if (slot >= MDNS_MAX_REQUESTS) {
+    /* Don't assert if no more space in mdns_request table. Just return an error. */
+    return ERR_MEM;
+  }
+
+  req = &mdns_requests[slot];
+  memset(req, 0, sizeof(struct mdns_request));
+  req->result_fn = result_fn;
+  req->arg = arg;
+  req->proto = (u16_t)proto;
+  req->qtype = DNS_RRTYPE_PTR;
+  if (proto == DNSSD_PROTO_UDP && strcmp(service, "_services._dns-sd") == 0) {
+      req->only_ptr = 1; /* don't check other answers */
+  }
+  mdns_domain_add_string(&req->service, service);
+  if (name) {
+    MEMCPY(&req->name, name, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(name)));
+  }
+  /* save request id (slot) in pointer provided by caller */
+  *request_id = slot;
+  /* now prepare a MDNS request and send it (on specified interface) */
+#if LWIP_IPV6
+  mdns_send_request(req, netif, &v6group);
+#endif
+#if LWIP_IPV4
+  mdns_send_request(req, netif, &v4group);
+#endif
+  return ERR_OK;
+}
+#endif
+
 /**
  * @ingroup mdns
  * Send unsolicited answer containing all our known data
@@ -2325,14 +2729,18 @@
     return;
   }
 
-  if (mdns->probing_state == MDNS_PROBING_COMPLETE) {
+  /* Do not announce if the mdns responder is off, waiting to probe, probing or
+   * waiting to announce. */
+  if (mdns->state >= MDNS_STATE_ANNOUNCING) {
     /* Announce on IPv6 and IPv4 */
 #if LWIP_IPV6
-    mdns_announce(netif, IP6_ADDR_ANY);
+    mdns_announce(netif, &v6group);
+    mdns_start_multicast_timeouts_ipv6(netif);
 #endif
 #if LWIP_IPV4
     if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {
-      mdns_announce(netif, IP4_ADDR_ANY);
+      mdns_announce(netif, &v4group);
+      mdns_start_multicast_timeouts_ipv4(netif);
     }
 #endif
   } /* else: ip address changed while probing was ongoing? @todo reset counter to restart? */
@@ -2348,12 +2756,13 @@
 
 /**
  * @ingroup mdns
- * Restart mdns responder. Call this when cable is connected after being disconnected or
- * administrative interface is set up after being down
+ * Restart mdns responder after a specified delay. Call this when cable is connected
+ * after being disconnected or administrative interface is set up after being down
  * @param netif The network interface to send on
+ * @param delay The delay to use before sending probe
  */
 void
-mdns_resp_restart(struct netif *netif)
+mdns_resp_restart_delay(struct netif *netif, uint32_t delay)
 {
   struct mdns_host* mdns;
   LWIP_ASSERT_CORE_LOCKED();
@@ -2363,14 +2772,35 @@
   if (mdns == NULL) {
     return;
   }
+  /* Make sure timer is not running */
+  sys_untimeout(mdns_probe_and_announce, netif);
 
-  if (mdns->probing_state == MDNS_PROBING_ONGOING) {
-    sys_untimeout(mdns_probe, netif);
+  mdns->sent_num = 0;
+  mdns->state = MDNS_STATE_PROBE_WAIT;
+
+  /* RFC6762 section 8.1: If fifteen conflicts occur within any ten-second period,
+   * then the host MUST wait at least five seconds before each successive
+   * additional probe attempt.
+   */
+  if (mdns->rate_limit_activated == 1) {
+    sys_timeout(MDNS_PROBE_MAX_CONFLICTS_TIMEOUT, mdns_probe_and_announce, netif);
   }
-  /* @todo if we've failed 15 times within a 10 second period we MUST wait 5 seconds (or wait 5 seconds every time except first)*/
-  mdns->probes_sent = 0;
-  mdns->probing_state = MDNS_PROBING_ONGOING;
-  sys_timeout(MDNS_INITIAL_PROBE_DELAY_MS, mdns_probe, netif);
+  else {
+    /* Adjust probe delay according sent probe count. */
+    sys_timeout(delay, mdns_probe_and_announce, netif);
+  }
+}
+
+/**
+ * @ingroup mdns
+ * Restart mdns responder. Call this when cable is connected after being disconnected or
+ * administrative interface is set up after being down
+ * @param netif The network interface to send on
+ */
+void
+mdns_resp_restart(struct netif *netif)
+{
+  mdns_resp_restart_delay(netif, MDNS_INITIAL_PROBE_DELAY_MS);
 }
 
 /**
@@ -2383,13 +2813,16 @@
   err_t res;
 
   /* LWIP_ASSERT_CORE_LOCKED(); is checked by udp_new() */
-
+#if LWIP_MDNS_SEARCH
+  memset(mdns_requests, 0, sizeof(mdns_requests));
+#endif
+  LWIP_MEMPOOL_INIT(MDNS_PKTS);
   mdns_pcb = udp_new_ip_type(IPADDR_TYPE_ANY);
   LWIP_ASSERT("Failed to allocate pcb", mdns_pcb != NULL);
 #if LWIP_MULTICAST_TX_OPTIONS
-  udp_set_multicast_ttl(mdns_pcb, MDNS_TTL);
+  udp_set_multicast_ttl(mdns_pcb, MDNS_IP_TTL);
 #else
-  mdns_pcb->ttl = MDNS_TTL;
+  mdns_pcb->ttl = MDNS_IP_TTL;
 #endif
   res = udp_bind(mdns_pcb, IP_ANY_TYPE, LWIP_IANA_PORT_MDNS);
   LWIP_UNUSED_ARG(res); /* in case of LWIP_NOASSERT */
@@ -2404,4 +2837,19 @@
 #endif
 }
 
+/**
+ * @ingroup mdns
+ * Return TXT userdata of a specific service on a network interface.
+ * @param netif Network interface.
+ * @param slot Service index.
+ */
+void *mdns_get_service_txt_userdata(struct netif *netif, s8_t slot)
+{
+  struct mdns_host *mdns = NETIF_TO_HOST(netif);
+  struct mdns_service *s;
+  LWIP_ASSERT("mdns_get_service_txt_userdata: index out of range", slot < MDNS_MAX_SERVICES);
+  s = mdns->services[slot];
+  return s ? s->txt_userdata : NULL;
+}
+
 #endif /* LWIP_MDNS_RESPONDER */
diff --git a/src/apps/mdns/mdns_domain.c b/src/apps/mdns/mdns_domain.c
new file mode 100644
index 0000000..265b5e6
--- /dev/null
+++ b/src/apps/mdns/mdns_domain.c
@@ -0,0 +1,635 @@
+/**
+ * @file
+ * MDNS responder implementation - domain related functionalities
+ */
+
+/*
+ * Copyright (c) 2015 Verisure Innovation AB
+ * 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: Erik Ekman <erik@kryo.se>
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
+ *
+ */
+
+#include "lwip/apps/mdns.h"
+#include "lwip/apps/mdns_domain.h"
+#include "lwip/apps/mdns_priv.h"
+#include "lwip/prot/dns.h"
+
+#include <string.h>
+
+#if LWIP_IPV6
+#include "lwip/prot/ip6.h"
+#endif
+
+#if LWIP_MDNS_RESPONDER
+
+/* Stored offsets to beginning of domain names
+ * Used for compression.
+ */
+#define DOMAIN_JUMP_SIZE 2
+#define DOMAIN_JUMP 0xc000
+
+#define TOPDOMAIN_LOCAL "local"
+
+#define REVERSE_PTR_TOPDOMAIN "arpa"
+#define REVERSE_PTR_V4_DOMAIN "in-addr"
+#define REVERSE_PTR_V6_DOMAIN "ip6"
+
+static const char *dnssd_protos[] = {
+  "_udp", /* DNSSD_PROTO_UDP */
+  "_tcp", /* DNSSD_PROTO_TCP */
+};
+
+/* forward declarations (function prototypes)*/
+static err_t mdns_domain_add_label_base(struct mdns_domain *domain, u8_t len);
+static err_t mdns_domain_add_label_pbuf(struct mdns_domain *domain,
+                                        const struct pbuf *p, u16_t offset,
+                                        u8_t len);
+static u16_t mdns_readname_loop(struct pbuf *p, u16_t offset,
+                                struct mdns_domain *domain, unsigned depth);
+static err_t mdns_add_dotlocal(struct mdns_domain *domain);
+
+
+static err_t
+mdns_domain_add_label_base(struct mdns_domain *domain, u8_t len)
+{
+  if (len > MDNS_LABEL_MAXLEN) {
+    return ERR_VAL;
+  }
+  if (len > 0 && (1 + len + domain->length >= MDNS_DOMAIN_MAXLEN)) {
+    return ERR_VAL;
+  }
+  /* Allow only zero marker on last byte */
+  if (len == 0 && (1 + domain->length > MDNS_DOMAIN_MAXLEN)) {
+    return ERR_VAL;
+  }
+  domain->name[domain->length] = len;
+  domain->length++;
+  return ERR_OK;
+}
+
+/**
+ * Add a label part to a domain
+ * @param domain The domain to add a label to
+ * @param label The label to add, like &lt;hostname&gt;, 'local', 'com' or ''
+ * @param len The length of the label
+ * @return ERR_OK on success, an err_t otherwise if label too long
+ */
+err_t
+mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len)
+{
+  err_t err = mdns_domain_add_label_base(domain, len);
+  if (err != ERR_OK) {
+    return err;
+  }
+  if (len) {
+    MEMCPY(&domain->name[domain->length], label, len);
+    domain->length += len;
+  }
+  return ERR_OK;
+}
+
+/**
+ * Add a label part to a domain (@see mdns_domain_add_label but copy directly from pbuf)
+ */
+static err_t
+mdns_domain_add_label_pbuf(struct mdns_domain *domain, const struct pbuf *p, u16_t offset, u8_t len)
+{
+  err_t err = mdns_domain_add_label_base(domain, len);
+  if (err != ERR_OK) {
+    return err;
+  }
+  if (len) {
+    if (pbuf_copy_partial(p, &domain->name[domain->length], len, offset) != len) {
+      /* take back the ++ done before */
+      domain->length--;
+      return ERR_ARG;
+    }
+    domain->length += len;
+  }
+  return ERR_OK;
+}
+
+/**
+ * Add a partial domain to a domain
+ * @param domain The domain to add a label to
+ * @param source The domain to add, like &lt;\\x09_services\\007_dns-sd\\000&gt;
+ * @return ERR_OK on success, an err_t otherwise if label too long
+ */
+err_t
+mdns_domain_add_domain(struct mdns_domain *domain, struct mdns_domain *source)
+{
+  u16_t len = source->length;
+  if (len > 0 && (1 + len + domain->length >= MDNS_DOMAIN_MAXLEN)) {
+    return ERR_VAL;
+  }
+  /* Allow only zero marker on last byte */
+  if (len == 0 && (1 + domain->length > MDNS_DOMAIN_MAXLEN)) {
+    return ERR_VAL;
+  }
+  if (len) {
+    /* Copy partial domain */
+    MEMCPY(&domain->name[domain->length], source->name, len);
+    domain->length += len;
+  } else {
+    /* Add zero marker */
+    domain->name[domain->length] = 0;
+    domain->length++;
+  }
+  return ERR_OK;
+}
+
+/**
+ * Add a string domain to a domain
+ * @param domain The domain to add a label to
+ * @param source The string to add, like &lt;_services._dns-sd&gt;
+ * @return ERR_OK on success, an err_t otherwise if label too long
+ */
+err_t
+mdns_domain_add_string(struct mdns_domain *domain, const char *source)
+{
+  u8_t *len = &domain->name[domain->length];
+  u8_t *end = &domain->name[MDNS_DOMAIN_MAXLEN];
+  u8_t *start = len + 1;
+  *len = 0;
+  while (*source && start < end) {
+      if (*source == '.') {
+        len = start++;
+        *len = 0;
+        source++;
+      } else {
+        *start++ = *source++;
+        *len = *len + 1;
+      }
+  }
+  if (start == end) {
+      return ERR_VAL;
+  }
+  domain->length = (u16_t)(start - &domain->name[0]);
+  return ERR_OK;
+}
+
+
+/**
+ * Internal readname function with max 6 levels of recursion following jumps
+ * while decompressing name
+ */
+static u16_t
+mdns_readname_loop(struct pbuf *p, u16_t offset, struct mdns_domain *domain, unsigned depth)
+{
+  u8_t c;
+
+  do {
+    if (depth > 5) {
+      /* Too many jumps */
+      return MDNS_READNAME_ERROR;
+    }
+
+    c = pbuf_get_at(p, offset);
+    offset++;
+
+    /* is this a compressed label? */
+    if ((c & 0xc0) == 0xc0) {
+      u16_t jumpaddr;
+      if (offset >= p->tot_len) {
+        /* Make sure both jump bytes fit in the packet */
+        return MDNS_READNAME_ERROR;
+      }
+      jumpaddr = (((c & 0x3f) << 8) | (pbuf_get_at(p, offset) & 0xff));
+      offset++;
+      if (jumpaddr >= SIZEOF_DNS_HDR && jumpaddr < p->tot_len) {
+        u16_t res;
+        /* Recursive call, maximum depth will be checked */
+        res = mdns_readname_loop(p, jumpaddr, domain, depth + 1);
+        /* Don't return offset since new bytes were not read (jumped to somewhere in packet) */
+        if (res == MDNS_READNAME_ERROR) {
+          return res;
+        }
+      } else {
+        return MDNS_READNAME_ERROR;
+      }
+      break;
+    }
+
+    /* normal label */
+    if (c <= MDNS_LABEL_MAXLEN) {
+      err_t res;
+
+      if (c + domain->length >= MDNS_DOMAIN_MAXLEN) {
+        return MDNS_READNAME_ERROR;
+      }
+      res = mdns_domain_add_label_pbuf(domain, p, offset, c);
+      if (res != ERR_OK) {
+        return MDNS_READNAME_ERROR;
+      }
+      offset += c;
+    } else {
+      /* bad length byte */
+      return MDNS_READNAME_ERROR;
+    }
+  } while (c != 0);
+
+  return offset;
+}
+
+/**
+ * Read possibly compressed domain name from packet buffer
+ * @param p The packet
+ * @param offset start position of domain name in packet
+ * @param domain The domain name destination
+ * @return The new offset after the domain, or MDNS_READNAME_ERROR
+ *         if reading failed
+ */
+u16_t
+mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain)
+{
+  memset(domain, 0, sizeof(struct mdns_domain));
+  return mdns_readname_loop(p, offset, domain, 0);
+}
+
+/**
+ * Print domain name to debug output
+ * @param domain The domain name
+ */
+void
+mdns_domain_debug_print(struct mdns_domain *domain)
+{
+  u8_t *src = domain->name;
+  u8_t i;
+
+  while (*src) {
+    u8_t label_len = *src;
+    src++;
+    for (i = 0; i < label_len; i++) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("%c", src[i]));
+    }
+    src += label_len;
+    LWIP_DEBUGF(MDNS_DEBUG, ("."));
+  }
+}
+
+/**
+ * Return 1 if contents of domains match (case-insensitive)
+ * @param a Domain name to compare 1
+ * @param b Domain name to compare 2
+ * @return 1 if domains are equal ignoring case, 0 otherwise
+ */
+int
+mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b)
+{
+  u8_t *ptra, *ptrb;
+  u8_t len;
+  int res;
+
+  if (a->length != b->length) {
+    return 0;
+  }
+
+  ptra = a->name;
+  ptrb = b->name;
+  while (*ptra && *ptrb && ptra < &a->name[a->length]) {
+    if (*ptra != *ptrb) {
+      return 0;
+    }
+    len = *ptra;
+    ptra++;
+    ptrb++;
+    res = lwip_strnicmp((char *) ptra, (char *) ptrb, len);
+    if (res != 0) {
+      return 0;
+    }
+    ptra += len;
+    ptrb += len;
+  }
+  if (*ptra != *ptrb && ptra < &a->name[a->length]) {
+    return 0;
+  }
+  return 1;
+}
+
+#if LWIP_IPV4
+/**
+ * Build domain for reverse lookup of IPv4 address
+ * like 12.0.168.192.in-addr.arpa. for 192.168.0.12
+ * @param domain Where to write the domain name
+ * @param addr Pointer to an IPv4 address to encode
+ * @return ERR_OK if domain was written, an err_t otherwise
+ */
+err_t
+mdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr)
+{
+  int i;
+  err_t res;
+  const u8_t *ptr;
+
+  LWIP_UNUSED_ARG(res);
+  if (!domain || !addr) {
+    return ERR_ARG;
+  }
+  memset(domain, 0, sizeof(struct mdns_domain));
+  ptr = (const u8_t *) addr;
+  for (i = sizeof(ip4_addr_t) - 1; i >= 0; i--) {
+    char buf[4];
+    u8_t val = ptr[i];
+
+    lwip_itoa(buf, sizeof(buf), val);
+    res = mdns_domain_add_label(domain, buf, (u8_t)strlen(buf));
+    LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res);
+  }
+  res = mdns_domain_add_label(domain, REVERSE_PTR_V4_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V4_DOMAIN) - 1));
+  LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res);
+  res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN) - 1));
+  LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res);
+  res = mdns_domain_add_label(domain, NULL, 0);
+  LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res);
+
+  return ERR_OK;
+}
+#endif
+
+#if LWIP_IPV6
+/**
+ * Build domain for reverse lookup of IP address
+ * like b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. for 2001:db8::567:89ab
+ * @param domain Where to write the domain name
+ * @param addr Pointer to an IPv6 address to encode
+ * @return ERR_OK if domain was written, an err_t otherwise
+ */
+err_t
+mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr)
+{
+  int i;
+  err_t res;
+  const u8_t *ptr;
+  LWIP_UNUSED_ARG(res);
+  if (!domain || !addr) {
+    return ERR_ARG;
+  }
+  memset(domain, 0, sizeof(struct mdns_domain));
+  ptr = (const u8_t *) addr;
+  for (i = sizeof(ip6_addr_p_t) - 1; i >= 0; i--) {
+    char buf;
+    u8_t byte = ptr[i];
+    int j;
+    for (j = 0; j < 2; j++) {
+      if ((byte & 0x0F) < 0xA) {
+        buf = '0' + (byte & 0x0F);
+      } else {
+        buf = 'a' + (byte & 0x0F) - 0xA;
+      }
+      res = mdns_domain_add_label(domain, &buf, sizeof(buf));
+      LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res);
+      byte >>= 4;
+    }
+  }
+  res = mdns_domain_add_label(domain, REVERSE_PTR_V6_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V6_DOMAIN) - 1));
+  LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res);
+  res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN) - 1));
+  LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res);
+  res = mdns_domain_add_label(domain, NULL, 0);
+  LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res);
+
+  return ERR_OK;
+}
+#endif
+
+/* Add .local. to domain */
+static err_t
+mdns_add_dotlocal(struct mdns_domain *domain)
+{
+  err_t res = mdns_domain_add_label(domain, TOPDOMAIN_LOCAL, (u8_t)(sizeof(TOPDOMAIN_LOCAL) - 1));
+  LWIP_UNUSED_ARG(res);
+  LWIP_ERROR("mdns_add_dotlocal: Failed to add label", (res == ERR_OK), return res);
+  return mdns_domain_add_label(domain, NULL, 0);
+}
+
+/**
+ * Build the \<hostname\>.local. domain name
+ * @param domain Where to write the domain name
+ * @param mdns TMDNS netif descriptor.
+ * @return ERR_OK if domain \<hostname\>.local. was written, an err_t otherwise
+ */
+err_t
+mdns_build_host_domain(struct mdns_domain *domain, struct mdns_host *mdns)
+{
+  err_t res;
+  LWIP_UNUSED_ARG(res);
+  memset(domain, 0, sizeof(struct mdns_domain));
+  LWIP_ERROR("mdns_build_host_domain: mdns != NULL", (mdns != NULL), return ERR_VAL);
+  res = mdns_domain_add_label(domain, mdns->name, (u8_t)strlen(mdns->name));
+  LWIP_ERROR("mdns_build_host_domain: Failed to add label", (res == ERR_OK), return res);
+  return mdns_add_dotlocal(domain);
+}
+
+/**
+ * Build the lookup-all-services special DNS-SD domain name
+ * @param domain Where to write the domain name
+ * @return ERR_OK if domain _services._dns-sd._udp.local. was written, an err_t otherwise
+ */
+err_t
+mdns_build_dnssd_domain(struct mdns_domain *domain)
+{
+  err_t res;
+  LWIP_UNUSED_ARG(res);
+  memset(domain, 0, sizeof(struct mdns_domain));
+  res = mdns_domain_add_label(domain, "_services", (u8_t)(sizeof("_services") - 1));
+  LWIP_ERROR("mdns_build_dnssd_domain: Failed to add label", (res == ERR_OK), return res);
+  res = mdns_domain_add_label(domain, "_dns-sd", (u8_t)(sizeof("_dns-sd") - 1));
+  LWIP_ERROR("mdns_build_dnssd_domain: Failed to add label", (res == ERR_OK), return res);
+  res = mdns_domain_add_label(domain, dnssd_protos[DNSSD_PROTO_UDP], (u8_t)strlen(dnssd_protos[DNSSD_PROTO_UDP]));
+  LWIP_ERROR("mdns_build_dnssd_domain: Failed to add label", (res == ERR_OK), return res);
+  return mdns_add_dotlocal(domain);
+}
+
+/**
+ * Build domain name for a service
+ * @param domain Where to write the domain name
+ * @param service The service struct, containing service name, type and protocol
+ * @param include_name Whether to include the service name in the domain
+ * @return ERR_OK if domain was written. If service name is included,
+ *         \<name\>.\<type\>.\<proto\>.local. will be written, otherwise \<type\>.\<proto\>.local.
+ *         An err_t is returned on error.
+ */
+err_t
+mdns_build_service_domain(struct mdns_domain *domain, struct mdns_service *service, int include_name)
+{
+  err_t res;
+  LWIP_UNUSED_ARG(res);
+  memset(domain, 0, sizeof(struct mdns_domain));
+  if (include_name) {
+    res = mdns_domain_add_label(domain, service->name, (u8_t)strlen(service->name));
+    LWIP_ERROR("mdns_build_service_domain: Failed to add label", (res == ERR_OK), return res);
+  }
+  res = mdns_domain_add_label(domain, service->service, (u8_t)strlen(service->service));
+  LWIP_ERROR("mdns_build_service_domain: Failed to add label", (res == ERR_OK), return res);
+  res = mdns_domain_add_label(domain, dnssd_protos[service->proto], (u8_t)strlen(dnssd_protos[service->proto]));
+  LWIP_ERROR("mdns_build_service_domain: Failed to add label", (res == ERR_OK), return res);
+  return mdns_add_dotlocal(domain);
+}
+
+#if LWIP_MDNS_SEARCH
+/**
+ * Build domain name for a request
+ * @param domain Where to write the domain name
+ * @param request The request struct, containing service name, type and protocol
+ * @param include_name Whether to include the service name in the domain
+ * @return ERR_OK if domain was written. If service name is included,
+ *         \<name\>.\<type\>.\<proto\>.local. will be written, otherwise \<type\>.\<proto\>.local.
+ *         An err_t is returned on error.
+ */
+err_t
+mdns_build_request_domain(struct mdns_domain *domain, struct mdns_request *request, int include_name)
+{
+  err_t res;
+  memset(domain, 0, sizeof(struct mdns_domain));
+  if (include_name) {
+    res = mdns_domain_add_label(domain, request->name, (u8_t)strlen(request->name));
+    LWIP_ERROR("mdns_build_request_domain: Failed to add label", (res == ERR_OK), return res);
+  }
+  res = mdns_domain_add_domain(domain, &request->service);
+  LWIP_ERROR("mdns_build_request_domain: Failed to add domain", (res == ERR_OK), return res);
+  res = mdns_domain_add_label(domain, dnssd_protos[request->proto], (u8_t)strlen(dnssd_protos[request->proto]));
+  LWIP_ERROR("mdns_build_request_domain: Failed to add label", (res == ERR_OK), return res);
+  return mdns_add_dotlocal(domain);
+}
+#endif
+
+/**
+ * Return bytes needed to write before jump for best result of compressing supplied domain
+ * against domain in outpacket starting at specified offset.
+ * If a match is found, offset is updated to where to jump to
+ * @param pbuf Pointer to pbuf with the partially constructed DNS packet
+ * @param offset Start position of a domain written earlier. If this location is suitable
+ *               for compression, the pointer is updated to where in the domain to jump to.
+ * @param domain The domain to write
+ * @return Number of bytes to write of the new domain before writing a jump to the offset.
+ *         If compression can not be done against this previous domain name, the full new
+ *         domain length is returned.
+ */
+u16_t
+mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain)
+{
+  struct mdns_domain target;
+  u16_t target_end;
+  u8_t target_len;
+  u8_t writelen = 0;
+  u8_t *ptr;
+  if (pbuf == NULL) {
+    return domain->length;
+  }
+  target_end = mdns_readname(pbuf, *offset, &target);
+  if (target_end == MDNS_READNAME_ERROR) {
+    return domain->length;
+  }
+  target_len = (u8_t)(target_end - *offset);
+  ptr = domain->name;
+  while (writelen < domain->length) {
+    u8_t domainlen = (u8_t)(domain->length - writelen);
+    u8_t labellen;
+    if (domainlen <= target.length && domainlen > DOMAIN_JUMP_SIZE) {
+      /* Compare domains if target is long enough, and we have enough left of the domain */
+      u8_t targetpos = (u8_t)(target.length - domainlen);
+      if ((targetpos + DOMAIN_JUMP_SIZE) >= target_len) {
+        /* We are checking at or beyond a jump in the original, stop looking */
+        break;
+      }
+      if (target.length >= domainlen &&
+          memcmp(&domain->name[writelen], &target.name[targetpos], domainlen) == 0) {
+        *offset += targetpos;
+        return writelen;
+      }
+    }
+    /* Skip to next label in domain */
+    labellen = *ptr;
+    writelen += 1 + labellen;
+    ptr += 1 + labellen;
+  }
+  /* Nothing found */
+  return domain->length;
+}
+
+/**
+ * Write domain to outpacket. Compression will be attempted,
+ * unless domain->skip_compression is set.
+ * @param outpkt The outpacket to write to
+ * @param domain The domain name to write
+ * @return ERR_OK on success, an err_t otherwise
+ */
+err_t
+mdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain)
+{
+  int i;
+  err_t res;
+  u16_t writelen = domain->length;
+  u16_t jump_offset = 0;
+  u16_t jump;
+
+  if (!domain->skip_compression) {
+    for (i = 0; i < NUM_DOMAIN_OFFSETS; i++) {
+      u16_t offset = outpkt->domain_offsets[i];
+      if (offset) {
+        u16_t len = mdns_compress_domain(outpkt->pbuf, &offset, domain);
+        if (len < writelen) {
+          writelen = len;
+          jump_offset = offset;
+        }
+      }
+    }
+  }
+
+  if (writelen) {
+    /* Write uncompressed part of name */
+    res = pbuf_take_at(outpkt->pbuf, domain->name, writelen, outpkt->write_offset);
+    if (res != ERR_OK) {
+      return res;
+    }
+
+    /* Store offset of this new domain */
+    for (i = 0; i < NUM_DOMAIN_OFFSETS; i++) {
+      if (outpkt->domain_offsets[i] == 0) {
+        outpkt->domain_offsets[i] = outpkt->write_offset;
+        break;
+      }
+    }
+
+    outpkt->write_offset += writelen;
+  }
+  if (jump_offset) {
+    /* Write jump */
+    jump = lwip_htons(DOMAIN_JUMP | jump_offset);
+    res = pbuf_take_at(outpkt->pbuf, &jump, DOMAIN_JUMP_SIZE, outpkt->write_offset);
+    if (res != ERR_OK) {
+      return res;
+    }
+    outpkt->write_offset += DOMAIN_JUMP_SIZE;
+  }
+  return ERR_OK;
+}
+
+#endif /* LWIP_MDNS_RESPONDER */
diff --git a/src/apps/mdns/mdns_out.c b/src/apps/mdns/mdns_out.c
new file mode 100644
index 0000000..5c6d26b
--- /dev/null
+++ b/src/apps/mdns/mdns_out.c
@@ -0,0 +1,1163 @@
+/**
+ * @file
+ * MDNS responder implementation - output related functionalities
+ */
+
+/*
+ * Copyright (c) 2015 Verisure Innovation AB
+ * 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: Erik Ekman <erik@kryo.se>
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
+ *
+ */
+
+#include "lwip/apps/mdns_out.h"
+#include "lwip/apps/mdns_priv.h"
+#include "lwip/apps/mdns_domain.h"
+#include "lwip/prot/dns.h"
+#include "lwip/prot/iana.h"
+#include "lwip/udp.h"
+
+#include <string.h>
+
+#if LWIP_IPV6
+#include "lwip/prot/ip6.h"
+#endif
+
+
+#if LWIP_MDNS_RESPONDER
+
+/* Function prototypes */
+static void mdns_clear_outmsg(struct mdns_outmsg *outmsg);
+
+/**
+ * Call user supplied function to setup TXT data
+ * @param service The service to build TXT record for
+ */
+void
+mdns_prepare_txtdata(struct mdns_service *service)
+{
+  memset(&service->txtdata, 0, sizeof(struct mdns_domain));
+  if (service->txt_fn) {
+    service->txt_fn(service, service->txt_userdata);
+  }
+}
+
+/**
+ * Write a question to an outpacket
+ * A question contains domain, type and class. Since an answer also starts with these fields this function is also
+ * called from mdns_add_answer().
+ * @param outpkt The outpacket to write to
+ * @param domain The domain name the answer is for
+ * @param type The DNS type of the answer (like 'AAAA', 'SRV')
+ * @param klass The DNS type of the answer (like 'IN')
+ * @param unicast If highest bit in class should be set, to instruct the responder to
+ *                reply with a unicast packet
+ * @return ERR_OK on success, an err_t otherwise
+ */
+static err_t
+mdns_add_question(struct mdns_outpacket *outpkt, struct mdns_domain *domain,
+                  u16_t type, u16_t klass, u16_t unicast)
+{
+  u16_t question_len;
+  u16_t field16;
+  err_t res;
+
+  if (!outpkt->pbuf) {
+    /* If no pbuf is active, allocate one */
+    outpkt->pbuf = pbuf_alloc(PBUF_TRANSPORT, MDNS_OUTPUT_PACKET_SIZE, PBUF_RAM);
+    if (!outpkt->pbuf) {
+      return ERR_MEM;
+    }
+    outpkt->write_offset = SIZEOF_DNS_HDR;
+  }
+
+  /* Worst case calculation. Domain string might be compressed */
+  question_len = domain->length + sizeof(type) + sizeof(klass);
+  if (outpkt->write_offset + question_len > outpkt->pbuf->tot_len) {
+    /* No space */
+    return ERR_MEM;
+  }
+
+  /* Write name */
+  res = mdns_write_domain(outpkt, domain);
+  if (res != ERR_OK) {
+    return res;
+  }
+
+  /* Write type */
+  field16 = lwip_htons(type);
+  res = pbuf_take_at(outpkt->pbuf, &field16, sizeof(field16), outpkt->write_offset);
+  if (res != ERR_OK) {
+    return res;
+  }
+  outpkt->write_offset += sizeof(field16);
+
+  /* Write class */
+  if (unicast) {
+    klass |= 0x8000;
+  }
+  field16 = lwip_htons(klass);
+  res = pbuf_take_at(outpkt->pbuf, &field16, sizeof(field16), outpkt->write_offset);
+  if (res != ERR_OK) {
+    return res;
+  }
+  outpkt->write_offset += sizeof(field16);
+
+  return ERR_OK;
+}
+
+/**
+ * Write answer to reply packet.
+ * buf or answer_domain can be null. The rd_length written will be buf_length +
+ * size of (compressed) domain. Most uses will need either buf or answer_domain,
+ * special case is SRV that starts with 3 u16 and then a domain name.
+ * @param reply The outpacket to write to
+ * @param domain The domain name the answer is for
+ * @param type The DNS type of the answer (like 'AAAA', 'SRV')
+ * @param klass The DNS type of the answer (like 'IN')
+ * @param cache_flush If highest bit in class should be set, to instruct receiver that
+ *                    this reply replaces any earlier answer for this domain/type/class
+ * @param ttl Validity time in seconds to send out for IP address data in DNS replies
+ * @param buf Pointer to buffer of answer data
+ * @param buf_length Length of variable data
+ * @param answer_domain A domain to write after any buffer data as answer
+ * @return ERR_OK on success, an err_t otherwise
+ */
+static err_t
+mdns_add_answer(struct mdns_outpacket *reply, struct mdns_domain *domain,
+                u16_t type, u16_t klass, u16_t cache_flush, u32_t ttl,
+                const u8_t *buf, size_t buf_length, struct mdns_domain *answer_domain)
+{
+  u16_t answer_len;
+  u16_t field16;
+  u16_t rdlen_offset;
+  u16_t answer_offset;
+  u32_t field32;
+  err_t res;
+
+  if (!reply->pbuf) {
+    /* If no pbuf is active, allocate one */
+    reply->pbuf = pbuf_alloc(PBUF_TRANSPORT, MDNS_OUTPUT_PACKET_SIZE, PBUF_RAM);
+    if (!reply->pbuf) {
+      return ERR_MEM;
+    }
+    reply->write_offset = SIZEOF_DNS_HDR;
+  }
+
+  /* Worst case calculation. Domain strings might be compressed */
+  answer_len = domain->length + sizeof(type) + sizeof(klass) + sizeof(ttl) + sizeof(field16)/*rd_length*/;
+  if (buf) {
+    answer_len += (u16_t)buf_length;
+  }
+  if (answer_domain) {
+    answer_len += answer_domain->length;
+  }
+  if (reply->write_offset + answer_len > reply->pbuf->tot_len) {
+    /* No space */
+    return ERR_MEM;
+  }
+
+  /* Answer starts with same data as question, then more fields */
+  mdns_add_question(reply, domain, type, klass, cache_flush);
+
+  /* Write TTL */
+  field32 = lwip_htonl(ttl);
+  res = pbuf_take_at(reply->pbuf, &field32, sizeof(field32), reply->write_offset);
+  if (res != ERR_OK) {
+    return res;
+  }
+  reply->write_offset += sizeof(field32);
+
+  /* Store offsets and skip forward to the data */
+  rdlen_offset = reply->write_offset;
+  reply->write_offset += sizeof(field16);
+  answer_offset = reply->write_offset;
+
+  if (buf) {
+    /* Write static data */
+    res = pbuf_take_at(reply->pbuf, buf, (u16_t)buf_length, reply->write_offset);
+    if (res != ERR_OK) {
+      return res;
+    }
+    reply->write_offset += (u16_t)buf_length;
+  }
+
+  if (answer_domain) {
+    /* Write name answer (compressed if possible) */
+    res = mdns_write_domain(reply, answer_domain);
+    if (res != ERR_OK) {
+      return res;
+    }
+  }
+
+  /* Write rd_length after when we know the answer size */
+  field16 = lwip_htons(reply->write_offset - answer_offset);
+  res = pbuf_take_at(reply->pbuf, &field16, sizeof(field16), rdlen_offset);
+
+  return res;
+}
+
+/** Write an ANY host question to outpacket */
+static err_t
+mdns_add_any_host_question(struct mdns_outpacket *outpkt,
+                           struct mdns_host *mdns,
+                           u16_t request_unicast_reply)
+{
+  struct mdns_domain host;
+  mdns_build_host_domain(&host, mdns);
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Adding host question for ANY type\n"));
+  return mdns_add_question(outpkt, &host, DNS_RRTYPE_ANY, DNS_RRCLASS_IN,
+                           request_unicast_reply);
+}
+
+/** Write an ANY service instance question to outpacket */
+static err_t
+mdns_add_any_service_question(struct mdns_outpacket *outpkt,
+                              struct mdns_service *service,
+                              u16_t request_unicast_reply)
+{
+  struct mdns_domain domain;
+  mdns_build_service_domain(&domain, service, 1);
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Adding service instance question for ANY type\n"));
+  return mdns_add_question(outpkt, &domain, DNS_RRTYPE_ANY, DNS_RRCLASS_IN,
+                           request_unicast_reply);
+}
+
+#if LWIP_IPV4
+/** Write an IPv4 address (A) RR to outpacket */
+static err_t
+mdns_add_a_answer(struct mdns_outpacket *reply, struct mdns_outmsg *msg,
+                  struct netif *netif)
+{
+  err_t res;
+  u32_t ttl = MDNS_TTL_120;
+  struct mdns_domain host;
+  mdns_build_host_domain(&host, netif_mdns_data(netif));
+  /* When answering to a legacy querier, we need to repeat the question and
+   * limit the ttl to the short legacy ttl */
+  if(msg->legacy_query) {
+    /* Repeating the question only needs to be done for the question asked
+     * (max one question), not for the additional records. */
+    if(reply->questions < 1) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Add question for legacy query\n"));
+      res = mdns_add_question(reply, &host, DNS_RRTYPE_A, DNS_RRCLASS_IN, 0);
+      if (res != ERR_OK) {
+        return res;
+      }
+      reply->questions = 1;
+    }
+    /* ttl of legacy answer may not be greater then 10 seconds */
+    ttl = MDNS_TTL_10;
+  }
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with A record\n"));
+  return mdns_add_answer(reply, &host, DNS_RRTYPE_A, DNS_RRCLASS_IN, msg->cache_flush,
+                         ttl, (const u8_t *) netif_ip4_addr(netif),
+                         sizeof(ip4_addr_t), NULL);
+}
+
+/** Write a 4.3.2.1.in-addr.arpa -> hostname.local PTR RR to outpacket */
+static err_t
+mdns_add_hostv4_ptr_answer(struct mdns_outpacket *reply, struct mdns_outmsg *msg,
+                           struct netif *netif)
+{
+  err_t res;
+  u32_t ttl = MDNS_TTL_120;
+  struct mdns_domain host, revhost;
+  mdns_build_host_domain(&host, netif_mdns_data(netif));
+  mdns_build_reverse_v4_domain(&revhost, netif_ip4_addr(netif));
+  /* When answering to a legacy querier, we need to repeat the question and
+   * limit the ttl to the short legacy ttl */
+  if(msg->legacy_query) {
+    /* Repeating the question only needs to be done for the question asked
+     * (max one question), not for the additional records. */
+    if(reply->questions < 1) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Add question for legacy query\n"));
+      res = mdns_add_question(reply, &revhost, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, 0);
+      if (res != ERR_OK) {
+        return res;
+      }
+      reply->questions = 1;
+    }
+    /* ttl of legacy answer may not be greater then 10 seconds */
+    ttl = MDNS_TTL_10;
+  }
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with v4 PTR record\n"));
+  return mdns_add_answer(reply, &revhost, DNS_RRTYPE_PTR, DNS_RRCLASS_IN,
+                         msg->cache_flush, ttl, NULL, 0, &host);
+}
+#endif
+
+#if LWIP_IPV6
+/** Write an IPv6 address (AAAA) RR to outpacket */
+static err_t
+mdns_add_aaaa_answer(struct mdns_outpacket *reply, struct mdns_outmsg *msg,
+                     struct netif *netif, int addrindex)
+{
+  err_t res;
+  u32_t ttl = MDNS_TTL_120;
+  struct mdns_domain host;
+  mdns_build_host_domain(&host, netif_mdns_data(netif));
+  /* When answering to a legacy querier, we need to repeat the question and
+   * limit the ttl to the short legacy ttl */
+  if(msg->legacy_query) {
+    /* Repeating the question only needs to be done for the question asked
+     * (max one question), not for the additional records. */
+    if(reply->questions < 1) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Add question for legacy query\n"));
+      res = mdns_add_question(reply, &host, DNS_RRTYPE_AAAA, DNS_RRCLASS_IN, 0);
+      if (res != ERR_OK) {
+        return res;
+      }
+      reply->questions = 1;
+    }
+    /* ttl of legacy answer may not be greater then 10 seconds */
+    ttl = MDNS_TTL_10;
+  }
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with AAAA record\n"));
+  return mdns_add_answer(reply, &host, DNS_RRTYPE_AAAA, DNS_RRCLASS_IN, msg->cache_flush,
+                         ttl, (const u8_t *) netif_ip6_addr(netif, addrindex),
+                         sizeof(ip6_addr_p_t), NULL);
+}
+
+/** Write a x.y.z.ip6.arpa -> hostname.local PTR RR to outpacket */
+static err_t
+mdns_add_hostv6_ptr_answer(struct mdns_outpacket *reply, struct mdns_outmsg *msg,
+                           struct netif *netif, int addrindex)
+{
+  err_t res;
+  u32_t ttl = MDNS_TTL_120;
+  struct mdns_domain host, revhost;
+  mdns_build_host_domain(&host, netif_mdns_data(netif));
+  mdns_build_reverse_v6_domain(&revhost, netif_ip6_addr(netif, addrindex));
+  /* When answering to a legacy querier, we need to repeat the question and
+   * limit the ttl to the short legacy ttl */
+  if(msg->legacy_query) {
+    /* Repeating the question only needs to be done for the question asked
+     * (max one question), not for the additional records. */
+    if(reply->questions < 1) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Add question for legacy query\n"));
+      res = mdns_add_question(reply, &revhost, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, 0);
+      if (res != ERR_OK) {
+        return res;
+      }
+      reply->questions = 1;
+    }
+    /* ttl of legacy answer may not be greater then 10 seconds */
+    ttl = MDNS_TTL_10;
+  }
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with v6 PTR record\n"));
+  return mdns_add_answer(reply, &revhost, DNS_RRTYPE_PTR, DNS_RRCLASS_IN,
+                         msg->cache_flush, ttl, NULL, 0, &host);
+}
+#endif
+
+/** Write an all-services -> servicetype PTR RR to outpacket */
+static err_t
+mdns_add_servicetype_ptr_answer(struct mdns_outpacket *reply, struct mdns_outmsg *msg,
+                                struct mdns_service *service)
+{
+  err_t res;
+  u32_t ttl = MDNS_TTL_4500;
+  struct mdns_domain service_type, service_dnssd;
+  mdns_build_service_domain(&service_type, service, 0);
+  mdns_build_dnssd_domain(&service_dnssd);
+  /* When answering to a legacy querier, we need to repeat the question and
+   * limit the ttl to the short legacy ttl */
+  if(msg->legacy_query) {
+    /* Repeating the question only needs to be done for the question asked
+     * (max one question), not for the additional records. */
+    if(reply->questions < 1) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Add question for legacy query\n"));
+      res = mdns_add_question(reply, &service_dnssd, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, 0);
+      if (res != ERR_OK) {
+        return res;
+      }
+      reply->questions = 1;
+    }
+    /* ttl of legacy answer may not be greater then 10 seconds */
+    ttl = MDNS_TTL_10;
+  }
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with service type PTR record\n"));
+  return mdns_add_answer(reply, &service_dnssd, DNS_RRTYPE_PTR, DNS_RRCLASS_IN,
+                         0, ttl, NULL, 0, &service_type);
+}
+
+/** Write a servicetype -> servicename PTR RR to outpacket */
+static err_t
+mdns_add_servicename_ptr_answer(struct mdns_outpacket *reply, struct mdns_outmsg *msg,
+                                struct mdns_service *service)
+{
+  err_t res;
+  u32_t ttl = MDNS_TTL_120;
+  struct mdns_domain service_type, service_instance;
+  mdns_build_service_domain(&service_type, service, 0);
+  mdns_build_service_domain(&service_instance, service, 1);
+  /* When answering to a legacy querier, we need to repeat the question and
+   * limit the ttl to the short legacy ttl */
+  if(msg->legacy_query) {
+    /* Repeating the question only needs to be done for the question asked
+     * (max one question), not for the additional records. */
+    if(reply->questions < 1) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Add question for legacy query\n"));
+      res = mdns_add_question(reply, &service_type, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, 0);
+      if (res != ERR_OK) {
+        return res;
+      }
+      reply->questions = 1;
+    }
+    /* ttl of legacy answer may not be greater then 10 seconds */
+    ttl = MDNS_TTL_10;
+  }
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with service name PTR record\n"));
+  return mdns_add_answer(reply, &service_type, DNS_RRTYPE_PTR, DNS_RRCLASS_IN,
+                         0, ttl, NULL, 0, &service_instance);
+}
+
+/** Write a SRV RR to outpacket */
+static err_t
+mdns_add_srv_answer(struct mdns_outpacket *reply, struct mdns_outmsg *msg,
+                    struct mdns_host *mdns, struct mdns_service *service)
+{
+  err_t res;
+  u32_t ttl = MDNS_TTL_120;
+  struct mdns_domain service_instance, srvhost;
+  u16_t srvdata[3];
+  mdns_build_service_domain(&service_instance, service, 1);
+  mdns_build_host_domain(&srvhost, mdns);
+  if (msg->legacy_query) {
+    /* RFC 6762 section 18.14:
+     * In legacy unicast responses generated to answer legacy queries,
+     * name compression MUST NOT be performed on SRV records.
+     */
+    srvhost.skip_compression = 1;
+    /* When answering to a legacy querier, we need to repeat the question and
+     * limit the ttl to the short legacy ttl.
+     * Repeating the question only needs to be done for the question asked
+     * (max one question), not for the additional records. */
+    if(reply->questions < 1) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Add question for legacy query\n"));
+      res = mdns_add_question(reply, &service_instance, DNS_RRTYPE_SRV, DNS_RRCLASS_IN, 0);
+      if (res != ERR_OK) {
+        return res;
+      }
+      reply->questions = 1;
+    }
+    /* ttl of legacy answer may not be greater then 10 seconds */
+    ttl = MDNS_TTL_10;
+  }
+  srvdata[0] = lwip_htons(SRV_PRIORITY);
+  srvdata[1] = lwip_htons(SRV_WEIGHT);
+  srvdata[2] = lwip_htons(service->port);
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with SRV record\n"));
+  return mdns_add_answer(reply, &service_instance, DNS_RRTYPE_SRV, DNS_RRCLASS_IN,
+                         msg->cache_flush, ttl,
+                         (const u8_t *) &srvdata, sizeof(srvdata), &srvhost);
+}
+
+/** Write a TXT RR to outpacket */
+static err_t
+mdns_add_txt_answer(struct mdns_outpacket *reply, struct mdns_outmsg *msg,
+                    struct mdns_service *service)
+{
+  err_t res;
+  u32_t ttl = MDNS_TTL_120;
+  struct mdns_domain service_instance;
+  mdns_build_service_domain(&service_instance, service, 1);
+  mdns_prepare_txtdata(service);
+  /* When answering to a legacy querier, we need to repeat the question and
+   * limit the ttl to the short legacy ttl */
+  if(msg->legacy_query) {
+    /* Repeating the question only needs to be done for the question asked
+     * (max one question), not for the additional records. */
+    if(reply->questions < 1) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Add question for legacy query\n"));
+      res = mdns_add_question(reply, &service_instance, DNS_RRTYPE_TXT, DNS_RRCLASS_IN, 0);
+      if (res != ERR_OK) {
+        return res;
+      }
+      reply->questions = 1;
+    }
+    /* ttl of legacy answer may not be greater then 10 seconds */
+    ttl = MDNS_TTL_10;
+  }
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with TXT record\n"));
+  return mdns_add_answer(reply, &service_instance, DNS_RRTYPE_TXT, DNS_RRCLASS_IN,
+                         msg->cache_flush, ttl, (u8_t *) &service->txtdata.name,
+                         service->txtdata.length, NULL);
+}
+
+
+static err_t
+mdns_add_probe_questions_to_outpacket(struct mdns_outpacket *outpkt, struct mdns_outmsg *msg,
+                                      struct netif *netif)
+{
+  err_t res;
+  int i;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+
+  /* Write host questions (probing or legacy query) */
+  if(msg->host_questions & QUESTION_PROBE_HOST_ANY) {
+    res = mdns_add_any_host_question(outpkt, mdns, 1);
+    if (res != ERR_OK) {
+      return res;
+    }
+    outpkt->questions++;
+  }
+  /* Write service questions (probing or legacy query) */
+  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
+    struct mdns_service* service = mdns->services[i];
+    if (!service) {
+      continue;
+    }
+    if(msg->serv_questions[i] & QUESTION_PROBE_SERVICE_NAME_ANY) {
+      res = mdns_add_any_service_question(outpkt, service, 1);
+      if (res != ERR_OK) {
+        return res;
+      }
+      outpkt->questions++;
+    }
+  }
+  return ERR_OK;
+}
+
+#if LWIP_MDNS_SEARCH
+static err_t
+mdns_add_query_question_to_outpacket(struct mdns_outpacket *outpkt, struct mdns_outmsg *msg)
+{
+  err_t res;
+  /* Write legacy query question */
+  if(msg->query) {
+    struct mdns_request *req = msg->query;
+    struct mdns_domain dom;
+    /* Build question domain */
+    mdns_build_request_domain(&dom, req, req->name[0]);
+    /* Add query question to output packet */
+    res = mdns_add_question(outpkt, &dom, req->qtype, DNS_RRCLASS_IN, 0);
+    if (res != ERR_OK) {
+      return res;
+    }
+    outpkt->questions++;
+  }
+  return ERR_OK;
+}
+#endif
+
+/**
+ * Create packet with chosen answers as a reply
+ *
+ * Add all selected answers / questions
+ * Add additional answers based on the selected answers
+ */
+err_t
+mdns_create_outpacket(struct netif *netif, struct mdns_outmsg *msg,
+                      struct mdns_outpacket *outpkt)
+{
+  struct mdns_host *mdns = netif_mdns_data(netif);
+  struct mdns_service *service;
+  err_t res;
+  int i;
+  u16_t answers = 0;
+
+#if LWIP_MDNS_SEARCH
+  res = mdns_add_query_question_to_outpacket(outpkt, msg);
+  if (res != ERR_OK) {
+    return res;
+  }
+#endif
+
+  res = mdns_add_probe_questions_to_outpacket(outpkt, msg, netif);
+  if (res != ERR_OK) {
+    return res;
+  }
+
+  /* Write answers to host questions */
+#if LWIP_IPV4
+  if (msg->host_replies & REPLY_HOST_A) {
+    res = mdns_add_a_answer(outpkt, msg, netif);
+    if (res != ERR_OK) {
+      return res;
+    }
+    answers++;
+  }
+  if (msg->host_replies & REPLY_HOST_PTR_V4) {
+    res = mdns_add_hostv4_ptr_answer(outpkt, msg, netif);
+    if (res != ERR_OK) {
+      return res;
+    }
+    answers++;
+  }
+#endif
+#if LWIP_IPV6
+  if (msg->host_replies & REPLY_HOST_AAAA) {
+    int addrindex;
+    for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; addrindex++) {
+      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, addrindex))) {
+        res = mdns_add_aaaa_answer(outpkt, msg, netif, addrindex);
+        if (res != ERR_OK) {
+          return res;
+        }
+        answers++;
+      }
+    }
+  }
+  if (msg->host_replies & REPLY_HOST_PTR_V6) {
+    u8_t rev_addrs = msg->host_reverse_v6_replies;
+    int addrindex = 0;
+    while (rev_addrs) {
+      if (rev_addrs & 1) {
+        res = mdns_add_hostv6_ptr_answer(outpkt, msg, netif, addrindex);
+        if (res != ERR_OK) {
+          return res;
+        }
+        answers++;
+      }
+      addrindex++;
+      rev_addrs >>= 1;
+    }
+  }
+#endif
+
+  /* Write answers to service questions */
+  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
+    service = mdns->services[i];
+    if (!service) {
+      continue;
+    }
+
+    if (msg->serv_replies[i] & REPLY_SERVICE_TYPE_PTR) {
+      res = mdns_add_servicetype_ptr_answer(outpkt, msg, service);
+      if (res != ERR_OK) {
+        return res;
+      }
+      answers++;
+    }
+
+    if (msg->serv_replies[i] & REPLY_SERVICE_NAME_PTR) {
+      res = mdns_add_servicename_ptr_answer(outpkt, msg, service);
+      if (res != ERR_OK) {
+        return res;
+      }
+      answers++;
+    }
+
+    if (msg->serv_replies[i] & REPLY_SERVICE_SRV) {
+      res = mdns_add_srv_answer(outpkt, msg, mdns, service);
+      if (res != ERR_OK) {
+        return res;
+      }
+      answers++;
+    }
+
+    if (msg->serv_replies[i] & REPLY_SERVICE_TXT) {
+      res = mdns_add_txt_answer(outpkt, msg, service);
+      if (res != ERR_OK) {
+        return res;
+      }
+      answers++;
+    }
+  }
+
+  /* if this is a response, the data above is anwers, else this is a probe and
+   * the answers above goes into auth section */
+  if (msg->flags & DNS_FLAG1_RESPONSE) {
+    outpkt->answers += answers;
+  } else {
+    outpkt->authoritative += answers;
+  }
+
+  /* All answers written, add additional RRs */
+  for (i = 0; i < MDNS_MAX_SERVICES; i++) {
+    service = mdns->services[i];
+    if (!service) {
+      continue;
+    }
+
+    if (msg->serv_replies[i] & REPLY_SERVICE_NAME_PTR) {
+      /* Our service instance requested, include SRV & TXT
+       * if they are already not requested. */
+      if (!(msg->serv_replies[i] & REPLY_SERVICE_SRV)) {
+        res = mdns_add_srv_answer(outpkt, msg, mdns, service);
+        if (res != ERR_OK) {
+          return res;
+        }
+        outpkt->additional++;
+      }
+
+      if (!(msg->serv_replies[i] & REPLY_SERVICE_TXT)) {
+        res = mdns_add_txt_answer(outpkt, msg, service);
+        if (res != ERR_OK) {
+          return res;
+        }
+        outpkt->additional++;
+      }
+    }
+
+    /* If service instance, SRV, record or an IP address is requested,
+     * supply all addresses for the host
+     */
+    if ((msg->serv_replies[i] & (REPLY_SERVICE_NAME_PTR | REPLY_SERVICE_SRV)) ||
+        (msg->host_replies & (REPLY_HOST_A | REPLY_HOST_AAAA))) {
+#if LWIP_IPV6
+      if (!(msg->host_replies & REPLY_HOST_AAAA)) {
+        int addrindex;
+        for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; addrindex++) {
+          if (ip6_addr_isvalid(netif_ip6_addr_state(netif, addrindex))) {
+            res = mdns_add_aaaa_answer(outpkt, msg, netif, addrindex);
+            if (res != ERR_OK) {
+              return res;
+            }
+            outpkt->additional++;
+          }
+        }
+      }
+#endif
+#if LWIP_IPV4
+      if (!(msg->host_replies & REPLY_HOST_A) &&
+          !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
+        res = mdns_add_a_answer(outpkt, msg, netif);
+        if (res != ERR_OK) {
+          return res;
+        }
+        outpkt->additional++;
+      }
+#endif
+    }
+  }
+
+  return res;
+}
+
+/**
+ * Send chosen answers as a reply
+ *
+ * Create the packet
+ * Send the packet
+ */
+err_t
+mdns_send_outpacket(struct mdns_outmsg *msg, struct netif *netif)
+{
+  struct mdns_outpacket outpkt;
+  err_t res;
+
+  memset(&outpkt, 0, sizeof(outpkt));
+
+  res = mdns_create_outpacket(netif, msg, &outpkt);
+  if (res != ERR_OK) {
+    goto cleanup;
+  }
+
+  if (outpkt.pbuf) {
+    struct dns_hdr hdr;
+
+    /* Write header */
+    memset(&hdr, 0, sizeof(hdr));
+    hdr.flags1 = msg->flags;
+    hdr.numquestions = lwip_htons(outpkt.questions);
+    hdr.numanswers = lwip_htons(outpkt.answers);
+    hdr.numauthrr = lwip_htons(outpkt.authoritative);
+    hdr.numextrarr = lwip_htons(outpkt.additional);
+    hdr.id = lwip_htons(msg->tx_id);
+    pbuf_take(outpkt.pbuf, &hdr, sizeof(hdr));
+
+    /* Shrink packet */
+    pbuf_realloc(outpkt.pbuf, outpkt.write_offset);
+
+    /* Send created packet */
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Sending packet, len=%d\n",
+                outpkt.write_offset));
+
+    res = udp_sendto_if(get_mdns_pcb(), outpkt.pbuf, &msg->dest_addr, msg->dest_port, netif);
+  }
+
+cleanup:
+  if (outpkt.pbuf) {
+    pbuf_free(outpkt.pbuf);
+    outpkt.pbuf = NULL;
+  }
+  return res;
+}
+
+#if LWIP_IPV4
+/**
+ *  Called by timeouts when timer is passed, allows multicast IPv4 traffic again.
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_multicast_timeout_reset_ipv4(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast timeout finished - IPv4\n"));
+
+  mdns->ipv4.multicast_timeout = 0;
+}
+
+/**
+ *  Called by timeouts when timer is passed, allows direct multicast IPv4 probe
+ *  response traffic again and sends out probe response if one was pending
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_multicast_probe_timeout_reset_ipv4(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+  err_t res;
+
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast probe timeout finished - IPv4\n"));
+
+  mdns->ipv4.multicast_probe_timeout = 0;
+
+  if (mdns->ipv4.multicast_msg_waiting) {
+    res = mdns_send_outpacket(&mdns->ipv4.delayed_msg_multicast, netif);
+    if(res != ERR_OK) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Waiting probe multicast send failed - IPv4\n"));
+    }
+    else {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Waiting probe multicast send successful - IPv4\n"));
+      mdns_clear_outmsg(&mdns->ipv4.delayed_msg_multicast);
+      mdns->ipv4.multicast_msg_waiting = 0;
+      mdns_start_multicast_timeouts_ipv4(netif);
+    }
+  }
+}
+
+/**
+ *  Called by timeouts when timer is passed, allows to send an answer on a QU
+ *  question via multicast.
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_multicast_timeout_25ttl_reset_ipv4(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast timeout 1/4 of ttl finished - IPv4\n"));
+
+  mdns->ipv4.multicast_timeout_25TTL = 0;
+}
+
+/**
+ *  Called by timeouts when timer is passed, sends out delayed multicast IPv4 response.
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_send_multicast_msg_delayed_ipv4(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+  err_t res;
+
+  res = mdns_send_outpacket(&mdns->ipv4.delayed_msg_multicast, netif);
+  if(res != ERR_OK) {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Delayed multicast send failed - IPv4\n"));
+  }
+  else {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Delayed multicast send successful - IPv4\n"));
+    mdns_clear_outmsg(&mdns->ipv4.delayed_msg_multicast);
+    mdns->ipv4.multicast_msg_waiting = 0;
+    mdns_start_multicast_timeouts_ipv4(netif);
+  }
+}
+
+/**
+ *  Called by timeouts when timer is passed, sends out delayed unicast IPv4 response.
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_send_unicast_msg_delayed_ipv4(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+  err_t res;
+
+  res = mdns_send_outpacket(&mdns->ipv4.delayed_msg_unicast, netif);
+  if(res != ERR_OK) {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Delayed unicast send failed - IPv4\n"));
+  }
+  else {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Delayed unicast send successful - IPv4\n"));
+    mdns_clear_outmsg(&mdns->ipv4.delayed_msg_unicast);
+    mdns->ipv4.unicast_msg_in_use = 0;
+  }
+}
+
+/** Start all multicast timeouts for IPv4
+ *  Timeouts started:
+ *    - do not multicast within one second
+ *    - do not multicast a probe response within 250ms
+ *    - send a multicast answer on a QU question if not send recently.
+ *
+ *  @param netif network interface to start timeouts on
+ */
+void
+mdns_start_multicast_timeouts_ipv4(struct netif *netif)
+{
+  struct mdns_host *mdns = netif_mdns_data(netif);
+
+  mdns_set_timeout(netif, MDNS_MULTICAST_TIMEOUT, mdns_multicast_timeout_reset_ipv4,
+                   &mdns->ipv4.multicast_timeout);
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast timeout started - IPv4\n"));
+  mdns_set_timeout(netif, MDNS_MULTICAST_PROBE_TIMEOUT, mdns_multicast_probe_timeout_reset_ipv4,
+                   &mdns->ipv4.multicast_probe_timeout);
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast probe timeout started - IPv4\n"));
+  mdns_set_timeout(netif, MDNS_MULTICAST_TIMEOUT_25TTL, mdns_multicast_timeout_25ttl_reset_ipv4,
+                   &mdns->ipv4.multicast_timeout_25TTL);
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast timeout 1/4 of ttl started - IPv4\n"));
+}
+#endif
+
+#if LWIP_IPV6
+/**
+ *  Called by timeouts when timer is passed, allows multicast IPv6 traffic again.
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_multicast_timeout_reset_ipv6(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast timeout finished - IPv6\n"));
+
+  mdns->ipv6.multicast_timeout = 0;
+}
+
+/**
+ *  Called by timeouts when timer is passed, allows direct multicast IPv6 probe
+ *  response traffic again and sends out probe response if one was pending
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_multicast_probe_timeout_reset_ipv6(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+  err_t res;
+
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast probe timeout finished - IPv6\n"));
+
+  mdns->ipv6.multicast_probe_timeout = 0;
+
+  if (mdns->ipv6.multicast_msg_waiting) {
+    res = mdns_send_outpacket(&mdns->ipv6.delayed_msg_multicast, netif);
+    if(res != ERR_OK) {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Waiting probe multicast send failed - IPv6\n"));
+    }
+    else {
+      LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Waiting probe multicast send successful - IPv6\n"));
+      mdns_clear_outmsg(&mdns->ipv6.delayed_msg_multicast);
+      mdns->ipv6.multicast_msg_waiting = 0;
+      mdns_start_multicast_timeouts_ipv6(netif);
+    }
+  }
+}
+
+/**
+ *  Called by timeouts when timer is passed, allows to send an answer on a QU
+ *  question via multicast.
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_multicast_timeout_25ttl_reset_ipv6(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast timeout 1/4 of ttl finished - IPv6\n"));
+
+  mdns->ipv6.multicast_timeout_25TTL = 0;
+}
+
+/**
+ *  Called by timeouts when timer is passed, sends out delayed multicast IPv6 response.
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_send_multicast_msg_delayed_ipv6(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+  err_t res;
+
+  res = mdns_send_outpacket(&mdns->ipv6.delayed_msg_multicast, netif);
+  if(res != ERR_OK) {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Delayed multicast send failed - IPv6\n"));
+  }
+  else {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Delayed multicast send successful - IPv6\n"));
+    mdns_clear_outmsg(&mdns->ipv6.delayed_msg_multicast);
+    mdns->ipv6.multicast_msg_waiting = 0;
+    mdns_start_multicast_timeouts_ipv6(netif);
+  }
+}
+
+/**
+ *  Called by timeouts when timer is passed, sends out delayed unicast IPv6 response.
+ *
+ *  @param arg  pointer to netif of timeout.
+ */
+void
+mdns_send_unicast_msg_delayed_ipv6(void *arg)
+{
+  struct netif *netif = (struct netif*)arg;
+  struct mdns_host *mdns = netif_mdns_data(netif);
+  err_t res;
+
+  res = mdns_send_outpacket(&mdns->ipv6.delayed_msg_unicast, netif);
+  if(res != ERR_OK) {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Delayed unicast send failed - IPv6\n"));
+  }
+  else {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Delayed unicast send successful - IPv6\n"));
+    mdns_clear_outmsg(&mdns->ipv6.delayed_msg_unicast);
+    mdns->ipv6.unicast_msg_in_use = 0;
+  }
+}
+
+/** Start all multicast timeouts for IPv6
+ *  Timeouts started:
+ *    - do not multicast within one second
+ *    - do not multicast a probe response within 250ms
+ *    - send a multicast answer on a QU question if not send recently.
+ *
+ *  @param netif network interface to start timeouts on
+ */
+void
+mdns_start_multicast_timeouts_ipv6(struct netif *netif)
+{
+  struct mdns_host *mdns = netif_mdns_data(netif);
+
+  mdns_set_timeout(netif, MDNS_MULTICAST_TIMEOUT, mdns_multicast_timeout_reset_ipv6,
+                   &mdns->ipv6.multicast_timeout);
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast timeout started - IPv6\n"));
+  mdns_set_timeout(netif, MDNS_MULTICAST_PROBE_TIMEOUT, mdns_multicast_probe_timeout_reset_ipv6,
+                   &mdns->ipv6.multicast_probe_timeout);
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast probe timeout started - IPv6\n"));
+  mdns_set_timeout(netif, MDNS_MULTICAST_TIMEOUT_25TTL, mdns_multicast_timeout_25ttl_reset_ipv6,
+                   &mdns->ipv6.multicast_timeout_25TTL);
+  LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: multicast timeout 1/4 of ttl started - IPv6\n"));
+}
+#endif
+
+/**
+ *  This function clears the output message without changing the destination
+ *  address or port. This is useful for clearing the delayed msg structs without
+ *  losing the set IP.
+ *
+ *  @param outmsg pointer to output message to clear.
+ */
+static void
+mdns_clear_outmsg(struct mdns_outmsg *outmsg)
+{
+  int i;
+
+  outmsg->tx_id = 0;
+  outmsg->flags = 0;
+  outmsg->cache_flush = 0;
+  outmsg->unicast_reply_requested = 0;
+  outmsg->legacy_query = 0;
+  outmsg->probe_query_recv = 0;
+  outmsg->host_questions = 0;
+  outmsg->host_replies = 0;
+  outmsg->host_reverse_v6_replies = 0;
+
+  for(i = 0; i < MDNS_MAX_SERVICES; i++) {
+    outmsg->serv_questions[i] = 0;
+    outmsg->serv_replies[i] = 0;
+  }
+}
+
+/**
+ *  Sets a timer that calls the handler when finished.
+ *  Depending on the busy_flag the timer is restarted or started. The flag is
+ *  set before return. Sys_timeout does not give us this functionality.
+ *
+ *  @param netif      Network interface info
+ *  @param msecs      Time value to set
+ *  @param handler    Callback function to call
+ *  @param busy_flag  Pointer to flag that displays if the timer is running or not.
+ */
+void
+mdns_set_timeout(struct netif *netif, u32_t msecs, sys_timeout_handler handler,
+                 u8_t *busy_flag)
+{
+  if(*busy_flag) {
+    /* restart timer */
+    sys_untimeout(handler, netif);
+    sys_timeout(msecs, handler, netif);
+  }
+  else {
+    /* start timer */
+    sys_timeout(msecs, handler, netif);
+  }
+  /* Now we have a timer running */
+  *busy_flag = 1;
+}
+
+#ifdef LWIP_MDNS_SEARCH
+/**
+ * Send search request containing all our known data
+ * @param req The request to send
+ * @param netif The network interface to send on
+ * @param destination The target address to send to (usually multicast address)
+ */
+err_t
+mdns_send_request(struct mdns_request *req, struct netif *netif, const ip_addr_t *destination)
+{
+  struct mdns_outmsg outmsg;
+  err_t res;
+
+  memset(&outmsg, 0, sizeof(outmsg));
+  outmsg.query = req;
+  outmsg.dest_port = LWIP_IANA_PORT_MDNS;
+  SMEMCPY(&outmsg.dest_addr, destination, sizeof(outmsg.dest_addr));
+  res = mdns_send_outpacket(&outmsg, netif);
+  if(res != ERR_OK) {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Multicast query request send failed\n"));
+  }
+  else {
+    LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Multicast query request send successful\n"));
+  }
+  return res;
+}
+#endif
+
+#endif /* LWIP_MDNS_RESPONDER */
diff --git a/src/apps/mqtt/mqtt.c b/src/apps/mqtt/mqtt.c
index 595da77..699061b 100644
--- a/src/apps/mqtt/mqtt.c
+++ b/src/apps/mqtt/mqtt.c
@@ -603,14 +603,13 @@
       }
 
       /* If time for a keep alive message to be sent, transmission has been idle for keep_alive time */
+      client->cyclic_tick++;
       if ((client->cyclic_tick * MQTT_CYCLIC_TIMER_INTERVAL) >= client->keep_alive) {
         LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_cyclic_timer: Sending keep-alive message to server\n"));
         if (mqtt_output_check_space(&client->output, 0) != 0) {
           mqtt_output_append_fixed_header(&client->output, MQTT_MSG_TYPE_PINGREQ, 0, 0, 0, 0);
           client->cyclic_tick = 0;
         }
-      } else {
-        client->cyclic_tick++;
       }
     }
   } else {
@@ -653,7 +652,7 @@
  * @param result Result code from server
  */
 static void
-mqtt_incomming_suback(struct mqtt_request_t *r, u8_t result)
+mqtt_incoming_suback(struct mqtt_request_t *r, u8_t result)
 {
   if (r->cb != NULL) {
     r->cb(r->arg, result < 3 ? ERR_OK : ERR_ABRT);
@@ -669,13 +668,11 @@
  * @param remaining_length Remaining length of complete message
  */
 static mqtt_connection_status_t
-mqtt_message_received(mqtt_client_t *client, u8_t fixed_hdr_len, u16_t length, u32_t remaining_length)
+mqtt_message_received(mqtt_client_t *client, u8_t fixed_hdr_len, u16_t length, u32_t remaining_length,
+                      u8_t *var_hdr_payload)
 {
   mqtt_connection_status_t res = MQTT_CONNECT_ACCEPTED;
 
-  u8_t *var_hdr_payload = client->rx_buffer + fixed_hdr_len;
-  size_t var_hdr_payload_bufsize = sizeof(client->rx_buffer) - fixed_hdr_len;
-
   /* Control packet type */
   u8_t pkt_type = MQTT_CTL_PACKET_TYPE(client->rx_buffer[0]);
   u16_t pkt_id = 0;
@@ -698,7 +695,7 @@
         client->cyclic_tick = 0;
         client->conn_state = MQTT_CONNECTED;
         /* Notify upper layer */
-        if (client->connect_cb != 0) {
+        if (client->connect_cb != NULL) {
           client->connect_cb(client, client->connect_arg, res);
         }
       }
@@ -713,8 +710,9 @@
     u16_t payload_length = length;
     u8_t qos = MQTT_CTL_PACKET_QOS(client->rx_buffer[0]);
 
-    if (client->msg_idx <= MQTT_VAR_HEADER_BUFFER_LEN) {
-      /* Should have topic and pkt id*/
+    if (client->msg_idx == (u32_t)(fixed_hdr_len + length)) {
+      /* First publish message frame. Should have topic and pkt id*/
+      size_t var_hdr_payload_bufsize = sizeof(client->rx_buffer) - fixed_hdr_len;
       u8_t *topic;
       u16_t after_topic;
       u8_t bkp;
@@ -759,7 +757,7 @@
       payload_length = length - after_topic;
       payload_offset = after_topic;
 
-      LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_incomming_publish: Received message with QoS %d at topic: %s, payload length %"U32_F"\n",
+      LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_incoming_publish: Received message with QoS %d at topic: %s, payload length %"U32_F"\n",
                                      qos, topic, remaining_length + payload_length));
       if (client->pub_cb != NULL) {
         client->pub_cb(client->inpub_arg, (const char *)topic, remaining_length + payload_length);
@@ -779,12 +777,16 @@
       if (remaining_length == 0 && qos > 0) {
         /* Send PUBACK for QoS 1 or PUBREC for QoS 2 */
         u8_t resp_msg = (qos == 1) ? MQTT_MSG_TYPE_PUBACK : MQTT_MSG_TYPE_PUBREC;
-        LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_incomming_publish: Sending publish response: %s with pkt_id: %d\n",
+        LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_incoming_publish: Sending publish response: %s with pkt_id: %d\n",
                                        mqtt_msg_type_to_str(resp_msg), client->inpub_pkt_id));
         pub_ack_rec_rel_response(client, resp_msg, client->inpub_pkt_id, 0);
       }
     }
   } else {
+    if (length < 2) {
+      LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short message\n"));
+      goto out_disconnect;
+    }
     /* Get packet identifier */
     pkt_id = (u16_t)var_hdr_payload[0] << 8;
     pkt_id |= (u16_t)var_hdr_payload[1];
@@ -810,7 +812,7 @@
             LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_message_received: To small SUBACK packet\n"));
             goto out_disconnect;
           } else {
-            mqtt_incomming_suback(r, var_hdr_payload[2]);
+            mqtt_incoming_suback(r, var_hdr_payload[2]);
           }
         } else if (r->cb != NULL) {
           r->cb(r->arg, ERR_OK);
@@ -871,7 +873,7 @@
           LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_parse_incoming: Remaining length after fixed header: %"U32_F"\n", msg_rem_len));
           if (msg_rem_len == 0) {
             /* Complete message with no extra headers of payload received */
-            mqtt_message_received(client, fixed_hdr_len, 0, 0);
+            mqtt_message_received(client, fixed_hdr_len, 0, 0, NULL);
             client->msg_idx = 0;
             fixed_hdr_len = 0;
           } else {
@@ -884,6 +886,8 @@
     } else {
       /* Fixed header has been parsed, parse variable header */
       u16_t cpy_len, buffer_space;
+      u8_t *var_hdr_payload;
+      mqtt_connection_status_t res;
 
       /* Allow to copy the lesser one of available length in input data or bytes remaining in message */
       cpy_len = (u16_t)LWIP_MIN((u16_t)(p->tot_len - in_offset), msg_rem_len);
@@ -893,7 +897,13 @@
       if (cpy_len > buffer_space) {
         cpy_len = buffer_space;
       }
-      pbuf_copy_partial(p, client->rx_buffer + fixed_hdr_len, cpy_len, in_offset);
+      /* Adjust cpy_len to ensure zero-copy operation for remaining parts of current message */
+      if (client->msg_idx >= MQTT_VAR_HEADER_BUFFER_LEN) {
+        if (cpy_len > (p->len - in_offset))
+          cpy_len = p->len - in_offset;
+      }
+      var_hdr_payload = (u8_t*)pbuf_get_contiguous(p, client->rx_buffer + fixed_hdr_len,
+                                                   buffer_space, cpy_len, in_offset);
 
       /* Advance get and put indexes  */
       client->msg_idx += cpy_len;
@@ -901,18 +911,16 @@
       msg_rem_len -= cpy_len;
 
       LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_parse_incoming: msg_idx: %"U32_F", cpy_len: %"U16_F", remaining %"U32_F"\n", client->msg_idx, cpy_len, msg_rem_len));
-      if ((msg_rem_len == 0) || (cpy_len == buffer_space)) {
-        /* Whole message received or buffer is full */
-        mqtt_connection_status_t res = mqtt_message_received(client, fixed_hdr_len, cpy_len, msg_rem_len);
-        if (res != MQTT_CONNECT_ACCEPTED) {
-          return res;
-        }
-        if (msg_rem_len == 0) {
-          /* Reset parser state */
-          client->msg_idx = 0;
-          /* msg_tot_len = 0; */
-          fixed_hdr_len = 0;
-        }
+      /* Whole or partial message received */
+      res = mqtt_message_received(client, fixed_hdr_len, cpy_len, msg_rem_len, var_hdr_payload);
+      if (res != MQTT_CONNECT_ACCEPTED) {
+        return res;
+      }
+      if (msg_rem_len == 0) {
+        /* Reset parser state */
+        client->msg_idx = 0;
+        /* msg_tot_len = 0; */
+        fixed_hdr_len = 0;
       }
     }
   }
@@ -1012,7 +1020,7 @@
   LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_tcp_err_cb: TCP error callback: error %d, arg: %p\n", err, arg));
   LWIP_ASSERT("mqtt_tcp_err_cb: client != NULL", client != NULL);
   /* Set conn to null before calling close as pcb is already deallocated*/
-  client->conn = 0;
+  client->conn = NULL;
   mqtt_close(client, MQTT_CONNECT_DISCONNECTED);
 }
 
@@ -1163,7 +1171,7 @@
  * @param client MQTT client
  * @param topic topic to subscribe to
  * @param qos Quality of service, 0 1 or 2 (only used for subscribe)
- * @param cb Callback to call when subscribe/unsubscribe reponse is received
+ * @param cb Callback to call when subscribe/unsubscribe response is received
  * @param arg User supplied argument to publish callback
  * @param sub 1 for subscribe, 0 for unsubscribe
  * @return ERR_OK if successful, @see err_t enum for other results
@@ -1289,6 +1297,9 @@
   u16_t remaining_length = 2 + 4 + 1 + 1 + 2;
   u8_t flags = 0, will_topic_len = 0, will_msg_len = 0;
   u16_t client_user_len = 0, client_pass_len = 0;
+  mqtt_incoming_data_cb_t data_cb;
+  mqtt_incoming_publish_cb_t pub_cb;
+  void *inpub_arg;
 
   LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("mqtt_client_connect: client != NULL", client != NULL);
@@ -1301,8 +1312,15 @@
     return ERR_ISCONN;
   }
 
-  /* Wipe clean */
+  /* Wipe clean, but keep callbacks */
+  data_cb = client->data_cb;
+  pub_cb = client->pub_cb;
+  inpub_arg = client->inpub_arg;
   memset(client, 0, sizeof(mqtt_client_t));
+  client->data_cb = data_cb;
+  client->pub_cb = pub_cb;
+  client->inpub_arg = inpub_arg;
+
   client->connect_arg = arg;
   client->connect_cb = cb;
   client->keep_alive = client_info->keep_alive;
diff --git a/src/apps/smtp/smtp.c b/src/apps/smtp/smtp.c
index 55303c3..a1780bd 100644
--- a/src/apps/smtp/smtp.c
+++ b/src/apps/smtp/smtp.c
@@ -1,12 +1,12 @@
 /**
  * @file
  * SMTP client module
- * 
+ *
  * Author: Simon Goldschmidt
  *
  * @defgroup smtp SMTP client
  * @ingroup apps
- * 
+ *
  * This is simple SMTP client for raw API.
  * It is a minimal implementation of SMTP as specified in RFC 5321.
  *
@@ -29,7 +29,7 @@
 
  * When using from any other thread than the tcpip_thread (for NO_SYS==0), use
  * smtp_send_mail_int()!
- * 
+ *
  * SMTP_BODYDH usage:
 @code{.c}
  int my_smtp_bodydh_fn(void *arg, struct smtp_bodydh *bdh)
@@ -42,11 +42,11 @@
     ++bdh->state;
     return BDH_WORKING;
  }
- 
- smtp_send_mail_bodycback("sender", "recipient", "subject", 
+
+ smtp_send_mail_bodycback("sender", "recipient", "subject",
                 my_smtp_bodydh_fn, my_smtp_result_fn, some_argument);
 @endcode
- * 
+ *
  * @todo:
  * - attachments (the main difficulty here is streaming base64-encoding to
  *   prevent having to allocate a buffer for the whole encoded file at once)
@@ -577,7 +577,7 @@
  * @param body email body (must be NULL-terminated)
  * @param callback_fn callback function
  * @param callback_arg user argument to callback_fn
- * @returns - ERR_OK if structures were allocated and no error occured starting the connection
+ * @returns - ERR_OK if structures were allocated and no error occurred starting the connection
  *            (this does not mean the email has been successfully sent!)
  *          - another err_t on error.
  */
@@ -1498,7 +1498,6 @@
   LWIP_ASSERT("string is too long", len <= 0xffff);
   s->subject_len = (u16_t)len;
   s->body = NULL;
-  LWIP_ASSERT("string is too long", len <= 0xffff);
   s->callback_fn = callback_fn;
   s->callback_arg = callback_arg;
   s->bodydh->callback_fn = bodycback_fn;
diff --git a/src/apps/snmp/snmp_core.c b/src/apps/snmp/snmp_core.c
index 987f106..04e0c31 100644
--- a/src/apps/snmp/snmp_core.c
+++ b/src/apps/snmp/snmp_core.c
@@ -36,14 +36,14 @@
 /**
  * @defgroup snmp SNMPv2c/v3 agent
  * @ingroup apps
- * SNMPv2c and SNMPv3 compatible agent\n
- * There is also a MIB compiler and a MIB viewer in lwIP contrib repository
- * (lwip-contrib/apps/LwipMibCompiler).\n
+ * SNMPv2c and SNMPv3 compatible agent<br>
+ * There is also a MIB compiler and a MIB viewer in lwIP/contrib subdir
+ * (lwip/contrib/apps/LwipMibCompiler).<br>
  * The agent implements the most important MIB2 MIBs including IPv6 support
  * (interfaces, UDP, TCP, SNMP, ICMP, SYSTEM). IP MIB is an older version
- * without IPv6 statistics (TODO).\n
+ * without IPv6 statistics (TODO).<br>
  * Rewritten by Martin Hentschel <info@cl-soft.de> and
- * Dirk Ziegelmeier <dziegel@gmx.de>\n
+ * Dirk Ziegelmeier <dziegel@gmx.de>
  *
  * 0 Agent Capabilities
  * ====================
@@ -69,12 +69,15 @@
  *
  * MIB compiler (code generator):
  * ------------------------------
- * - Provided in lwIP contrib repository.
- * - Written in C#. MIB viewer used Windows Forms.
+ * - Provided in contrib dir.
+ * - Written in C#. MIB viewer using Windows Forms.
  * - Developed on Windows with Visual Studio 2010.
  * - Can be compiled and used on all platforms with http://www.monodevelop.com/.
  * - Based on a heavily modified version of of SharpSnmpLib (a4bd05c6afb4)
  *   (https://sharpsnmplib.codeplex.com/SourceControl/network/forks/Nemo157/MIBParserUpdate).
+ *   This has been the last known revision of that code before being converted to
+ *   closed source. The new code on github has completely changed, so we can not
+ *   just update :-(
  * - MIB parser, C file generation framework and LWIP code generation are cleanly
  *   separated, which means the code may be useful as a base for code generation
  *   of other SNMP agents.
@@ -111,7 +114,7 @@
  *   tables is not possible.
  *
  *   Note lwIP has a very limited notion of IP routing. It currently
- *   doen't have a route table and doesn't have a notion of the U,G,H flags.
+ *   doesn't have a route table and doesn't have a notion of the U,G,H flags.
  *   Instead lwIP uses the interface list with only one default interface
  *   acting as a single gateway interface (G) for the default route.
  *
@@ -235,7 +238,7 @@
 void
 snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs)
 {
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
   LWIP_ASSERT("mibs pointer must be != NULL", (mibs != NULL));
   LWIP_ASSERT("num_mibs pointer must be != 0", (num_mibs != 0));
   snmp_mibs     = mibs;
@@ -258,7 +261,7 @@
  */
 void snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid)
 {
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
   if (device_enterprise_oid == NULL) {
     snmp_device_enterprise_oid = &snmp_device_enterprise_oid_default;
   } else {
@@ -272,7 +275,7 @@
  */
 const struct snmp_obj_id *snmp_get_device_enterprise_oid(void)
 {
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
   return snmp_device_enterprise_oid;
 }
 
@@ -934,7 +937,7 @@
       /*
       there is no further (suitable) node inside this MIB, search for the next MIB with following priority
       1. search for inner MIB's (whose root is located inside tree of current MIB)
-      2. search for surrouding MIB's (where the current MIB is the inner MIB) and continue there if any
+      2. search for surrounding MIB's (where the current MIB is the inner MIB) and continue there if any
       3. take the next closest MIB (not being related to the current MIB)
       */
       const struct snmp_mib *next_mib;
@@ -1053,7 +1056,7 @@
 
 
   if (oid_offset >= oid_len) {
-    /* passed oid references a tree node -> return first useable sub node of it */
+    /* passed oid references a tree node -> return first usable sub node of it */
     subnode_oid = 0;
   } else {
     subnode_oid = *(oid + oid_offset) + 1;
@@ -1123,7 +1126,7 @@
 }
 
 /** checks if the passed incomplete OID may be a possible candidate for snmp_next_oid_check();
-this methid is intended if the complete OID is not yet known but it is very expensive to build it up,
+this method is intended if the complete OID is not yet known but it is very expensive to build it up,
 so it is possible to test the starting part before building up the complete oid and pass it to snmp_next_oid_check()*/
 u8_t
 snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len)
@@ -1279,9 +1282,9 @@
  * get/test/set methods.
  *
  * @param buf points to a buffer where the resulting ASN1 octet string is stored to
- * @param buf_len max length of the bufffer
+ * @param buf_len max length of the buffer
  * @param bit_value Bit value to encode with Bit0 == LSB
- * @param bit_count Number of possible bits for the bit value (according to rfc we have to send all bits independant from their truth value)
+ * @param bit_count Number of possible bits for the bit value (according to rfc we have to send all bits independent from their truth value)
  * @return number of bytes used from buffer to store the resulting OctetString
  */
 u8_t
diff --git a/src/apps/snmp/snmp_core_priv.h b/src/apps/snmp/snmp_core_priv.h
index 9532c05..e432318 100644
--- a/src/apps/snmp/snmp_core_priv.h
+++ b/src/apps/snmp/snmp_core_priv.h
@@ -44,6 +44,14 @@
 extern "C" {
 #endif
 
+#if !defined LWIP_ASSERT_SNMP_LOCKED
+#if SNMP_USE_RAW
+#define LWIP_ASSERT_SNMP_LOCKED() LWIP_ASSERT_CORE_LOCKED()
+#else
+#define LWIP_ASSERT_SNMP_LOCKED()
+#endif
+#endif
+
 /* (outdated) SNMPv1 error codes
  * shall not be used by MIBS anymore, nevertheless required from core for properly answering a v1 request
  */
diff --git a/src/apps/snmp/snmp_mib2_ip.c b/src/apps/snmp/snmp_mib2_ip.c
index 6931049..57cf0f5 100644
--- a/src/apps/snmp/snmp_mib2_ip.c
+++ b/src/apps/snmp/snmp_mib2_ip.c
@@ -263,7 +263,7 @@
 
   /* find netif with requested ip */
   NETIF_FOREACH(netif) {
-    if (ip4_addr_cmp(&ip, netif_ip4_addr(netif))) {
+    if (ip4_addr_eq(&ip, netif_ip4_addr(netif))) {
       /* fill in object properties */
       return ip_AddrTable_get_cell_value_core(netif, column, value, value_len);
     }
@@ -417,7 +417,7 @@
     ip4_addr_t dst;
     ip4_addr_get_network(&dst, netif_ip4_addr(netif), netif_ip4_netmask(netif));
 
-    if (ip4_addr_cmp(&dst, &test_ip)) {
+    if (ip4_addr_eq(&dst, &test_ip)) {
       /* fill in object properties */
       return ip_RouteTable_get_cell_value_core(netif, 0, column, value, value_len);
     }
@@ -535,7 +535,7 @@
     struct eth_addr *ethaddr;
 
     if (etharp_get_entry(i, &ip, &netif, &ethaddr)) {
-      if ((netif_index == netif_to_num(netif)) && ip4_addr_cmp(&ip_in, ip)) {
+      if ((netif_index == netif_to_num(netif)) && ip4_addr_eq(&ip_in, ip)) {
         /* fill in object properties */
         return ip_NetToMediaTable_get_cell_value_core(i, column, value, value_len);
       }
diff --git a/src/apps/snmp/snmp_mib2_tcp.c b/src/apps/snmp/snmp_mib2_tcp.c
index 8a321f3..a23143e 100644
--- a/src/apps/snmp/snmp_mib2_tcp.c
+++ b/src/apps/snmp/snmp_mib2_tcp.c
@@ -227,17 +227,17 @@
     while (pcb != NULL) {
       /* do local IP and local port match? */
       if (IP_IS_V4_VAL(pcb->local_ip) &&
-          ip4_addr_cmp(&local_ip, ip_2_ip4(&pcb->local_ip)) && (local_port == pcb->local_port)) {
+          ip4_addr_eq(&local_ip, ip_2_ip4(&pcb->local_ip)) && (local_port == pcb->local_port)) {
 
         /* PCBs in state LISTEN are not connected and have no remote_ip or remote_port */
         if (pcb->state == LISTEN) {
-          if (ip4_addr_cmp(&remote_ip, IP4_ADDR_ANY4) && (remote_port == 0)) {
+          if (ip4_addr_eq(&remote_ip, IP4_ADDR_ANY4) && (remote_port == 0)) {
             /* fill in object properties */
             return tcp_ConnTable_get_cell_value_core(pcb, column, value, value_len);
           }
         } else {
           if (IP_IS_V4_VAL(pcb->remote_ip) &&
-              ip4_addr_cmp(&remote_ip, ip_2_ip4(&pcb->remote_ip)) && (remote_port == pcb->remote_port)) {
+              ip4_addr_eq(&remote_ip, ip_2_ip4(&pcb->remote_ip)) && (remote_port == pcb->remote_port)) {
             /* fill in object properties */
             return tcp_ConnTable_get_cell_value_core(pcb, column, value, value_len);
           }
@@ -355,9 +355,9 @@
     pcb = *tcp_pcb_nonlisten_lists[i];
 
     while (pcb != NULL) {
-      if (ip_addr_cmp(&local_ip, &pcb->local_ip) &&
+      if (ip_addr_eq(&local_ip, &pcb->local_ip) &&
           (local_port == pcb->local_port) &&
-          ip_addr_cmp(&remote_ip, &pcb->remote_ip) &&
+          ip_addr_eq(&remote_ip, &pcb->remote_ip) &&
           (remote_port == pcb->remote_port)) {
         /* fill in object properties */
         return tcp_ConnectionTable_get_cell_value_core(column, pcb, value);
@@ -454,7 +454,7 @@
   /* find tcp_pcb with requested ip and port*/
   pcb = tcp_listen_pcbs.listen_pcbs;
   while (pcb != NULL) {
-    if (ip_addr_cmp(&local_ip, &pcb->local_ip) &&
+    if (ip_addr_eq(&local_ip, &pcb->local_ip) &&
         (local_port == pcb->local_port)) {
       /* fill in object properties */
       return tcp_ListenerTable_get_cell_value_core(column, value);
diff --git a/src/apps/snmp/snmp_mib2_udp.c b/src/apps/snmp/snmp_mib2_udp.c
index d0bd5de..2b57277 100644
--- a/src/apps/snmp/snmp_mib2_udp.c
+++ b/src/apps/snmp/snmp_mib2_udp.c
@@ -147,9 +147,9 @@
   /* find udp_pcb with requested ip and port*/
   pcb = udp_pcbs;
   while (pcb != NULL) {
-    if (ip_addr_cmp(&local_ip, &pcb->local_ip) &&
+    if (ip_addr_eq(&local_ip, &pcb->local_ip) &&
         (local_port == pcb->local_port) &&
-        ip_addr_cmp(&remote_ip, &pcb->remote_ip) &&
+        ip_addr_eq(&remote_ip, &pcb->remote_ip) &&
         (remote_port == pcb->remote_port)) {
       /* fill in object properties */
       return udp_endpointTable_get_cell_value_core(column, value);
@@ -263,7 +263,7 @@
   pcb = udp_pcbs;
   while (pcb != NULL) {
     if (IP_IS_V4_VAL(pcb->local_ip)) {
-      if (ip4_addr_cmp(&ip, ip_2_ip4(&pcb->local_ip)) && (port == pcb->local_port)) {
+      if (ip4_addr_eq(&ip, ip_2_ip4(&pcb->local_ip)) && (port == pcb->local_port)) {
         /* fill in object properties */
         return udp_Table_get_cell_value_core(pcb, column, value, value_len);
       }
diff --git a/src/apps/snmp/snmp_msg.c b/src/apps/snmp/snmp_msg.c
index 0b6693a..9cd4b07 100644
--- a/src/apps/snmp/snmp_msg.c
+++ b/src/apps/snmp/snmp_msg.c
@@ -71,8 +71,11 @@
 /** SNMP community string for sending traps */
 const char *snmp_community_trap = SNMP_COMMUNITY_TRAP;
 
-snmp_write_callback_fct snmp_write_callback     = NULL;
-void                   *snmp_write_callback_arg = NULL;
+snmp_write_callback_fct snmp_write_callback;
+void *snmp_write_callback_arg;
+
+snmp_inform_callback_fct snmp_inform_callback;
+void *snmp_inform_callback_arg;
 
 #if LWIP_SNMP_CONFIGURE_VERSIONS
 
@@ -177,7 +180,7 @@
 void
 snmp_set_community(const char *const community)
 {
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
   LWIP_ASSERT("community string is too long!", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN);
   snmp_community = community;
 }
@@ -215,7 +218,7 @@
 void
 snmp_set_community_write(const char *const community)
 {
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
   LWIP_ASSERT("community string must not be NULL", community != NULL);
   LWIP_ASSERT("community string is too long!", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN);
   snmp_community_write = community;
@@ -232,7 +235,7 @@
 void
 snmp_set_community_trap(const char *const community)
 {
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
   LWIP_ASSERT("community string is too long!", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN);
   snmp_community_trap = community;
 }
@@ -244,11 +247,22 @@
 void
 snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg)
 {
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
   snmp_write_callback     = write_callback;
   snmp_write_callback_arg = callback_arg;
 }
 
+/**
+ * @ingroup snmp_core
+ * Callback fired on every received INFORM confirmation (get-response)
+ */
+void
+snmp_set_inform_callback(snmp_inform_callback_fct inform_callback, void* callback_arg)
+{
+  snmp_inform_callback     = inform_callback;
+  snmp_inform_callback_arg = callback_arg;
+}
+
 /* ----------------------------------------------------------------------- */
 /* forward declarations */
 /* ----------------------------------------------------------------------- */
@@ -284,6 +298,16 @@
 
   err = snmp_parse_inbound_frame(&request);
   if (err == ERR_OK) {
+    if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_RESP) {
+      if (request.error_status == SNMP_ERR_NOERROR) {
+        /* If callback function has been defined call it. */
+        if (snmp_inform_callback != NULL) {
+          snmp_inform_callback(&request, snmp_inform_callback_arg);
+        }
+      }
+      /* stop further handling of GET RESP PDU, we are an agent */
+      return;
+    }
     err = snmp_prepare_outbound_frame(&request);
     if (err == ERR_OK) {
 
@@ -623,7 +647,7 @@
         /* no more varbinds in request */
         break;
       } else {
-        LWIP_DEBUGF(SNMP_DEBUG, ("Very strange, we cannot parse the varbind output that we created just before!"));
+        LWIP_DEBUGF(SNMP_DEBUG, ("Very strange, we cannot parse the varbind output that we created just before!\n"));
         request->error_status = SNMP_ERR_GENERROR;
         request->error_index  = request->non_repeaters + repetition_varbind_enumerator.varbind_count;
       }
@@ -741,6 +765,7 @@
 #define PARSE_ASSERT(cond, retValue) \
   if (!(cond)) { \
     LWIP_DEBUGF(SNMP_DEBUG, ("SNMP parse assertion failed!: " # cond)); \
+    LWIP_DEBUGF(SNMP_DEBUG, ("\n")); \
     snmp_stats.inasnparseerrs++; \
     return retValue; \
   }
@@ -748,6 +773,7 @@
 #define BUILD_EXEC(code, retValue) \
   if ((code) != ERR_OK) { \
     LWIP_DEBUGF(SNMP_DEBUG, ("SNMP error during creation of outbound frame!: " # code)); \
+    LWIP_DEBUGF(SNMP_DEBUG, ("\n")); \
     return retValue; \
   }
 
@@ -815,7 +841,7 @@
     /* @todo: Differentiate read/write access */
     strncpy((char *)request->community, snmp_community, SNMP_MAX_COMMUNITY_STR_LEN);
     request->community[SNMP_MAX_COMMUNITY_STR_LEN] = 0; /* ensure NULL termination (strncpy does NOT guarantee it!) */
-    request->community_strlen = (u16_t)strnlen((char *)request->community, SNMP_MAX_COMMUNITY_STR_LEN);
+    request->community_strlen = (u16_t)strlen((char *)request->community);
 
     /* RFC3414 globalData */
     IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));
@@ -1174,9 +1200,13 @@
       /* SetRequest PDU */
       snmp_stats.insetrequests++;
       break;
+    case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP):
+      /* GetResponse PDU */
+      snmp_stats.ingetresponses++;
+      break;
     default:
       /* unsupported input PDU for this agent (no parse error) */
-      LWIP_DEBUGF(SNMP_DEBUG, ("Unknown/Invalid SNMP PDU type received: %d", tlv.type)); \
+      LWIP_DEBUGF(SNMP_DEBUG, ("Unknown/Invalid SNMP PDU type received: %d\n", tlv.type)); \
       return ERR_ARG;
   }
   request->request_type = tlv.type & SNMP_ASN1_DATATYPE_MASK;
@@ -1751,7 +1781,7 @@
     if (request->error_status == SNMP_ERR_TOOBIG) {
       request->error_index = 0; /* defined by RFC 1157 */
     } else if (request->error_index == 0) {
-      /* set index to varbind where error occured (if not already set before, e.g. during GetBulk processing) */
+      /* set index to varbind where error occurred (if not already set before, e.g. during GetBulk processing) */
       request->error_index = request->inbound_varbind_enumerator.varbind_count;
     }
   } else {
diff --git a/src/apps/snmp/snmp_netconn.c b/src/apps/snmp/snmp_netconn.c
index 8850acb..70f8bfc 100644
--- a/src/apps/snmp/snmp_netconn.c
+++ b/src/apps/snmp/snmp_netconn.c
@@ -116,7 +116,6 @@
 void
 snmp_init(void)
 {
-  LWIP_ASSERT_CORE_LOCKED();
   sys_thread_new("snmp_netconn", snmp_netconn_thread, NULL, SNMP_STACK_SIZE, SNMP_THREAD_PRIO);
 }
 
diff --git a/src/apps/snmp/snmp_pbuf_stream.c b/src/apps/snmp/snmp_pbuf_stream.c
index 42867fb..a6e319c 100644
--- a/src/apps/snmp/snmp_pbuf_stream.c
+++ b/src/apps/snmp/snmp_pbuf_stream.c
@@ -135,7 +135,7 @@
 err_t
 snmp_pbuf_stream_seek(struct snmp_pbuf_stream *pbuf_stream, s32_t offset)
 {
-  if ((offset < 0) || (offset > pbuf_stream->length)) {
+  if (((pbuf_stream->offset + offset) < 0) || (offset > pbuf_stream->length)) {
     /* we cannot seek backwards or forward behind stream end */
     return ERR_ARG;
   }
diff --git a/src/apps/snmp/snmp_snmpv2_usm.c b/src/apps/snmp/snmp_snmpv2_usm.c
index 7490c9c..4cc73d3 100644
--- a/src/apps/snmp/snmp_snmpv2_usm.c
+++ b/src/apps/snmp/snmp_snmpv2_usm.c
@@ -62,7 +62,7 @@
   if (algo == SNMP_V3_AUTH_ALGO_MD5) {
     return &usmHMACMD5AuthProtocol;
   } else if (algo ==  SNMP_V3_AUTH_ALGO_SHA) {
-    return &usmHMACMD5AuthProtocol;
+    return &usmHMACSHAAuthProtocol;
   }
 
   return &usmNoAuthProtocol;
diff --git a/src/apps/snmp/snmp_threadsync.c b/src/apps/snmp/snmp_threadsync.c
index 56d9886..927c62a 100644
--- a/src/apps/snmp/snmp_threadsync.c
+++ b/src/apps/snmp/snmp_threadsync.c
@@ -176,7 +176,7 @@
   struct threadsync_data *call_data = &threadsync_node->instance->data;
 
   if (threadsync_node->node.node.oid != threadsync_node->target->node.oid) {
-    LWIP_DEBUGF(SNMP_DEBUG, ("Sync node OID does not match target node OID"));
+    LWIP_DEBUGF(SNMP_DEBUG, ("Sync node OID does not match target node OID\n"));
     return SNMP_ERR_NOSUCHINSTANCE;
   }
 
diff --git a/src/apps/snmp/snmp_traps.c b/src/apps/snmp/snmp_traps.c
index 3c9c817..3998723 100644
--- a/src/apps/snmp/snmp_traps.c
+++ b/src/apps/snmp/snmp_traps.c
@@ -1,6 +1,6 @@
 /**
  * @file
- * SNMPv1 traps implementation.
+ * SNMPv1 and SNMPv2 traps implementation.
  */
 
 /*
@@ -51,7 +51,11 @@
 #include "snmp_asn1.h"
 #include "snmp_core_priv.h"
 
-struct snmp_msg_trap {
+#define SNMP_IS_INFORM                            1
+#define SNMP_IS_TRAP                              0
+
+struct snmp_msg_trap
+{
   /* source enterprise ID (sysObjectID) */
   const struct snmp_obj_id *enterprise;
   /* source IP address, raw network order format */
@@ -74,16 +78,30 @@
   u16_t seqlen;
   /* encoding varbinds sequence length */
   u16_t vbseqlen;
+
+  /* error status */
+  s32_t error_status;
+  /* error index */
+  s32_t error_index;
+  /* trap or inform? */
+  u8_t trap_or_inform;
 };
 
 static u16_t snmp_trap_varbind_sum(struct snmp_msg_trap *trap, struct snmp_varbind *varbinds);
 static u16_t snmp_trap_header_sum(struct snmp_msg_trap *trap, u16_t vb_len);
 static err_t snmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream);
 static err_t snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds);
+static u16_t snmp_trap_header_sum_v1_specific(struct snmp_msg_trap *trap);
+static u16_t snmp_trap_header_sum_v2c_specific(struct snmp_msg_trap *trap);
+static err_t snmp_trap_header_enc_v1_specific(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream);
+static err_t snmp_trap_header_enc_v2c_specific(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream);
+static err_t snmp_prepare_trap_oid(struct snmp_obj_id *dest_snmp_trap_oid, const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap);
+static void snmp_prepare_necessary_msg_fields(struct snmp_msg_trap *trap_msg, const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds);
+static err_t snmp_send_msg(struct snmp_msg_trap *trap_msg, struct snmp_varbind *varbinds, u16_t tot_len, ip_addr_t *dip);
 
 #define BUILD_EXEC(code) \
   if ((code) != ERR_OK) { \
-    LWIP_DEBUGF(SNMP_DEBUG, ("SNMP error during creation of outbound trap frame!")); \
+    LWIP_DEBUGF(SNMP_DEBUG, ("SNMP error during creation of outbound trap frame!\n")); \
     return ERR_ARG; \
   }
 
@@ -92,7 +110,12 @@
 
 void *snmp_traps_handle;
 
-struct snmp_trap_dst {
+/**
+ * @ingroup snmp_traps
+ * @struct snmp_trap_dst
+ */
+struct snmp_trap_dst
+{
   /* destination IP address in network order */
   ip_addr_t dip;
   /* set to 0 when disabled, >0 when enabled */
@@ -102,16 +125,23 @@
 
 static u8_t snmp_auth_traps_enabled = 0;
 
+/* This is used in functions like snmp_coldstart_trap where user didn't specify which version of trap to use */
+static u8_t snmp_default_trap_version = SNMP_VERSION_1;
+
+/* This is used in trap messages v2c */
+static s32_t req_id = 1;
+
 /**
  * @ingroup snmp_traps
  * Sets enable switch for this trap destination.
  * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1
  * @param enable switch if 0 destination is disabled >0 enabled.
+ *
  */
 void
 snmp_trap_dst_enable(u8_t dst_idx, u8_t enable)
 {
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
   if (dst_idx < SNMP_TRAP_DESTINATIONS) {
     trap_dst[dst_idx].enable = enable;
   }
@@ -122,11 +152,12 @@
  * Sets IPv4 address for this trap destination.
  * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1
  * @param dst IPv4 address in host order.
+ *
  */
 void
 snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst)
 {
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
   if (dst_idx < SNMP_TRAP_DESTINATIONS) {
     ip_addr_set(&trap_dst[dst_idx].dip, dst);
   }
@@ -135,6 +166,9 @@
 /**
  * @ingroup snmp_traps
  * Enable/disable authentication traps
+ *
+ * @param enable enable SNMP traps
+ *
  */
 void
 snmp_set_auth_traps_enabled(u8_t enable)
@@ -145,6 +179,8 @@
 /**
  * @ingroup snmp_traps
  * Get authentication traps enabled state
+ *
+ * @return TRUE if traps are enabled, FALSE if they aren't
  */
 u8_t
 snmp_get_auth_traps_enabled(void)
@@ -152,11 +188,144 @@
   return snmp_auth_traps_enabled;
 }
 
+/**
+ * @ingroup snmp_traps
+ * Choose default SNMP version for sending traps (if not specified, default version is SNMP_VERSION_1)
+ * SNMP_VERSION_1  0
+ * SNMP_VERSION_2c 1
+ * SNMP_VERSION_3  3
+ *
+ * @param snmp_version version that will be used for sending traps
+ *
+ */
+void
+snmp_set_default_trap_version(u8_t snmp_version)
+{
+  snmp_default_trap_version = snmp_version;
+}
 
 /**
  * @ingroup snmp_traps
- * Sends a generic or enterprise specific trap message.
+ * Get default SNMP version for sending traps
  *
+ * @return selected default version:
+ * 0 - SNMP_VERSION_1
+ * 1 - SNMP_VERSION_2c
+ * 3 - SNMP_VERSION_3
+ */
+u8_t
+snmp_get_default_trap_version(void)
+{
+  return snmp_default_trap_version;
+}
+
+/**
+ * @ingroup snmp_traps
+ * Prepares snmpTrapOID for SNMP v2c
+ * @param dest_snmp_trap_oid pointer to destination snmpTrapOID
+ * @param eoid enterprise oid (can be NULL)
+ * @param generic_trap SNMP v1 generic trap
+ * @param specific_trap SNMP v1 specific trap
+ * @return ERR_OK if completed successfully;
+ *         ERR_MEM if there wasn't enough memory allocated for destination;
+ *         ERR_VAL if value for generic trap was incorrect;
+ */
+static err_t
+snmp_prepare_trap_oid(struct snmp_obj_id *dest_snmp_trap_oid, const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap)
+{
+  err_t err = ERR_OK;
+  const u32_t snmpTrapOID[] = {1, 3, 6, 1, 6, 3, 1, 1, 5};     /* please see rfc3584 */
+
+  if (generic_trap == SNMP_GENTRAP_ENTERPRISE_SPECIFIC) {
+    if (eoid == NULL) {
+      MEMCPY(dest_snmp_trap_oid, snmp_get_device_enterprise_oid(), sizeof(*dest_snmp_trap_oid));
+    } else {
+      MEMCPY(dest_snmp_trap_oid, eoid, sizeof(*dest_snmp_trap_oid));
+    }
+    if (dest_snmp_trap_oid->len + 2 < SNMP_MAX_OBJ_ID_LEN) {
+      dest_snmp_trap_oid->id[dest_snmp_trap_oid->len++] = 0;
+      dest_snmp_trap_oid->id[dest_snmp_trap_oid->len++] = specific_trap;
+    } else {
+      err = ERR_MEM;
+    }
+  } else if ((generic_trap >= SNMP_GENTRAP_COLDSTART) && (generic_trap < SNMP_GENTRAP_ENTERPRISE_SPECIFIC)) {
+    if (sizeof(dest_snmp_trap_oid->id) >= sizeof(snmpTrapOID)) {
+      MEMCPY(&dest_snmp_trap_oid->id, snmpTrapOID , sizeof(snmpTrapOID));
+      dest_snmp_trap_oid->len = LWIP_ARRAYSIZE(snmpTrapOID);
+      dest_snmp_trap_oid->id[dest_snmp_trap_oid->len++] = specific_trap + 1;
+    } else {
+      err = ERR_MEM;
+    }
+  } else {
+    err = ERR_VAL;
+  }
+  return err;
+}
+
+/**
+ * @ingroup snmp_traps
+ * Prepare the rest of the necessary fields for trap/notification/inform message.
+ * @param trap_msg message that should be set
+ * @param eoid enterprise oid (can be NULL)
+ * @param generic_trap SNMP v1 generic trap
+ * @param specific_trap SNMP v1 specific trap
+ * @param varbinds list of varbinds
+ */
+static void
+snmp_prepare_necessary_msg_fields(struct snmp_msg_trap *trap_msg, const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds)
+{
+  if (trap_msg->snmp_version == SNMP_VERSION_1) {
+    trap_msg->enterprise = (eoid == NULL) ? snmp_get_device_enterprise_oid() : eoid;
+    trap_msg->gen_trap = generic_trap;
+    trap_msg->spc_trap = (generic_trap == SNMP_GENTRAP_ENTERPRISE_SPECIFIC) ? specific_trap : 0;
+    MIB2_COPY_SYSUPTIME_TO(&trap_msg->ts);
+  } else if (trap_msg->snmp_version == SNMP_VERSION_2c) {
+    /* Copy sysUpTime into the first varbind */
+    MIB2_COPY_SYSUPTIME_TO((u32_t *)varbinds[0].value);
+  }
+}
+
+/**
+ * @ingroup snmp_traps
+ * Copy trap message structure to pbuf and sends it
+ * @param trap_msg contains the data that should be sent
+ * @param varbinds list of varbinds
+ * @param tot_len total length of encoded data
+ * @param dip destination IP address
+ * @return ERR_OK if sending was successful
+ */
+static err_t
+snmp_send_msg(struct snmp_msg_trap *trap_msg, struct snmp_varbind *varbinds, u16_t tot_len, ip_addr_t *dip)
+{
+  err_t err = ERR_OK;
+  struct pbuf *p = NULL;
+  /* allocate pbuf(s) */
+  p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_RAM);
+  if (p != NULL) {
+    struct snmp_pbuf_stream pbuf_stream;
+    snmp_pbuf_stream_init(&pbuf_stream, p, 0, tot_len);
+
+    /* pass 1, encode packet ino the pbuf(s) */
+    BUILD_EXEC( snmp_trap_header_enc(trap_msg, &pbuf_stream) );
+    BUILD_EXEC( snmp_trap_varbind_enc(trap_msg, &pbuf_stream, varbinds) );
+
+    snmp_stats.outtraps++;
+    snmp_stats.outpkts++;
+
+    /** send to the TRAP destination */
+    err = snmp_sendto(snmp_traps_handle, p, dip, LWIP_IANA_PORT_SNMP_TRAP);
+    pbuf_free(p);
+  } else {
+    err = ERR_MEM;
+  }
+  return err;
+}
+
+/**
+ * @ingroup snmp_traps
+ * Prepare and sends a generic or enterprise specific trap message, notification or inform.
+ *
+ * @param trap_msg defines msg type
  * @param eoid points to enterprise object identifier
  * @param generic_trap is the trap code
  * @param specific_trap used for enterprise traps when generic_trap == 6
@@ -169,89 +338,156 @@
  * and .iso.org.dod.internet.private.enterprises.yourenterprise
  * (sysObjectID) for specific traps.
  */
-err_t
-snmp_send_trap(const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds)
+static err_t
+snmp_send_trap_or_notification_or_inform_generic(struct snmp_msg_trap *trap_msg, const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds)
 {
-  struct snmp_msg_trap trap_msg;
-  struct snmp_trap_dst *td;
-  struct pbuf *p;
-  u16_t i, tot_len;
+  struct snmp_trap_dst *td = NULL;
+  u16_t i = 0;
+  u16_t tot_len = 0;
   err_t err = ERR_OK;
+  u32_t timestamp = 0;
+  struct snmp_varbind *original_varbinds = varbinds;
+  struct snmp_varbind *original_prev = NULL;
+  struct snmp_varbind snmp_v2_special_varbinds[] = {
+                                                     /* First varbind is used to store sysUpTime */
+                                                     {
+                                                       NULL,                            /* *next */
+                                                       NULL,                            /* *prev */
+                                                       {                                /* oid */
+                                                         8,                             /* oid len */
+                                                         {1, 3, 6, 1, 2, 1, 1, 3}       /* oid for sysUpTime */
+                                                       },
+                                                       SNMP_ASN1_TYPE_TIMETICKS,        /* type */
+                                                       sizeof(u32_t),                   /* value_len */
+                                                       NULL                             /* value */
+                                                     },
+                                                     /* Second varbind is used to store snmpTrapOID */
+                                                     {
+                                                       NULL,                            /* *next */
+                                                       NULL,                            /* *prev */
+                                                       {                                /* oid */
+                                                         10,                            /* oid len */
+                                                         {1, 3, 6, 1, 6, 3, 1, 1, 4, 1} /* oid for snmpTrapOID */
+                                                       },
+                                                       SNMP_ASN1_TYPE_OBJECT_ID,        /* type */
+                                                       0,                               /* value_len */
+                                                       NULL                             /* value */
+                                                     }
+   };
 
-  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT_SNMP_LOCKED();
 
-  trap_msg.snmp_version = 0;
+  snmp_v2_special_varbinds[0].next = &snmp_v2_special_varbinds[1];
+  snmp_v2_special_varbinds[1].prev = &snmp_v2_special_varbinds[0];
 
-  for (i = 0, td = &trap_dst[0]; i < SNMP_TRAP_DESTINATIONS; i++, td++) {
+  snmp_v2_special_varbinds[0].value = &timestamp;
+
+  snmp_v2_special_varbinds[1].next = varbinds;
+
+  /* see rfc3584 */
+  if (trap_msg->snmp_version == SNMP_VERSION_2c) {
+    struct snmp_obj_id snmp_trap_oid =  { 0 };  /* used for converting SNMPv1 generic/specific trap parameter to SNMPv2 snmpTrapOID */
+    err = snmp_prepare_trap_oid(&snmp_trap_oid, eoid, generic_trap, specific_trap);
+    if (err == ERR_OK) {
+      snmp_v2_special_varbinds[1].value_len = snmp_trap_oid.len * sizeof(snmp_trap_oid.id[0]);
+      snmp_v2_special_varbinds[1].value = snmp_trap_oid.id;
+      if (varbinds != NULL) {
+        original_prev = varbinds->prev;
+        varbinds->prev = &snmp_v2_special_varbinds[1];
+      }
+      varbinds = snmp_v2_special_varbinds;  /* After inserting two varbinds at the beginning of the list, make sure that pointer is pointing to the first element  */
+    }
+  }
+
+  for (i = 0, td = &trap_dst[0]; (i < SNMP_TRAP_DESTINATIONS) && (err == ERR_OK); i++, td++) {
     if ((td->enable != 0) && !ip_addr_isany(&td->dip)) {
       /* lookup current source address for this dst */
-      if (snmp_get_local_ip_for_dst(snmp_traps_handle, &td->dip, &trap_msg.sip)) {
-        if (eoid == NULL) {
-          trap_msg.enterprise = snmp_get_device_enterprise_oid();
-        } else {
-          trap_msg.enterprise = eoid;
-        }
-
-        trap_msg.gen_trap = generic_trap;
-        if (generic_trap == SNMP_GENTRAP_ENTERPRISE_SPECIFIC) {
-          trap_msg.spc_trap = specific_trap;
-        } else {
-          trap_msg.spc_trap = 0;
-        }
-
-        MIB2_COPY_SYSUPTIME_TO(&trap_msg.ts);
+      if (snmp_get_local_ip_for_dst(snmp_traps_handle, &td->dip, &trap_msg->sip)) {
+        snmp_prepare_necessary_msg_fields(trap_msg, eoid, generic_trap, specific_trap, varbinds);
 
         /* pass 0, calculate length fields */
-        tot_len = snmp_trap_varbind_sum(&trap_msg, varbinds);
-        tot_len = snmp_trap_header_sum(&trap_msg, tot_len);
+        tot_len = snmp_trap_varbind_sum(trap_msg, varbinds);
+        tot_len = snmp_trap_header_sum(trap_msg, tot_len);
 
-        /* allocate pbuf(s) */
-        p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_RAM);
-        if (p != NULL) {
-          struct snmp_pbuf_stream pbuf_stream;
-          snmp_pbuf_stream_init(&pbuf_stream, p, 0, tot_len);
-
-          /* pass 1, encode packet into the pbuf(s) */
-          snmp_trap_header_enc(&trap_msg, &pbuf_stream);
-          snmp_trap_varbind_enc(&trap_msg, &pbuf_stream, varbinds);
-
-          snmp_stats.outtraps++;
-          snmp_stats.outpkts++;
-
-          /** send to the TRAP destination */
-          snmp_sendto(snmp_traps_handle, p, &td->dip, LWIP_IANA_PORT_SNMP_TRAP);
-          pbuf_free(p);
-        } else {
-          err = ERR_MEM;
-        }
+        /* allocate pbuf, fill it and send it */
+        err = snmp_send_msg(trap_msg, varbinds, tot_len, &td->dip);
       } else {
         /* routing error */
         err = ERR_RTE;
       }
     }
   }
+  if ((trap_msg->snmp_version == SNMP_VERSION_2c) && (original_varbinds != NULL)) {
+    original_varbinds->prev = original_prev;
+  }
+  req_id++;
   return err;
 }
 
 /**
  * @ingroup snmp_traps
+ * This function is a wrapper function for preparing and sending generic or specific traps.
+ *
+ * @param oid points to enterprise object identifier
+ * @param generic_trap is the trap code
+ * @param specific_trap used for enterprise traps when generic_trap == 6
+ * @param varbinds linked list of varbinds to be sent
+ * @return ERR_OK when success, ERR_MEM if we're out of memory
+ *
+ * @note the use of the enterprise identifier field
+ * is per RFC1215.
+ * Use .iso.org.dod.internet.mgmt.mib-2.snmp for generic traps
+ * and .iso.org.dod.internet.private.enterprises.yourenterprise
+ * (sysObjectID) for specific traps.
+ */
+err_t
+snmp_send_trap(const struct snmp_obj_id* oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds)
+{
+  struct snmp_msg_trap trap_msg = {0};
+  trap_msg.snmp_version = snmp_default_trap_version;
+  trap_msg.trap_or_inform = SNMP_IS_TRAP;
+  return snmp_send_trap_or_notification_or_inform_generic(&trap_msg, oid, generic_trap, specific_trap, varbinds);
+}
+
+/**
+ * @ingroup snmp_traps
  * Send generic SNMP trap
+ * @param generic_trap is the trap code
+ * return ERR_OK when success
  */
 err_t
 snmp_send_trap_generic(s32_t generic_trap)
 {
-  static const struct snmp_obj_id oid = { 7, { 1, 3, 6, 1, 2, 1, 11 } };
-  return snmp_send_trap(&oid, generic_trap, 0, NULL);
+  err_t err = ERR_OK;
+  struct snmp_msg_trap trap_msg = {0};
+  trap_msg.snmp_version = snmp_default_trap_version;
+  trap_msg.trap_or_inform = SNMP_IS_TRAP;
+
+  if(snmp_default_trap_version == SNMP_VERSION_1) {
+    static const struct snmp_obj_id oid = { 7, { 1, 3, 6, 1, 2, 1, 11 } };
+    err = snmp_send_trap_or_notification_or_inform_generic(&trap_msg, &oid, generic_trap, 0, NULL);
+  } else if (snmp_default_trap_version == SNMP_VERSION_2c) {
+    err = snmp_send_trap_or_notification_or_inform_generic(&trap_msg, NULL, generic_trap, 0, NULL);
+  } else {
+    err = ERR_VAL;
+  }
+  return err;
 }
 
 /**
  * @ingroup snmp_traps
  * Send specific SNMP trap with variable bindings
+ * @param specific_trap used for enterprise traps (generic_trap = 6)
+ * @param varbinds linked list of varbinds to be sent
+ * @return ERR_OK when success
  */
 err_t
 snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds)
 {
-  return snmp_send_trap(NULL, SNMP_GENTRAP_ENTERPRISE_SPECIFIC, specific_trap, varbinds);
+  struct snmp_msg_trap trap_msg = {0};
+  trap_msg.snmp_version = snmp_default_trap_version;
+  trap_msg.trap_or_inform = SNMP_IS_TRAP;
+  return snmp_send_trap_or_notification_or_inform_generic(&trap_msg, NULL, SNMP_GENTRAP_ENTERPRISE_SPECIFIC, specific_trap, varbinds);
 }
 
 /**
@@ -276,6 +512,14 @@
   }
 }
 
+/**
+ * @ingroup snmp_traps
+ * Sums trap varbinds
+ *
+ * @param trap Trap message
+ * @param varbinds linked list of varbinds
+ * @return the required length for encoding of this part of the trap header
+ */
 static u16_t
 snmp_trap_varbind_sum(struct snmp_msg_trap *trap, struct snmp_varbind *varbinds)
 {
@@ -303,21 +547,18 @@
 }
 
 /**
- * Sums trap header field lengths from tail to head and
- * returns trap_header_lengths for second encoding pass.
+ * @ingroup snmp_traps
+ * Sums trap header fields that are specific for SNMP v1
  *
  * @param trap Trap message
- * @param vb_len varbind-list length
- * @return the required length for encoding the trap header
+ * @return the required length for encoding of this part of the trap header
  */
 static u16_t
-snmp_trap_header_sum(struct snmp_msg_trap *trap, u16_t vb_len)
+snmp_trap_header_sum_v1_specific(struct snmp_msg_trap *trap)
 {
-  u16_t tot_len;
-  u16_t len;
-  u8_t lenlen;
-
-  tot_len = vb_len;
+  u16_t tot_len = 0;
+  u16_t len = 0;
+  u8_t lenlen = 0;
 
   snmp_asn1_enc_u32t_cnt(trap->ts, &len);
   snmp_asn1_enc_length_cnt(len, &lenlen);
@@ -347,6 +588,57 @@
   snmp_asn1_enc_length_cnt(len, &lenlen);
   tot_len += 1 + len + lenlen;
 
+  return tot_len;
+}
+
+/**
+ * @ingroup snmp_traps
+ * Sums trap header fields that are specific for SNMP v2c
+ *
+ * @param trap Trap message
+ * @return the required length for encoding of this part of the trap header
+ */
+static u16_t
+snmp_trap_header_sum_v2c_specific(struct snmp_msg_trap *trap)
+{
+  u16_t tot_len = 0;
+  u16_t len = 0;
+  u8_t lenlen = 0;
+
+  snmp_asn1_enc_u32t_cnt(req_id, &len);
+  snmp_asn1_enc_length_cnt(len, &lenlen);
+  tot_len += 1 + len + lenlen;
+  snmp_asn1_enc_u32t_cnt(trap->error_status, &len);
+  snmp_asn1_enc_length_cnt(len, &lenlen);
+  tot_len += 1 + len + lenlen;
+  snmp_asn1_enc_u32t_cnt(trap->error_index, &len);
+  snmp_asn1_enc_length_cnt(len, &lenlen);
+  tot_len += 1 + len + lenlen;
+
+  return tot_len;
+}
+
+/**
+ * @ingroup snmp_traps
+ * Sums trap header field lengths from tail to head and
+ * returns trap_header_lengths for second encoding pass.
+ *
+ * @param trap Trap message
+ * @param vb_len varbind-list length
+ * @return the required length for encoding the trap header
+ */
+static u16_t
+snmp_trap_header_sum(struct snmp_msg_trap *trap, u16_t vb_len)
+{
+  u16_t tot_len = vb_len;
+  u16_t len = 0;
+  u8_t lenlen = 0;
+
+  if (trap->snmp_version == SNMP_VERSION_1) {
+    tot_len += snmp_trap_header_sum_v1_specific(trap);
+  } else if (trap->snmp_version == SNMP_VERSION_2c) {
+    tot_len += snmp_trap_header_sum_v2c_specific(trap);
+  }
   trap->pdulen = tot_len;
   snmp_asn1_enc_length_cnt(trap->pdulen, &lenlen);
   tot_len += 1 + lenlen;
@@ -366,6 +658,14 @@
   return tot_len;
 }
 
+/**
+ * @ingroup snmp_traps
+ * Encodes varbinds.
+ * @param trap Trap message
+ * @param pbuf_stream stream used for storing data inside pbuf
+ * @param varbinds linked list of varbinds
+ * @retval err_t ERR_OK if successful, ERR_ARG otherwise
+ */
 static err_t
 snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds)
 {
@@ -387,32 +687,44 @@
 }
 
 /**
- * Encodes trap header from head to tail.
+ * @ingroup snmp_traps
+ * Encodes trap header PDU part.
+ * @param trap Trap message
+ * @param pbuf_stream stream used for storing data inside pbuf
+ * @retval err_t ERR_OK if successful, ERR_ARG otherwise
  */
 static err_t
-snmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream)
+snmp_trap_header_enc_pdu(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream)
 {
   struct snmp_asn1_tlv tlv;
-
-  /* 'Message' sequence */
-  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 0, trap->seqlen);
-  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
-
-  /* version */
-  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
-  snmp_asn1_enc_s32t_cnt(trap->snmp_version, &tlv.value_len);
-  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
-  BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->snmp_version) );
-
-  /* community */
-  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, trap->comlen);
-  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
-  BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream,  (const u8_t *)snmp_community_trap, trap->comlen) );
-
   /* 'PDU' sequence */
-  SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_TRAP), 0, trap->pdulen);
-  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  if (trap->snmp_version == SNMP_VERSION_1) {
+    /* TRAP V1 */
+    SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_TRAP), 0, trap->pdulen);
+    BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  } else if ((trap->snmp_version == SNMP_VERSION_2c) && (trap->trap_or_inform == SNMP_IS_INFORM)) {
+    /* TRAP v2 - INFORM */
+    SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_INFORM_REQ), 0, trap->pdulen);
+    BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  } else if (trap->snmp_version == SNMP_VERSION_2c) {
+    /* TRAP v2 - NOTIFICATION*/
+    SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_V2_TRAP), 0, trap->pdulen);
+    BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  }
 
+  return ERR_OK;
+}
+
+/**
+ * @ingroup snmp_traps
+ * Encodes trap header part that is SNMP v1 header specific.
+ * @param trap Trap message
+ * @param pbuf_stream stream used for storing data inside pbuf
+ */
+static err_t
+snmp_trap_header_enc_v1_specific(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream)
+{
+  struct snmp_asn1_tlv tlv;
   /* object ID */
   SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OBJECT_ID, 0, 0);
   snmp_asn1_enc_oid_cnt(trap->enterprise->id, trap->enterprise->len, &tlv.value_len);
@@ -434,7 +746,7 @@
 #endif
   }
 
-  /* trap length */
+  /* generic trap */
   SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
   snmp_asn1_enc_s32t_cnt(trap->gen_trap, &tlv.value_len);
   BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
@@ -455,4 +767,124 @@
   return ERR_OK;
 }
 
+/**
+ * @ingroup snmp_traps
+ * Encodes trap header part that is SNMP v2c header specific.
+ *
+ * @param trap Trap message
+ * @param pbuf_stream stream used for storing data inside pbuf
+ */
+static err_t
+snmp_trap_header_enc_v2c_specific(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream)
+{
+  struct snmp_asn1_tlv tlv;
+  /* request id */
+  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
+  snmp_asn1_enc_s32t_cnt(req_id, &tlv.value_len);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, req_id) );
+
+  /* error status */
+  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
+  snmp_asn1_enc_s32t_cnt(trap->error_status, &tlv.value_len);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->error_status) );
+
+  /* error index */
+  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
+  snmp_asn1_enc_s32t_cnt(trap->error_index, &tlv.value_len);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->error_index) );
+
+  return ERR_OK;
+}
+
+/**
+ * @ingroup snmp_traps
+ * Encodes trap header from head to tail.
+ *
+ * @param trap Trap message
+ * @param pbuf_stream stream used for storing data inside pbuf
+ */
+static err_t
+snmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream)
+{
+  struct snmp_asn1_tlv tlv;
+
+  /* 'Message' sequence */
+  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 0, trap->seqlen);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+
+  /* version */
+  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);
+  snmp_asn1_enc_s32t_cnt(trap->snmp_version, &tlv.value_len);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->snmp_version) );
+
+  /* community */
+  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, trap->comlen);
+  BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );
+  BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream,  (const u8_t *)snmp_community_trap, trap->comlen) );
+
+  /* PDU */
+  BUILD_EXEC( snmp_trap_header_enc_pdu(trap, pbuf_stream) );
+  if (trap->snmp_version == SNMP_VERSION_1) {
+    /* object ID, IP addr, generic trap, specific trap, timestamp */
+    BUILD_EXEC( snmp_trap_header_enc_v1_specific(trap, pbuf_stream) );
+  } else if (SNMP_VERSION_2c == trap->snmp_version) {
+    /* request id, error status, error index */
+    BUILD_EXEC( snmp_trap_header_enc_v2c_specific(trap, pbuf_stream) );
+  }
+
+  return ERR_OK;
+}
+
+/**
+ * @ingroup snmp_traps
+ * Wrapper function for sending informs
+ * @param specific_trap will be appended to enterprise oid [see RFC 3584]
+ * @param varbinds linked list of varbinds (at the beginning of this list function will insert 2 special purpose varbinds [see RFC 3584])
+ * @param ptr_request_id [out] variable in which to store request_id needed to verify acknowledgement
+ * @return ERR_OK if successful
+ */
+err_t
+snmp_send_inform_specific(s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id)
+{
+  return snmp_send_inform(NULL, SNMP_GENTRAP_ENTERPRISE_SPECIFIC, specific_trap, varbinds, ptr_request_id);
+}
+
+/**
+ * @ingroup snmp_traps
+ * Wrapper function for sending informs
+ * @param generic_trap is the trap code
+ * @param varbinds linked list of varbinds (at the beginning of this list function will insert 2 special purpose varbinds [see RFC 3584])
+ * @param ptr_request_id [out] variable in which to store request_id needed to verify acknowledgement
+ * @return ERR_OK if successful
+ */
+err_t
+snmp_send_inform_generic(s32_t generic_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id)
+{
+  return snmp_send_inform(NULL, generic_trap, 0, varbinds, ptr_request_id);
+}
+
+/**
+ * @ingroup snmp_traps
+ * Generic function for sending informs
+ * @param oid points to object identifier
+ * @param generic_trap is the trap code
+ * @param specific_trap used for enterprise traps when generic_trap == 6
+ * @param varbinds linked list of varbinds (at the beginning of this list function will insert 2 special purpose varbinds [see RFC 3584])
+ * @param ptr_request_id [out] variable in which to store request_id needed to verify acknowledgement
+ * @return ERR_OK if successful
+ */
+err_t
+snmp_send_inform(const struct snmp_obj_id* oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id)
+{
+  struct snmp_msg_trap trap_msg = {0};
+  trap_msg.snmp_version = SNMP_VERSION_2c;
+  trap_msg.trap_or_inform = SNMP_IS_INFORM;
+  *ptr_request_id = req_id;
+  return snmp_send_trap_or_notification_or_inform_generic(&trap_msg, oid, generic_trap, specific_trap, varbinds);
+}
+
 #endif /* LWIP_SNMP */
diff --git a/src/apps/sntp/sntp.c b/src/apps/sntp/sntp.c
index 23731e5..0e7f365 100644
--- a/src/apps/sntp/sntp.c
+++ b/src/apps/sntp/sntp.c
@@ -42,6 +42,8 @@
  * This is simple "SNTP" client for the lwIP raw API.
  * It is a minimal implementation of SNTPv4 as specified in RFC 4330.
  *
+ * You need to increase MEMP_NUM_SYS_TIMEOUT by one if you use SNTP!
+ *
  * For a list of some public NTP servers, see this link:
  * http://support.ntp.org/bin/view/Servers/NTPPoolServers
  *
@@ -235,6 +237,9 @@
   /** Reachability shift register as described in RFC 5905 */
   u8_t reachability;
 #endif /* SNTP_MONITOR_SERVER_REACHABILITY */
+#if SNTP_SUPPORT_MULTIPLE_SERVERS
+  u8_t kod_received;
+#endif
 };
 static struct sntp_server sntp_servers[SNTP_MAX_SERVERS];
 
@@ -411,6 +416,10 @@
     if (sntp_current_server >= SNTP_MAX_SERVERS) {
       sntp_current_server = 0;
     }
+    if (sntp_servers[sntp_current_server].kod_received) {
+      /* KOD received, don't use this server */
+      continue;
+    }
     if (!ip_addr_isany(&sntp_servers[sntp_current_server].addr)
 #if SNTP_SERVER_DNS
         || (sntp_servers[sntp_current_server].name != NULL)
@@ -429,9 +438,18 @@
   sntp_current_server = old_server;
   sntp_retry(NULL);
 }
+
+static void
+sntp_kod_try_next_server(void *arg)
+{
+  sntp_servers[sntp_current_server].kod_received = 1;
+  sntp_try_next_server(arg);
+}
+
 #else /* SNTP_SUPPORT_MULTIPLE_SERVERS */
 /* Always retry on error if only one server is supported */
-#define sntp_try_next_server    sntp_retry
+#define sntp_try_next_server     sntp_retry
+#define sntp_kod_try_next_server sntp_retry
 #endif /* SNTP_SUPPORT_MULTIPLE_SERVERS */
 
 /** UDP recv callback for the sntp pcb */
@@ -449,7 +467,7 @@
   err = ERR_ARG;
 #if SNTP_CHECK_RESPONSE >= 1
   /* check server address and port */
-  if (((sntp_opmode != SNTP_OPMODE_POLL) || ip_addr_cmp(addr, &sntp_last_server_address)) &&
+  if (((sntp_opmode != SNTP_OPMODE_POLL) || ip_addr_eq(addr, &sntp_last_server_address)) &&
       (port == SNTP_PORT))
 #else /* SNTP_CHECK_RESPONSE >= 1 */
   LWIP_UNUSED_ARG(addr);
@@ -528,7 +546,7 @@
     /* KOD errors are only processed in case of an explicit poll response */
     if (sntp_opmode == SNTP_OPMODE_POLL) {
       /* Kiss-of-death packet. Use another server or increase UPDATE_DELAY. */
-      sntp_try_next_server(NULL);
+      sntp_kod_try_next_server(NULL);
     }
   } else {
     /* ignore any broken packet, poll mode: retry after timeout to avoid flooding */
@@ -787,6 +805,9 @@
   if (idx < SNTP_MAX_SERVERS) {
     if (server != NULL) {
       sntp_servers[idx].addr = (*server);
+#if SNTP_SUPPORT_MULTIPLE_SERVERS
+      sntp_servers[idx].kod_received = 0;
+#endif
     } else {
       ip_addr_set_zero(&sntp_servers[idx].addr);
     }
@@ -867,6 +888,27 @@
   return IP_ADDR_ANY;
 }
 
+/**
+ * @ingroup sntp
+ * Check if a Kiss-of-Death has been received from this server (only valid for
+ * SNTP_MAX_SERVERS > 1).
+ *
+ * @param idx the index of the NTP server
+ * @return 1 if a KoD has been received, 0 if not.
+ */
+u8_t
+sntp_getkodreceived(u8_t idx)
+{
+#if SNTP_SUPPORT_MULTIPLE_SERVERS
+  if (idx < SNTP_MAX_SERVERS) {
+    return sntp_servers[idx].kod_received;
+  }
+#else
+  LWIP_UNUSED_ARG(idx);
+#endif
+  return 0;
+}
+
 #if SNTP_SERVER_DNS
 /**
  * Initialize one of the NTP servers by name
@@ -880,6 +922,9 @@
   LWIP_ASSERT_CORE_LOCKED();
   if (idx < SNTP_MAX_SERVERS) {
     sntp_servers[idx].name = server;
+#if SNTP_SUPPORT_MULTIPLE_SERVERS
+    sntp_servers[idx].kod_received = 0;
+#endif
   }
 }
 
diff --git a/src/apps/tftp/tftp_server.c b/src/apps/tftp/tftp.c
similarity index 67%
rename from src/apps/tftp/tftp_server.c
rename to src/apps/tftp/tftp.c
index e3f1512..ddfdbfc 100644
--- a/src/apps/tftp/tftp_server.c
+++ b/src/apps/tftp/tftp.c
@@ -1,6 +1,6 @@
 /**
  *
- * @file tftp_server.c
+ * @file tftp.c
  *
  * @author   Logan Gunthorpe <logang@deltatee.com>
  *           Dirk Ziegelmeier <dziegel@gmx.de>
@@ -41,12 +41,14 @@
  */
 
 /**
- * @defgroup tftp TFTP server
+ * @defgroup tftp TFTP client/server
  * @ingroup apps
  *
- * This is simple TFTP server for the lwIP raw API.
+ * This is simple TFTP client/server for the lwIP raw API.
+ * You need to increase MEMP_NUM_SYS_TIMEOUT by one if you use TFTP!
  */
 
+#include "lwip/apps/tftp_client.h"
 #include "lwip/apps/tftp_server.h"
 
 #if LWIP_UDP
@@ -88,6 +90,7 @@
   u16_t blknum;
   u8_t retries;
   u8_t mode_write;
+  u8_t tftp_mode;
 };
 
 static struct tftp_state tftp_state;
@@ -114,64 +117,102 @@
   }
 }
 
-static void
+static struct pbuf*
+init_packet(u16_t opcode, u16_t extra, size_t size)
+{
+  struct pbuf* p = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(TFTP_HEADER_LENGTH + size), PBUF_RAM);
+  u16_t* payload;
+
+  if (p != NULL) {
+    payload = (u16_t*) p->payload;
+    payload[0] = PP_HTONS(opcode);
+    payload[1] = lwip_htons(extra);
+  }
+
+  return p;
+}
+
+static err_t
+send_request(const ip_addr_t *addr, u16_t port, u16_t opcode, const char* fname, const char* mode)
+{
+  size_t fname_length = strlen(fname)+1;
+  size_t mode_length = strlen(mode)+1;
+  struct pbuf* p = init_packet(opcode, 0, fname_length + mode_length - 2);
+  char* payload;
+  err_t ret;
+
+  if (p == NULL) {
+    return ERR_MEM;
+  }
+
+  payload = (char*) p->payload;
+  MEMCPY(payload+2,              fname, fname_length);
+  MEMCPY(payload+2+fname_length, mode,  mode_length);
+
+  ret = udp_sendto(tftp_state.upcb, p, addr, port);
+  pbuf_free(p);
+  return ret;
+}
+
+static err_t
 send_error(const ip_addr_t *addr, u16_t port, enum tftp_error code, const char *str)
 {
   int str_length = strlen(str);
   struct pbuf *p;
   u16_t *payload;
+  err_t ret;
 
-  p = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(TFTP_HEADER_LENGTH + str_length + 1), PBUF_RAM);
+  p = init_packet(TFTP_ERROR, code, str_length + 1);
   if (p == NULL) {
-    return;
+    return ERR_MEM;
   }
 
   payload = (u16_t *) p->payload;
-  payload[0] = PP_HTONS(TFTP_ERROR);
-  payload[1] = lwip_htons(code);
   MEMCPY(&payload[2], str, str_length + 1);
 
-  udp_sendto(tftp_state.upcb, p, addr, port);
+  ret = udp_sendto(tftp_state.upcb, p, addr, port);
   pbuf_free(p);
+  return ret;
 }
 
-static void
-send_ack(u16_t blknum)
+static err_t
+send_ack(const ip_addr_t *addr, u16_t port, u16_t blknum)
 {
   struct pbuf *p;
-  u16_t *payload;
+  err_t ret;
 
-  p = pbuf_alloc(PBUF_TRANSPORT, TFTP_HEADER_LENGTH, PBUF_RAM);
+  p = init_packet(TFTP_ACK, blknum, 0);
   if (p == NULL) {
-    return;
+    return ERR_MEM;
   }
-  payload = (u16_t *) p->payload;
 
-  payload[0] = PP_HTONS(TFTP_ACK);
-  payload[1] = lwip_htons(blknum);
-  udp_sendto(tftp_state.upcb, p, &tftp_state.addr, tftp_state.port);
+  ret = udp_sendto(tftp_state.upcb, p, addr, port);
   pbuf_free(p);
+  return ret;
 }
 
-static void
-resend_data(void)
+static err_t
+resend_data(const ip_addr_t *addr, u16_t port)
 {
+  err_t ret;
   struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, tftp_state.last_data->len, PBUF_RAM);
   if (p == NULL) {
-    return;
+    return ERR_MEM;
   }
 
-  if (pbuf_copy(p, tftp_state.last_data) != ERR_OK) {
+  ret = pbuf_copy(p, tftp_state.last_data);
+  if (ret != ERR_OK) {
     pbuf_free(p);
-    return;
+    return ret;
   }
 
-  udp_sendto(tftp_state.upcb, p, &tftp_state.addr, tftp_state.port);
+  ret = udp_sendto(tftp_state.upcb, p, addr, port);
   pbuf_free(p);
+  return ret;
 }
 
 static void
-send_data(void)
+send_data(const ip_addr_t *addr, u16_t port)
 {
   u16_t *payload;
   int ret;
@@ -180,28 +221,26 @@
     pbuf_free(tftp_state.last_data);
   }
 
-  tftp_state.last_data = pbuf_alloc(PBUF_TRANSPORT, TFTP_HEADER_LENGTH + TFTP_MAX_PAYLOAD_SIZE, PBUF_RAM);
+  tftp_state.last_data = init_packet(TFTP_DATA, tftp_state.blknum, TFTP_MAX_PAYLOAD_SIZE);
   if (tftp_state.last_data == NULL) {
     return;
   }
 
   payload = (u16_t *) tftp_state.last_data->payload;
-  payload[0] = PP_HTONS(TFTP_DATA);
-  payload[1] = lwip_htons(tftp_state.blknum);
 
   ret = tftp_state.ctx->read(tftp_state.handle, &payload[2], TFTP_MAX_PAYLOAD_SIZE);
   if (ret < 0) {
-    send_error(&tftp_state.addr, tftp_state.port, TFTP_ERROR_ACCESS_VIOLATION, "Error occured while reading the file.");
+    send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Error occurred while reading the file.");
     close_handle();
     return;
   }
 
   pbuf_realloc(tftp_state.last_data, (u16_t)(TFTP_HEADER_LENGTH + ret));
-  resend_data();
+  resend_data(addr, port);
 }
 
 static void
-recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
+tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
 {
   u16_t *sbuf = (u16_t *) p->payload;
   int opcode;
@@ -210,7 +249,7 @@
   LWIP_UNUSED_ARG(upcb);
 
   if (((tftp_state.port != 0) && (port != tftp_state.port)) ||
-      (!ip_addr_isany_val(tftp_state.addr) && !ip_addr_cmp(&tftp_state.addr, addr))) {
+      (!ip_addr_isany_val(tftp_state.addr) && !ip_addr_eq(&tftp_state.addr, addr))) {
     send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Only one connection at a time is supported");
     pbuf_free(p);
     return;
@@ -235,6 +274,11 @@
         break;
       }
 
+      if ((tftp_state.tftp_mode & LWIP_TFTP_MODE_SERVER) == 0) {
+        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "TFTP server not enabled");
+        break;
+      }
+
       sys_timeout(TFTP_TIMER_MSECS, tftp_tmr, NULL);
 
       /* find \0 in pbuf -> end of filename string */
@@ -270,10 +314,10 @@
 
       if (opcode == PP_HTONS(TFTP_WRQ)) {
         tftp_state.mode_write = 1;
-        send_ack(0);
+        send_ack(addr, port, 0);
       } else {
         tftp_state.mode_write = 0;
-        send_data();
+        send_data(addr, port);
       }
 
       break;
@@ -302,7 +346,7 @@
           send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "error writing file");
           close_handle();
         } else {
-          send_ack(blknum);
+          send_ack(addr, port, blknum);
         }
 
         if (p->tot_len < TFTP_MAX_PAYLOAD_SIZE) {
@@ -312,7 +356,7 @@
         }
       } else if ((u16_t)(blknum + 1) == tftp_state.blknum) {
         /* retransmit of previous block, ack again (casting to u16_t to care for overflow) */
-        send_ack(blknum);
+        send_ack(addr, port, blknum);
       } else {
         send_error(addr, port, TFTP_ERROR_UNKNOWN_TRFR_ID, "Wrong block number");
       }
@@ -347,14 +391,20 @@
 
       if (!lastpkt) {
         tftp_state.blknum++;
-        send_data();
+        send_data(addr, port);
       } else {
         close_handle();
       }
 
       break;
     }
-
+    case PP_HTONS(TFTP_ERROR):
+      if (tftp_state.handle != NULL) {
+        pbuf_remove_header(p, TFTP_HEADER_LENGTH);
+        tftp_state.ctx->error(tftp_state.handle, sbuf[1], (const char*)p->payload, p->len);
+        close_handle();
+      }
+      break;
     default:
       send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, "Unknown operation");
       break;
@@ -379,7 +429,7 @@
   if ((tftp_state.timer - tftp_state.last_pkt) > (TFTP_TIMEOUT_MSECS / TFTP_TIMER_MSECS)) {
     if ((tftp_state.last_data != NULL) && (tftp_state.retries < TFTP_MAX_RETRIES)) {
       LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, ("tftp: timeout, retrying\n"));
-      resend_data();
+      resend_data(&tftp_state.addr, tftp_state.port);
       tftp_state.retries++;
     } else {
       LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, ("tftp: timeout\n"));
@@ -388,12 +438,13 @@
   }
 }
 
-/** @ingroup tftp
- * Initialize TFTP server.
+/**
+ * Initialize TFTP client/server.
+ * @param mode TFTP mode (client/server)
  * @param ctx TFTP callback struct
  */
 err_t
-tftp_init(const struct tftp_context *ctx)
+tftp_init_common(u8_t mode, const struct tftp_context *ctx)
 {
   err_t ret;
 
@@ -415,14 +466,35 @@
   tftp_state.timer     = 0;
   tftp_state.last_data = NULL;
   tftp_state.upcb      = pcb;
+  tftp_state.tftp_mode = mode;
 
-  udp_recv(pcb, recv, NULL);
+  udp_recv(pcb, tftp_recv, NULL);
 
   return ERR_OK;
 }
 
 /** @ingroup tftp
- * Deinitialize ("turn off") TFTP server.
+ * Initialize TFTP server.
+ * @param ctx TFTP callback struct
+ */
+err_t
+tftp_init_server(const struct tftp_context *ctx)
+{
+  return tftp_init_common(LWIP_TFTP_MODE_SERVER, ctx);
+}
+
+/** @ingroup tftp
+ * Initialize TFTP client.
+ * @param ctx TFTP callback struct
+ */
+err_t
+tftp_init_client(const struct tftp_context *ctx)
+{
+  return tftp_init_common(LWIP_TFTP_MODE_CLIENT, ctx);
+}
+
+/** @ingroup tftp
+ * Deinitialize ("turn off") TFTP client/server.
  */
 void tftp_cleanup(void)
 {
@@ -432,4 +504,45 @@
   memset(&tftp_state, 0, sizeof(tftp_state));
 }
 
+static const char *
+mode_to_string(enum tftp_transfer_mode mode)
+{
+  if (mode == TFTP_MODE_OCTET) {
+    return "octet";
+  }
+  if (mode == TFTP_MODE_NETASCII) {
+    return "netascii";
+  }
+  if (mode == TFTP_MODE_BINARY) {
+    return "binary";
+  }
+  return NULL;
+}
+
+err_t
+tftp_get(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enum tftp_transfer_mode mode)
+{
+  LWIP_ERROR("TFTP client is not enabled (tftp_init)", (tftp_state.tftp_mode & LWIP_TFTP_MODE_CLIENT) != 0, return ERR_VAL);
+  LWIP_ERROR("tftp_get: invalid file name", fname != NULL, return ERR_VAL);
+  LWIP_ERROR("tftp_get: invalid mode", mode <= TFTP_MODE_BINARY, return ERR_VAL);
+
+  tftp_state.handle = handle;
+  tftp_state.blknum = 1;
+  tftp_state.mode_write = 1; /* We want to receive data */
+  return send_request(addr, port, TFTP_RRQ, fname, mode_to_string(mode));
+}
+
+err_t
+tftp_put(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enum tftp_transfer_mode mode)
+{
+  LWIP_ERROR("TFTP client is not enabled (tftp_init)", (tftp_state.tftp_mode & LWIP_TFTP_MODE_CLIENT) != 0, return ERR_VAL);
+  LWIP_ERROR("tftp_put: invalid file name", fname != NULL, return ERR_VAL);
+  LWIP_ERROR("tftp_put: invalid mode", mode <= TFTP_MODE_BINARY, return ERR_VAL);
+
+  tftp_state.handle = handle;
+  tftp_state.blknum = 1;
+  tftp_state.mode_write = 0; /* We want to send data */
+  return send_request(addr, port, TFTP_WRQ, fname, mode_to_string(mode));
+}
+
 #endif /* LWIP_UDP */
diff --git a/src/core/altcp.c b/src/core/altcp.c
index 4abef7c..9644e82 100644
--- a/src/core/altcp.c
+++ b/src/core/altcp.c
@@ -40,7 +40,7 @@
  * * Replace "struct tcp_pcb" with "struct altcp_pcb"
  * * Prefix all called tcp API functions with "altcp_" instead of "tcp_" to link
  *   against the altcp functions
- * * @ref altcp_new (and @ref altcp_new_ip_type/@ref altcp_new_ip6) take
+ * * @ref altcp_new (and @ref altcp_new_ip_type / @ref altcp_new_ip6) take
  *   an @ref altcp_allocator_t as an argument, whereas the original tcp API
  *   functions take no arguments.
  * * An @ref altcp_allocator_t allocator is an object that holds a pointer to an
@@ -75,7 +75,7 @@
  * It is not defined by lwIP itself but by the TLS port (e.g. altcp_tls to mbedTLS
  * adaption). However, the parameters used to create it are defined in @ref
  * altcp_tls.h (see @ref altcp_tls_create_config_server_privkey_cert for servers
- * and @ref altcp_tls_create_config_client/@ref altcp_tls_create_config_client_2wayauth
+ * and @ref altcp_tls_create_config_client / @ref altcp_tls_create_config_client_2wayauth
  * for clients).
  *
  * For mbedTLS, ensure that certificates can be parsed by 'mbedtls_x509_crt_parse()' and
@@ -158,7 +158,7 @@
 
 /**
  * @ingroup altcp
- * altcp_new_ip6: @ref altcp_new for IPv6 
+ * altcp_new_ip6: @ref altcp_new for IPv6
  */
 struct altcp_pcb *
 altcp_new_ip6(altcp_allocator_t *allocator)
@@ -166,9 +166,9 @@
   return altcp_new_ip_type(allocator, IPADDR_TYPE_V6);
 }
 
-/** 
+/**
  * @ingroup altcp
- * altcp_new: @ref altcp_new for IPv4 
+ * altcp_new: @ref altcp_new for IPv4
  */
 struct altcp_pcb *
 altcp_new(altcp_allocator_t *allocator)
diff --git a/src/core/altcp_alloc.c b/src/core/altcp_alloc.c
index cd619bc..06ed90d 100644
--- a/src/core/altcp_alloc.c
+++ b/src/core/altcp_alloc.c
@@ -1,6 +1,6 @@
 /**
  * @file
- * Application layered TCP connection API (to be used from TCPIP thread)\n
+ * Application layered TCP connection API (to be used from TCPIP thread)<br>
  * This interface mimics the tcp callback API to the application while preventing
  * direct linking (much like virtual functions).
  * This way, an application can make use of other application layer protocols
diff --git a/src/core/altcp_tcp.c b/src/core/altcp_tcp.c
index 1869e2a..4f21b70 100644
--- a/src/core/altcp_tcp.c
+++ b/src/core/altcp_tcp.c
@@ -1,6 +1,7 @@
 /**
  * @file
- * Application layered TCP connection API (to be used from TCPIP thread)\n
+ * Application layered TCP connection API (to be used from TCPIP thread)
+ *
  * This interface mimics the tcp callback API to the application while preventing
  * direct linking (much like virtual functions).
  * This way, an application can make use of other application layer protocols
@@ -74,7 +75,7 @@
 altcp_tcp_accept(void *arg, struct tcp_pcb *new_tpcb, err_t err)
 {
   struct altcp_pcb *listen_conn = (struct altcp_pcb *)arg;
-  if (listen_conn && listen_conn->accept) {
+  if (new_tpcb && listen_conn && listen_conn->accept) {
     /* create a new altcp_conn to pass to the next 'accept' callback */
     struct altcp_pcb *new_conn = altcp_alloc();
     if (new_conn == NULL) {
diff --git a/src/core/def.c b/src/core/def.c
index 9da36fe..282fb41 100644
--- a/src/core/def.c
+++ b/src/core/def.c
@@ -118,6 +118,29 @@
 }
 #endif
 
+#ifndef lwip_strnistr
+/**
+ * @ingroup sys_nonstandard
+ * lwIP default implementation for strnistr() non-standard function.
+ * This can be \#defined to strnistr() depending on your platform port.
+ */
+char *
+lwip_strnistr(const char *buffer, const char *token, size_t n)
+{
+  const char *p;
+  size_t tokenlen = strlen(token);
+  if (tokenlen == 0) {
+    return LWIP_CONST_CAST(char *, buffer);
+  }
+  for (p = buffer; *p && (p + tokenlen <= buffer + n); p++) {
+    if (lwip_strnicmp(p, token, tokenlen) == 0) {
+      return LWIP_CONST_CAST(char *, p);
+    }
+  }
+  return NULL;
+}
+#endif
+
 #ifndef lwip_stricmp
 /**
  * @ingroup sys_nonstandard
diff --git a/src/core/dns.c b/src/core/dns.c
index 9d2f61e..6540f14 100644
--- a/src/core/dns.c
+++ b/src/core/dns.c
@@ -277,7 +277,7 @@
 #endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
 
 static void dns_init_local(void);
-static err_t dns_lookup_local(const char *hostname, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype));
+static err_t dns_lookup_local(const char *hostname, size_t hostnamelen, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype));
 #endif /* DNS_LOCAL_HOSTLIST */
 
 
@@ -476,18 +476,32 @@
 err_t
 dns_local_lookup(const char *hostname, ip_addr_t *addr, u8_t dns_addrtype)
 {
+  size_t hostnamelen;
   LWIP_UNUSED_ARG(dns_addrtype);
-  return dns_lookup_local(hostname, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype));
+  if ((addr == NULL) ||
+      (!hostname) || (!hostname[0])) {
+    return ERR_ARG;
+  }
+  hostnamelen = strlen(hostname);
+  if (hostname[hostnamelen - 1] == '.') {
+    hostnamelen--;
+  }
+  if (hostnamelen >= DNS_MAX_NAME_LENGTH) {
+    LWIP_DEBUGF(DNS_DEBUG, ("dns_local_lookup: name too long to resolve\n"));
+    return ERR_ARG;
+  }
+  return dns_lookup_local(hostname, hostnamelen, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype));
 }
 
 /* Internal implementation for dns_local_lookup and dns_lookup */
 static err_t
-dns_lookup_local(const char *hostname, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
+dns_lookup_local(const char *hostname, size_t hostnamelen, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
 {
 #if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
   struct local_hostlist_entry *entry = local_hostlist_dynamic;
   while (entry != NULL) {
-    if ((lwip_stricmp(entry->name, hostname) == 0) &&
+    if ((lwip_strnicmp(entry->name, hostname, hostnamelen) == 0) &&
+        !entry->name[hostnamelen] &&
         LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, entry->addr)) {
       if (addr) {
         ip_addr_copy(*addr, entry->addr);
@@ -499,7 +513,8 @@
 #else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
   size_t i;
   for (i = 0; i < LWIP_ARRAYSIZE(local_hostlist_static); i++) {
-    if ((lwip_stricmp(local_hostlist_static[i].name, hostname) == 0) &&
+    if ((lwip_strnicmp(local_hostlist_static[i].name, hostname, hostnamelen) == 0) &&
+        !local_hostlist_static[i].name[hostnamelen] &&
         LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, local_hostlist_static[i].addr)) {
       if (addr) {
         ip_addr_copy(*addr, local_hostlist_static[i].addr);
@@ -530,7 +545,7 @@
   struct local_hostlist_entry *last_entry = NULL;
   while (entry != NULL) {
     if (((hostname == NULL) || !lwip_stricmp(entry->name, hostname)) &&
-        ((addr == NULL) || ip_addr_cmp(&entry->addr, addr))) {
+        ((addr == NULL) || ip_addr_eq(&entry->addr, addr))) {
       struct local_hostlist_entry *free_entry;
       if (last_entry != NULL) {
         last_entry->next = entry->next;
@@ -593,30 +608,34 @@
  * for a hostname.
  *
  * @param name the hostname to look up
+ * @param hostnamelen length of the hostname
  * @param addr the hostname's IP address, as u32_t (instead of ip_addr_t to
  *         better check for failure: != IPADDR_NONE) or IPADDR_NONE if the hostname
  *         was not found in the cached dns_table.
  * @return ERR_OK if found, ERR_ARG if not found
  */
 static err_t
-dns_lookup(const char *name, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
+dns_lookup(const char *name, size_t hostnamelen, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
 {
+  size_t namelen;
   u8_t i;
 #if DNS_LOCAL_HOSTLIST
-  if (dns_lookup_local(name, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
+  if (dns_lookup_local(name, hostnamelen, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
     return ERR_OK;
   }
 #endif /* DNS_LOCAL_HOSTLIST */
 #ifdef DNS_LOOKUP_LOCAL_EXTERN
-  if (DNS_LOOKUP_LOCAL_EXTERN(name, addr, LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(dns_addrtype)) == ERR_OK) {
+  if (DNS_LOOKUP_LOCAL_EXTERN(name, hostnamelen, addr, LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(dns_addrtype)) == ERR_OK) {
     return ERR_OK;
   }
 #endif /* DNS_LOOKUP_LOCAL_EXTERN */
 
+  namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH - 1);
   /* Walk through name list, return entry if found. If not, return NULL. */
   for (i = 0; i < DNS_TABLE_SIZE; ++i) {
     if ((dns_table[i].state == DNS_STATE_DONE) &&
-        (lwip_strnicmp(name, dns_table[i].name, sizeof(dns_table[i].name)) == 0) &&
+        (lwip_strnicmp(name, dns_table[i].name, namelen) == 0) &&
+        !dns_table[i].name[namelen] &&
         LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, dns_table[i].ipaddr)) {
       LWIP_DEBUGF(DNS_DEBUG, ("dns_lookup: \"%s\": found = ", name));
       ip_addr_debug_print_val(DNS_DEBUG, dns_table[i].ipaddr);
@@ -1218,7 +1237,7 @@
         {
           /* Check whether response comes from the same network address to which the
              question was sent. (RFC 5452) */
-          if (!ip_addr_cmp(addr, &dns_servers[entry->server_idx])) {
+          if (!ip_addr_eq(addr, &dns_servers[entry->server_idx])) {
             goto ignore_packet; /* ignore this packet */
           }
         }
@@ -1380,13 +1399,18 @@
   struct dns_table_entry *entry = NULL;
   size_t namelen;
   struct dns_req_entry *req;
-
 #if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
   u8_t r;
+#endif
+
+  namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH - 1);
+
+#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
   /* check for duplicate entries */
   for (i = 0; i < DNS_TABLE_SIZE; i++) {
     if ((dns_table[i].state == DNS_STATE_ASKING) &&
-        (lwip_strnicmp(name, dns_table[i].name, sizeof(dns_table[i].name)) == 0)) {
+        (lwip_strnicmp(name, dns_table[i].name, namelen) == 0) &&
+        !dns_table[i].name[namelen]) {
 #if LWIP_IPV4 && LWIP_IPV6
       if (dns_table[i].reqaddrtype != dns_addrtype) {
         /* requested address types don't match
@@ -1397,7 +1421,7 @@
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
       /* this is a duplicate entry, find a free request entry */
       for (r = 0; r < DNS_MAX_REQUESTS; r++) {
-        if (dns_requests[r].found == 0) {
+        if (dns_requests[r].found == NULL) {
           dns_requests[r].found = found;
           dns_requests[r].arg = callback_arg;
           dns_requests[r].dns_table_idx = i;
@@ -1473,7 +1497,6 @@
   LWIP_DNS_SET_ADDRTYPE(req->reqaddrtype, dns_addrtype);
   req->found = found;
   req->arg   = callback_arg;
-  namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH - 1);
   MEMCPY(entry->name, name, namelen);
   entry->name[namelen] = 0;
 
@@ -1563,8 +1586,11 @@
   }
 #endif
   hostnamelen = strlen(hostname);
+  if (hostname[hostnamelen - 1] == '.') {
+    hostnamelen--;
+  }
   if (hostnamelen >= DNS_MAX_NAME_LENGTH) {
-    LWIP_DEBUGF(DNS_DEBUG, ("dns_gethostbyname: name too long to resolve"));
+    LWIP_DEBUGF(DNS_DEBUG, ("dns_gethostbyname: name too long to resolve\n"));
     return ERR_ARG;
   }
 
@@ -1587,7 +1613,7 @@
     }
   }
   /* already have this address cached? */
-  if (dns_lookup(hostname, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
+  if (dns_lookup(hostname, hostnamelen, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
     return ERR_OK;
   }
 #if LWIP_IPV4 && LWIP_IPV6
@@ -1599,7 +1625,7 @@
     } else {
       fallback = LWIP_DNS_ADDRTYPE_IPV4;
     }
-    if (dns_lookup(hostname, addr LWIP_DNS_ADDRTYPE_ARG(fallback)) == ERR_OK) {
+    if (dns_lookup(hostname, hostnamelen, addr LWIP_DNS_ADDRTYPE_ARG(fallback)) == ERR_OK) {
       return ERR_OK;
     }
   }
diff --git a/src/core/inet_chksum.c b/src/core/inet_chksum.c
index 818c68f..6a343ed 100644
--- a/src/core/inet_chksum.c
+++ b/src/core/inet_chksum.c
@@ -1,6 +1,6 @@
 /**
  * @file
- * Internet checksum functions.\n
+ * Internet checksum functions.
  *
  * These are some reference implementations of the checksum algorithm, with the
  * aim of being simple, correct and fully portable. Checksumming is the
@@ -74,7 +74,7 @@
  * @return host order (!) lwip checksum (non-inverted Internet sum)
  *
  * @note accumulator size limits summable length to 64k
- * @note host endianess is irrelevant (p3 RFC1071)
+ * @note host endianness is irrelevant (p3 RFC1071)
  */
 u16_t
 lwip_standard_chksum(const void *dataptr, int len)
diff --git a/src/core/init.c b/src/core/init.c
index 3620e1d..0013a89 100644
--- a/src/core/init.c
+++ b/src/core/init.c
@@ -127,7 +127,7 @@
 #endif
 /* There must be sufficient timeouts, taking into account requirements of the subsystems. */
 #if LWIP_TIMERS && (MEMP_NUM_SYS_TIMEOUT < LWIP_NUM_SYS_TIMEOUT_INTERNAL)
-#error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts"
+#error "MEMP_NUM_SYS_TIMEOUT is too low to accommodate all required timeouts"
 #endif
 #if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS))
 #error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!"
@@ -184,8 +184,8 @@
 #if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP)
 #error "If you want to use DHCP/AUTOIP cooperation mode, you have to define LWIP_DHCP=1 and LWIP_AUTOIP=1 in your lwipopts.h"
 #endif
-#if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK)
-#error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h"
+#if (((!LWIP_DHCP) || (!LWIP_ARP) || (!LWIP_ACD)) && LWIP_DHCP_DOES_ACD_CHECK)
+#error "If you want to use DHCP ACD checking, you have to define LWIP_DHCP=1, LWIP_ARP=1 and LWIP_ACD=1 in your lwipopts.h"
 #endif
 #if (!LWIP_ARP && LWIP_AUTOIP)
 #error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h"
@@ -220,6 +220,9 @@
 #if PPP_SUPPORT && PPP_IPV6_SUPPORT && !LWIP_IPV6
 #error "PPP_IPV6_SUPPORT needs LWIP_IPV6 turned on"
 #endif
+#if PPP_SUPPORT && CCP_SUPPORT && !MPPE_SUPPORT
+#error "CCP_SUPPORT needs MPPE_SUPPORT turned on"
+#endif
 #if !LWIP_ETHERNET && (LWIP_ARP || PPPOE_SUPPORT)
 #error "LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT"
 #endif
@@ -306,6 +309,9 @@
 #if TCP_SNDLOWAT >= TCP_SND_BUF
 #error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must be less than TCP_SND_BUF. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
 #endif
+#if TCP_MSS >= ((16 * 1024) - 1)
+#error "lwip_sanity_check: WARNING: TCP_MSS must be <= 16382 to prevent u16_t underflow in TCP_SNDLOWAT calculation!"
+#endif
 #if TCP_SNDLOWAT >= (0xFFFF - (4 * TCP_MSS))
 #error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must at least be 4*MSS below u16_t overflow!"
 #endif
diff --git a/src/core/ipv4/acd.c b/src/core/ipv4/acd.c
new file mode 100644
index 0000000..2c7d867
--- /dev/null
+++ b/src/core/ipv4/acd.c
@@ -0,0 +1,557 @@
+/**
+ * @file
+ *
+ * ACD IPv4 Address Conflict Detection
+ *
+ * This is an IPv4 address conflict detection implementation for the lwIP TCP/IP
+ * stack. It aims to be conform to RFC5227.
+ *
+ * @defgroup acd ACD
+ * @ingroup ip4
+ * ACD related functions
+ * USAGE:
+ *
+ * define @ref LWIP_ACD 1 in your lwipopts.h
+ * Options:
+ * ACD_TMR_INTERVAL msecs,
+ *   I recommend a value of 100. The value must divide 1000 with a remainder almost 0.
+ *   Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 ....
+ *
+ * For fixed IP:
+ * - call acd_start after selecting an IP address. The caller will be informed
+ *   on conflict status via the callback function.
+ *
+ * With AUTOIP:
+ * - will be called from the autoip module. No extra's needed.
+ *
+ * With DHCP:
+ * - enable LWIP_DHCP_DOES_ACD_CHECK. Then it will be called from the dhcp module.
+ *   No extra's needed.
+ */
+
+/*
+ *
+ * Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>
+ * Copyright (c) 2018 Jasper Verschueren <jasper.verschueren@apart-audio.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.
+ *
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
+ * Author: Dominik Spies <kontakt@dspies.de>
+ */
+
+#include "lwip/opt.h"
+
+/* don't build if not configured for use in lwipopts.h */
+#if LWIP_IPV4 && LWIP_ACD
+
+#include <string.h>
+
+#include "lwip/acd.h"
+#include "lwip/prot/acd.h"
+
+#define ACD_FOREACH(acd, acd_list) for ((acd) = acd_list; (acd) != NULL; (acd) = (acd)->next)
+
+#define ACD_TICKS_PER_SECOND  (1000 / ACD_TMR_INTERVAL)
+
+/* Define good random function (LWIP_RAND) in lwipopts.h */
+#ifdef LWIP_RAND
+#define LWIP_ACD_RAND(netif, acd)    LWIP_RAND()
+#else /* LWIP_RAND */
+#ifdef LWIP_AUTOIP_RAND
+#include "lwip/autoip.h"
+#define LWIP_ACD_RAND(netif, acd)    LWIP_AUTOIP_RAND(netif) /* for backwards compatibility */
+#else
+#define LWIP_ACD_RAND(netif, acd) ((((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \
+                                    ((u32_t)((netif->hwaddr[3]) & 0xff) << 16) | \
+                                    ((u32_t)((netif->hwaddr[2]) & 0xff) << 8) | \
+                                    ((u32_t)((netif->hwaddr[4]) & 0xff))) + \
+                                    (acd->sent_num))
+#endif /* LWIP_AUTOIP_RAND */
+#endif /* LWIP_RAND */
+
+
+#define ACD_RANDOM_PROBE_WAIT(netif, acd) (LWIP_ACD_RAND(netif, acd) % \
+                                    (PROBE_WAIT * ACD_TICKS_PER_SECOND))
+
+#define ACD_RANDOM_PROBE_INTERVAL(netif, acd) ((LWIP_ACD_RAND(netif, acd) % \
+                                    ((PROBE_MAX - PROBE_MIN) * ACD_TICKS_PER_SECOND)) + \
+                                    (PROBE_MIN * ACD_TICKS_PER_SECOND ))
+
+/* Function definitions */
+static void acd_restart(struct netif *netif, struct acd *acd);
+static void acd_handle_arp_conflict(struct netif *netif, struct acd *acd);
+static void acd_put_in_passive_mode(struct netif *netif, struct acd *acd);
+
+/**
+ * @ingroup acd
+ * Add ACD client to the client list and initialize callback function
+ *
+ * @param netif                 network interface on which to start the acd
+ *                              client
+ * @param acd                   acd module to be added to the list
+ * @param acd_conflict_callback callback to be called when conflict information
+ *                              is available
+ */
+err_t
+acd_add(struct netif *netif, struct acd *acd,
+         acd_conflict_callback_t acd_conflict_callback)
+{
+  struct acd *acd2;
+
+  /* Set callback */
+  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT("acd_conflict_callback != NULL", acd_conflict_callback != NULL);
+  acd->acd_conflict_callback = acd_conflict_callback;
+
+  /* Check if the acd struct is already added */
+  for (acd2 = netif->acd_list; acd2 != NULL; acd2 = acd2->next) {
+    if (acd2 == acd) {
+      LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+                  ("acd_add(): acd already added to list\n"));
+      return ERR_OK;
+    }
+  }
+
+  /* add acd struct to the list */
+  acd->next = netif->acd_list;
+  netif->acd_list = acd;
+
+  return ERR_OK;
+}
+
+/**
+ * @ingroup acd
+ * Remvoe ACD client from the client list
+ *
+ * @param netif network interface from which to remove the acd client
+ * @param acd   acd module to be removed from the list
+ */
+void
+acd_remove(struct netif *netif, struct acd *acd)
+{
+  struct acd *acd2, *prev = NULL;
+
+  LWIP_ASSERT_CORE_LOCKED();
+
+  for (acd2 = netif->acd_list; acd2 != NULL; acd2 = acd2->next) {
+    if (acd2 == acd) {
+      if (prev) {
+        prev->next = acd->next;
+      } else {
+        netif->acd_list = acd->next;
+      }
+      return;
+    }
+    prev = acd2;
+  }
+  LWIP_ASSERT(("acd_remove(): acd not on list\n"), 0);
+}
+
+
+/**
+ * @ingroup acd
+ * Start ACD client
+ *
+ * @param netif   network interface on which to start the acd client
+ * @param acd     acd module to start
+ * @param ipaddr  ip address to perform acd on
+ */
+err_t
+acd_start(struct netif *netif, struct acd *acd, ip4_addr_t ipaddr)
+{
+  err_t result = ERR_OK;
+
+  LWIP_UNUSED_ARG(netif);
+  LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+              ("acd_start(netif=%p) %c%c%"U16_F"\n",
+              (void *)netif, netif->name[0],
+               netif->name[1], (u16_t)netif->num));
+
+  /* init probing state */
+  acd->sent_num = 0;
+  acd->lastconflict = 0;
+  ip4_addr_copy(acd->ipaddr, ipaddr);
+  acd->state = ACD_STATE_PROBE_WAIT;
+
+  acd->ttw = (u16_t)(ACD_RANDOM_PROBE_WAIT(netif, acd));
+
+  return result;
+}
+
+/**
+ * @ingroup acd
+ * Stop ACD client
+ *
+ * @param acd   acd module to stop
+ */
+err_t
+acd_stop(struct acd *acd)
+{
+  LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("acd_stop\n"));
+
+  if (acd != NULL) {
+    acd->state = ACD_STATE_OFF;
+  }
+  return ERR_OK;
+}
+
+/**
+ * @ingroup acd
+ * Inform the ACD modules when the link goes down
+ *
+ * @param netif network interface on which to inform the ACD clients
+ */
+void
+acd_network_changed_link_down(struct netif *netif)
+{
+  struct acd *acd;
+  /* loop over the acd's*/
+  ACD_FOREACH(acd, netif->acd_list) {
+    acd_stop(acd);
+  }
+}
+
+/**
+ * Has to be called in loop every ACD_TMR_INTERVAL milliseconds
+ */
+void
+acd_tmr(void)
+{
+  struct netif *netif;
+  struct acd *acd;
+  /* loop through netif's */
+  NETIF_FOREACH(netif) {
+    ACD_FOREACH(acd, netif->acd_list) {
+      if (acd->lastconflict > 0) {
+        acd->lastconflict--;
+      }
+
+      LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE,
+                  ("acd_tmr() ACD-State: %"U16_F", ttw=%"U16_F"\n",
+                   (u16_t)(acd->state), acd->ttw));
+
+      if (acd->ttw > 0) {
+        acd->ttw--;
+      }
+
+      switch (acd->state) {
+        case ACD_STATE_PROBE_WAIT:
+        case ACD_STATE_PROBING:
+          if (acd->ttw == 0) {
+            acd->state = ACD_STATE_PROBING;
+            etharp_acd_probe(netif, &acd->ipaddr);
+            LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE,
+                        ("acd_tmr() PROBING Sent Probe\n"));
+            acd->sent_num++;
+            if (acd->sent_num >= PROBE_NUM) {
+              /* Switch to ANNOUNCE_WAIT: last probe is sent*/
+              acd->state = ACD_STATE_ANNOUNCE_WAIT;
+
+              acd->sent_num = 0;
+
+              /* calculate time to wait before announcing */
+              acd->ttw = (u16_t)(ANNOUNCE_WAIT * ACD_TICKS_PER_SECOND);
+            } else {
+              /* calculate time to wait to next probe */
+              acd->ttw = (u16_t)(ACD_RANDOM_PROBE_INTERVAL(netif, acd));
+            }
+          }
+          break;
+
+        case ACD_STATE_ANNOUNCE_WAIT:
+        case ACD_STATE_ANNOUNCING:
+          if (acd->ttw == 0) {
+            if (acd->sent_num == 0) {
+              acd->state = ACD_STATE_ANNOUNCING;
+
+              /* reset conflict count to ensure fast re-probing after announcing */
+              acd->num_conflicts = 0;
+
+              LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+                    ("acd_tmr(): changing state to ANNOUNCING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
+                     ip4_addr1_16(&acd->ipaddr), ip4_addr2_16(&acd->ipaddr),
+                     ip4_addr3_16(&acd->ipaddr), ip4_addr4_16(&acd->ipaddr)));
+            }
+
+            etharp_acd_announce(netif, &acd->ipaddr);
+            LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE,
+                        ("acd_tmr() ANNOUNCING Sent Announce\n"));
+            acd->ttw = ANNOUNCE_INTERVAL * ACD_TICKS_PER_SECOND;
+            acd->sent_num++;
+
+            if (acd->sent_num >= ANNOUNCE_NUM) {
+              acd->state = ACD_STATE_ONGOING;
+              acd->sent_num = 0;
+              acd->ttw = 0;
+              LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+                    ("acd_tmr(): changing state to ONGOING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
+                     ip4_addr1_16(&acd->ipaddr), ip4_addr2_16(&acd->ipaddr),
+                     ip4_addr3_16(&acd->ipaddr), ip4_addr4_16(&acd->ipaddr)));
+
+              /* finally, let acd user know that the address is good and can be used */
+              acd->acd_conflict_callback(netif, ACD_IP_OK);
+            }
+          }
+          break;
+
+        case ACD_STATE_RATE_LIMIT:
+          if (acd->ttw == 0) {
+            /* acd should be stopped because ipaddr isn't valid any more */
+            acd_stop(acd);
+            /* let the acd user (after rate limit interval) know that their is
+             * a conflict detected. So it can restart the address acquiring
+             * process.*/
+            acd->acd_conflict_callback(netif, ACD_RESTART_CLIENT);
+          }
+          break;
+
+        default:
+          /* nothing to do in other states */
+          break;
+      }
+    }
+  }
+}
+
+/**
+ * Restarts the acd module
+ *
+ * The number of conflicts is increased and the upper layer is informed.
+ */
+static void
+acd_restart(struct netif *netif, struct acd *acd)
+{
+  /* increase conflict counter. */
+  acd->num_conflicts++;
+
+  /* Decline the address */
+  acd->acd_conflict_callback(netif, ACD_DECLINE);
+
+  /* if we tried more then MAX_CONFLICTS we must limit our rate for
+   * acquiring and probing addresses. compliant to RFC 5227 Section 2.1.1 */
+  if (acd->num_conflicts >= MAX_CONFLICTS) {
+    acd->state = ACD_STATE_RATE_LIMIT;
+    acd->ttw = (u16_t)(RATE_LIMIT_INTERVAL * ACD_TICKS_PER_SECOND);
+    LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
+                ("acd_restart(): rate limiting initiated. too many conflicts\n"));
+  }
+  else {
+    /* acd should be stopped because ipaddr isn't valid any more */
+    acd_stop(acd);
+    /* let the acd user know right away that their is a conflict detected.
+     * So it can restart the address acquiring process. */
+    acd->acd_conflict_callback(netif, ACD_RESTART_CLIENT);
+  }
+}
+
+/**
+ * Handles every incoming ARP Packet, called by etharp_input().
+ *
+ * @param netif network interface to use for acd processing
+ * @param hdr   Incoming ARP packet
+ */
+void
+acd_arp_reply(struct netif *netif, struct etharp_hdr *hdr)
+{
+  struct acd *acd;
+  ip4_addr_t sipaddr, dipaddr;
+  struct eth_addr netifaddr;
+  SMEMCPY(netifaddr.addr, netif->hwaddr, ETH_HWADDR_LEN);
+
+  /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support
+   * compilers without structure packing (not using structure copy which
+   * breaks strict-aliasing rules).
+   */
+  IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr);
+  IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr);
+
+  LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE, ("acd_arp_reply()\n"));
+
+  /* loop over the acd's*/
+  ACD_FOREACH(acd, netif->acd_list) {
+    switch(acd->state) {
+      case ACD_STATE_OFF:
+      case ACD_STATE_RATE_LIMIT:
+      default:
+        /* do nothing */
+        break;
+
+      case ACD_STATE_PROBE_WAIT:
+      case ACD_STATE_PROBING:
+      case ACD_STATE_ANNOUNCE_WAIT:
+        /* RFC 5227 Section 2.1.1:
+         * from beginning to after ANNOUNCE_WAIT seconds we have a conflict if
+         * ip.src == ipaddr (someone is already using the address)
+         * OR
+         * ip.dst == ipaddr && hw.src != own hwaddr (someone else is probing it)
+         */
+        if ((ip4_addr_eq(&sipaddr, &acd->ipaddr)) ||
+            (ip4_addr_isany_val(sipaddr) &&
+             ip4_addr_eq(&dipaddr, &acd->ipaddr) &&
+             !eth_addr_eq(&netifaddr, &hdr->shwaddr))) {
+          LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
+                      ("acd_arp_reply(): Probe Conflict detected\n"));
+          acd_restart(netif, acd);
+        }
+        break;
+
+      case ACD_STATE_ANNOUNCING:
+      case ACD_STATE_ONGOING:
+      case ACD_STATE_PASSIVE_ONGOING:
+        /* RFC 5227 Section 2.4:
+         * in any state we have a conflict if
+         * ip.src == ipaddr && hw.src != own hwaddr (someone is using our address)
+         */
+        if (ip4_addr_eq(&sipaddr, &acd->ipaddr) &&
+            !eth_addr_eq(&netifaddr, &hdr->shwaddr)) {
+          LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
+                      ("acd_arp_reply(): Conflicting ARP-Packet detected\n"));
+          acd_handle_arp_conflict(netif, acd);
+        }
+        break;
+    }
+  }
+}
+
+/**
+ * Handle a IP address conflict after an ARP conflict detection
+ */
+static void
+acd_handle_arp_conflict(struct netif *netif, struct acd *acd)
+{
+  /* RFC5227, 2.4 "Ongoing Address Conflict Detection and Address Defense"
+     allows three options where:
+     a) means retreat on the first conflict,
+     b) allows to keep an already configured address when having only one
+        conflict in DEFEND_INTERVAL seconds and
+     c) the host will not give up it's address and defend it indefinitely
+
+     We use option b) when the acd module represents the netif address, since it
+     helps to improve the chance that one of the two conflicting hosts may be
+     able to retain its address. while we are flexible enough to help network
+     performance
+
+     We use option a) when the acd module does not represent the netif address,
+     since we cannot have the acd module announcing or restarting. This
+     situation occurs for the LL acd module when a routable address is used on
+     the netif but the LL address is still open in the background. */
+
+  if (acd->state == ACD_STATE_PASSIVE_ONGOING) {
+    /* Immediately back off on a conflict. */
+    LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+      ("acd_handle_arp_conflict(): conflict when we are in passive mode -> back off\n"));
+    acd_stop(acd);
+    acd->acd_conflict_callback(netif, ACD_DECLINE);
+  }
+  else {
+    if (acd->lastconflict > 0) {
+      /* retreat, there was a conflicting ARP in the last DEFEND_INTERVAL seconds */
+      LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+        ("acd_handle_arp_conflict(): conflict within DEFEND_INTERVAL -> retreating\n"));
+
+      /* Active TCP sessions are aborted when removing the ip address but a bad
+       * connection was inevitable anyway with conflicting hosts */
+       acd_restart(netif, acd);
+    } else {
+      LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+          ("acd_handle_arp_conflict(): we are defending, send ARP Announce\n"));
+      etharp_acd_announce(netif, &acd->ipaddr);
+      acd->lastconflict = DEFEND_INTERVAL * ACD_TICKS_PER_SECOND;
+    }
+  }
+}
+
+/**
+ * Put the acd module in passive ongoing conflict detection.
+ */
+static void
+acd_put_in_passive_mode(struct netif *netif, struct acd *acd)
+{
+  switch(acd->state) {
+    case ACD_STATE_OFF:
+    case ACD_STATE_PASSIVE_ONGOING:
+    default:
+      /* do nothing */
+      break;
+
+    case ACD_STATE_PROBE_WAIT:
+    case ACD_STATE_PROBING:
+    case ACD_STATE_ANNOUNCE_WAIT:
+    case ACD_STATE_RATE_LIMIT:
+      acd_stop(acd);
+      acd->acd_conflict_callback(netif, ACD_DECLINE);
+      break;
+
+    case ACD_STATE_ANNOUNCING:
+    case ACD_STATE_ONGOING:
+      acd->state = ACD_STATE_PASSIVE_ONGOING;
+      LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+        ("acd_put_in_passive_mode()\n"));
+      break;
+  }
+}
+
+/**
+ * @ingroup acd
+ * Inform the ACD modules of address changes
+ *
+ * @param netif     network interface on which the address is changing
+ * @param old_addr  old ip address
+ * @param new_addr  new ip address
+ */
+void
+acd_netif_ip_addr_changed(struct netif *netif, const ip_addr_t *old_addr,
+                          const ip_addr_t *new_addr)
+{
+  struct acd *acd;
+
+  LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+    ("acd_netif_ip_addr_changed(): Address changed\n"));
+
+  LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+    ("acd_netif_ip_addr_changed(): old address = %s\n", ipaddr_ntoa(old_addr)));
+  LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+    ("acd_netif_ip_addr_changed(): new address = %s\n", ipaddr_ntoa(new_addr)));
+
+  /* If we change from ANY to an IP or from an IP to ANY we do nothing */
+  if (ip_addr_isany(old_addr) || ip_addr_isany(new_addr)) {
+    return;
+  }
+
+  ACD_FOREACH(acd, netif->acd_list) {
+    /* Find ACD module of old address */
+    if(ip4_addr_eq(&acd->ipaddr, ip_2_ip4(old_addr))) {
+      /* Did we change from a LL address to a routable address? */
+      if (ip_addr_islinklocal(old_addr) && !ip_addr_islinklocal(new_addr)) {
+        LWIP_DEBUGF(ACD_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+          ("acd_netif_ip_addr_changed(): changed from LL to routable address\n"));
+        /* Put the module in passive conflict detection mode */
+        acd_put_in_passive_mode(netif, acd);
+      }
+    }
+  }
+}
+
+#endif /* LWIP_IPV4 && LWIP_ACD */
diff --git a/src/core/ipv4/autoip.c b/src/core/ipv4/autoip.c
index 9f7139b..461a005 100644
--- a/src/core/ipv4/autoip.c
+++ b/src/core/ipv4/autoip.c
@@ -3,7 +3,9 @@
  * AutoIP Automatic LinkLocal IP Configuration
  *
  * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform
- * with RFC 3927.
+ * with RFC 3927. It uses IPv4 address conflict detection to evaluate the chosen
+ * address. The ACD module aims to be conform to RFC 5227.
+ * RFC 5227 is extracted out of RFC 3927 so the acd module fits nicely in autoip.
  *
  * @defgroup autoip AUTOIP
  * @ingroup ip4
@@ -11,10 +13,6 @@
  * USAGE:
  *
  * define @ref LWIP_AUTOIP 1 in your lwipopts.h
- * Options:
- * AUTOIP_TMR_INTERVAL msecs,
- *   I recommend a value of 100. The value must divide 1000 with a remainder almost 0.
- *   Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 ....
  *
  * Without DHCP:
  * - Call autoip_start() after netif_add().
@@ -65,21 +63,12 @@
 #include "lwip/ip_addr.h"
 #include "lwip/netif.h"
 #include "lwip/autoip.h"
+#include "lwip/acd.h"
 #include "lwip/etharp.h"
 #include "lwip/prot/autoip.h"
 
 #include <string.h>
 
-/** Pseudo random macro based on netif informations.
- * You could use "rand()" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h */
-#ifndef LWIP_AUTOIP_RAND
-#define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \
-                                   ((u32_t)((netif->hwaddr[3]) & 0xff) << 16) | \
-                                   ((u32_t)((netif->hwaddr[2]) & 0xff) << 8) | \
-                                   ((u32_t)((netif->hwaddr[4]) & 0xff))) + \
-                                   (netif_autoip_data(netif)? netif_autoip_data(netif)->tried_llipaddr : 0))
-#endif /* LWIP_AUTOIP_RAND */
-
 /**
  * Macro that generates the initial IP address to be tried by AUTOIP.
  * If you want to override this, define it to something else in lwipopts.h.
@@ -90,9 +79,12 @@
                  ((u32_t)((u8_t)(netif->hwaddr[5]))) << 8)))
 #endif /* LWIP_AUTOIP_CREATE_SEED_ADDR */
 
-/* static functions */
-static err_t autoip_arp_announce(struct netif *netif);
-static void autoip_start_probing(struct netif *netif);
+/* Function definitions */
+static void autoip_restart(struct netif *netif);
+static void autoip_create_addr(struct netif *netif, ip4_addr_t *ipaddr);
+static err_t autoip_bind(struct netif *netif);
+static void autoip_conflict_callback(struct netif *netif,
+                                     acd_callback_enum_t state);
 
 /**
  * @ingroup autoip
@@ -117,6 +109,23 @@
   netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP, autoip);
 }
 
+/**
+ * @ingroup autoip
+ * Remove a struct autoip previously set to the netif using autoip_set_struct()
+ *
+ * @param netif the netif for which to set the struct autoip
+ */
+void
+autoip_remove_struct(struct netif *netif)
+{
+  LWIP_ASSERT_CORE_LOCKED();
+  LWIP_ASSERT("netif != NULL", netif != NULL);
+  LWIP_ASSERT("netif has no struct autoip set",
+              netif_autoip_data(netif) != NULL);
+
+  netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP, NULL);
+}
+
 /** Restart AutoIP client and check the next address (conflict detected)
  *
  * @param netif The netif under AutoIP control
@@ -129,35 +138,6 @@
   autoip_start(netif);
 }
 
-/**
- * Handle a IP address conflict after an ARP conflict detection
- */
-static void
-autoip_handle_arp_conflict(struct netif *netif)
-{
-  struct autoip *autoip = netif_autoip_data(netif);
-
-  /* RFC3927, 2.5 "Conflict Detection and Defense" allows two options where
-     a) means retreat on the first conflict and
-     b) allows to keep an already configured address when having only one
-        conflict in 10 seconds
-     We use option b) since it helps to improve the chance that one of the two
-     conflicting hosts may be able to retain its address. */
-
-  if (autoip->lastconflict > 0) {
-    /* retreat, there was a conflicting ARP in the last DEFEND_INTERVAL seconds */
-    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-                ("autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\n"));
-
-    /* Active TCP sessions are aborted when removing the ip addresss */
-    autoip_restart(netif);
-  } else {
-    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-                ("autoip_handle_arp_conflict(): we are defend, send ARP Announce\n"));
-    autoip_arp_announce(netif);
-    autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND;
-  }
-}
 
 /**
  * Create an IP-Address out of range 169.254.1.0 to 169.254.254.255
@@ -195,29 +175,6 @@
                ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));
 }
 
-/**
- * Sends an ARP probe from a network interface
- *
- * @param netif network interface used to send the probe
- */
-static err_t
-autoip_arp_probe(struct netif *netif)
-{
-  struct autoip *autoip = netif_autoip_data(netif);
-  /* this works because netif->ip_addr is ANY */
-  return etharp_request(netif, &autoip->llipaddr);
-}
-
-/**
- * Sends an ARP announce from a network interface
- *
- * @param netif network interface used to send the announce
- */
-static err_t
-autoip_arp_announce(struct netif *netif)
-{
-  return etharp_gratuitous(netif);
-}
 
 /**
  * Configure interface for use with current LL IP-Address
@@ -230,6 +187,8 @@
   struct autoip *autoip = netif_autoip_data(netif);
   ip4_addr_t sn_mask, gw_addr;
 
+  autoip->state = AUTOIP_STATE_BOUND;
+
   LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
               ("autoip_bind(netif=%p) %c%c%"U16_F" %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
                (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num,
@@ -246,6 +205,35 @@
 }
 
 /**
+* Handle conflict information from ACD module
+*
+* @param netif   network interface to handle conflict information on
+* @param state   acd_callback_enum_t
+ */
+static void
+autoip_conflict_callback(struct netif *netif, acd_callback_enum_t state)
+{
+  struct autoip *autoip = netif_autoip_data(netif);
+
+  switch (state) {
+    case ACD_IP_OK:
+      autoip_bind(netif);
+      break;
+    case ACD_RESTART_CLIENT:
+      autoip_restart(netif);
+      break;
+    case ACD_DECLINE:
+      /* "delete" conflicting address so a new one will be selected in
+       * autoip_start() */
+      ip4_addr_set_any(&autoip->llipaddr);
+      autoip_stop(netif);
+      break;
+      default:
+      break;
+  }
+}
+
+/**
  * @ingroup autoip
  * Start AutoIP client
  *
@@ -260,14 +248,6 @@
   LWIP_ASSERT_CORE_LOCKED();
   LWIP_ERROR("netif is not up, old style port?", netif_is_up(netif), return ERR_ARG;);
 
-  /* Set IP-Address, Netmask and Gateway to 0 to make sure that
-   * ARP Packets are formed correctly
-   */
-  netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);
-
-  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-              ("autoip_start(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0],
-               netif->name[1], (u16_t)netif->num));
   if (autoip == NULL) {
     /* no AutoIP client attached yet? */
     LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
@@ -280,62 +260,73 @@
     }
     /* store this AutoIP client in the netif */
     netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP, autoip);
-    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): allocated autoip"));
-  } else {
-    autoip->state = AUTOIP_STATE_OFF;
-    autoip->ttw = 0;
-    autoip->sent_num = 0;
-    ip4_addr_set_zero(&autoip->llipaddr);
-    autoip->lastconflict = 0;
+    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): allocated autoip\n"));
   }
 
-  autoip_create_addr(netif, &(autoip->llipaddr));
-  autoip_start_probing(netif);
+  if (autoip->state == AUTOIP_STATE_OFF) {
+    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+                ("autoip_start(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0],
+                 netif->name[1], (u16_t)netif->num));
+
+    /* add acd struct to list*/
+    acd_add(netif, &autoip->acd, autoip_conflict_callback);
+
+    /* In accordance to RFC3927 section 2.1:
+     * Keep using the same link local address as much as possible.
+     * Only when there is none or when there was a conflict, select a new one.
+     */
+    if (!ip4_addr_islinklocal(&autoip->llipaddr)) {
+      autoip_create_addr(netif, &(autoip->llipaddr));
+    }
+    autoip->state = AUTOIP_STATE_CHECKING;
+    acd_start(netif, &autoip->acd, autoip->llipaddr);
+  } else {
+    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
+                ("autoip_start(): already started on netif=%p %c%c%"U16_F"\n",
+                (void *)netif, netif->name[0],
+                 netif->name[1], (u16_t)netif->num));
+  }
 
   return result;
 }
 
-static void
-autoip_start_probing(struct netif *netif)
+
+/**
+ * Handle a possible change in the network configuration: link up
+ *
+ * If there is an AutoIP address configured and AutoIP is not in cooperation
+ * with DHCP, start probing for previous address.
+ */
+void
+autoip_network_changed_link_up(struct netif *netif)
 {
   struct autoip *autoip = netif_autoip_data(netif);
 
-  autoip->state = AUTOIP_STATE_PROBING;
-  autoip->sent_num = 0;
-  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-              ("autoip_start_probing(): changing state to PROBING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-               ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),
-               ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));
-
-  /* time to wait to first probe, this is randomly
-   * chosen out of 0 to PROBE_WAIT seconds.
-   * compliant to RFC 3927 Section 2.2.1
-   */
-  autoip->ttw = (u16_t)(LWIP_AUTOIP_RAND(netif) % (PROBE_WAIT * AUTOIP_TICKS_PER_SECOND));
-
-  /*
-   * if we tried more then MAX_CONFLICTS we must limit our rate for
-   * acquiring and probing address
-   * compliant to RFC 3927 Section 2.2.1
-   */
-  if (autoip->tried_llipaddr > MAX_CONFLICTS) {
-    autoip->ttw = RATE_LIMIT_INTERVAL * AUTOIP_TICKS_PER_SECOND;
+  if (autoip && (autoip->state != AUTOIP_STATE_OFF) && !LWIP_DHCP_AUTOIP_COOP) {
+    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
+                ("autoip_network_changed_link_up(): start acd\n"));
+    autoip->state = AUTOIP_STATE_CHECKING;
+    /* Start acd check again for the last used address */
+    acd_start(netif, &autoip->acd, autoip->llipaddr);
   }
 }
 
 /**
- * Handle a possible change in the network configuration.
+ * Handle a possible change in the network configuration: link down
  *
- * If there is an AutoIP address configured, take the interface down
- * and begin probing with the same address.
+ * If there is an AutoIP address configured and AutoIP is in cooperation
+ * with DHCP, then stop the autoip module. When the link goes up, we do not want
+ * the autoip module to start again. DHCP will initiate autoip when needed.
  */
 void
-autoip_network_changed(struct netif *netif)
+autoip_network_changed_link_down(struct netif *netif)
 {
   struct autoip *autoip = netif_autoip_data(netif);
 
-  if (autoip && (autoip->state != AUTOIP_STATE_OFF)) {
-    autoip_start_probing(netif);
+  if (autoip && (autoip->state != AUTOIP_STATE_OFF) && LWIP_DHCP_AUTOIP_COOP) {
+    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
+                ("autoip_network_changed_link_down(): stop autoip\n"));
+    autoip_stop(netif);
   }
 }
 
@@ -356,172 +347,33 @@
     if (ip4_addr_islinklocal(netif_ip4_addr(netif))) {
       netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);
     }
+    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,("autoip_stop()\n"));
   }
   return ERR_OK;
 }
 
-/**
- * Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds
- */
-void
-autoip_tmr(void)
-{
-  struct netif *netif;
-  /* loop through netif's */
-  NETIF_FOREACH(netif) {
-    struct autoip *autoip = netif_autoip_data(netif);
-    /* only act on AutoIP configured interfaces */
-    if (autoip != NULL) {
-      if (autoip->lastconflict > 0) {
-        autoip->lastconflict--;
-      }
-
-      LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
-                  ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n",
-                   (u16_t)(autoip->state), autoip->ttw));
-
-      if (autoip->ttw > 0) {
-        autoip->ttw--;
-      }
-
-      switch (autoip->state) {
-        case AUTOIP_STATE_PROBING:
-          if (autoip->ttw == 0) {
-            if (autoip->sent_num >= PROBE_NUM) {
-              /* Switch to ANNOUNCING: now we can bind to an IP address and use it */
-              autoip->state = AUTOIP_STATE_ANNOUNCING;
-              autoip_bind(netif);
-              /* autoip_bind() calls netif_set_addr(): this triggers a gratuitous ARP
-                 which counts as an announcement */
-              autoip->sent_num = 1;
-              autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND;
-              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-                          ("autoip_tmr(): changing state to ANNOUNCING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-                           ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),
-                           ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));
-            } else {
-              autoip_arp_probe(netif);
-              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_tmr() PROBING Sent Probe\n"));
-              autoip->sent_num++;
-              if (autoip->sent_num == PROBE_NUM) {
-                /* calculate time to wait to for announce */
-                autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND;
-              } else {
-                /* calculate time to wait to next probe */
-                autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) %
-                                       ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) +
-                                      PROBE_MIN * AUTOIP_TICKS_PER_SECOND);
-              }
-            }
-          }
-          break;
-
-        case AUTOIP_STATE_ANNOUNCING:
-          if (autoip->ttw == 0) {
-            autoip_arp_announce(netif);
-            LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_tmr() ANNOUNCING Sent Announce\n"));
-            autoip->ttw = ANNOUNCE_INTERVAL * AUTOIP_TICKS_PER_SECOND;
-            autoip->sent_num++;
-
-            if (autoip->sent_num >= ANNOUNCE_NUM) {
-              autoip->state = AUTOIP_STATE_BOUND;
-              autoip->sent_num = 0;
-              autoip->ttw = 0;
-              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-                          ("autoip_tmr(): changing state to BOUND: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
-                           ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),
-                           ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));
-            }
-          }
-          break;
-
-        default:
-          /* nothing to do in other states */
-          break;
-      }
-    }
-  }
-}
-
-/**
- * Handles every incoming ARP Packet, called by etharp_input().
- *
- * @param netif network interface to use for autoip processing
- * @param hdr Incoming ARP packet
- */
-void
-autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr)
-{
-  struct autoip *autoip = netif_autoip_data(netif);
-
-  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_arp_reply()\n"));
-  if ((autoip != NULL) && (autoip->state != AUTOIP_STATE_OFF)) {
-    /* when ip.src == llipaddr && hw.src != netif->hwaddr
-     *
-     * when probing  ip.dst == llipaddr && hw.src != netif->hwaddr
-     * we have a conflict and must solve it
-     */
-    ip4_addr_t sipaddr, dipaddr;
-    struct eth_addr netifaddr;
-    SMEMCPY(netifaddr.addr, netif->hwaddr, ETH_HWADDR_LEN);
-
-    /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
-     * structure packing (not using structure copy which breaks strict-aliasing rules).
-     */
-    IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr);
-    IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr);
-
-    if (autoip->state == AUTOIP_STATE_PROBING) {
-      /* RFC 3927 Section 2.2.1:
-       * from beginning to after ANNOUNCE_WAIT
-       * seconds we have a conflict if
-       * ip.src == llipaddr OR
-       * ip.dst == llipaddr && hw.src != own hwaddr
-       */
-      if ((ip4_addr_cmp(&sipaddr, &autoip->llipaddr)) ||
-          (ip4_addr_isany_val(sipaddr) &&
-           ip4_addr_cmp(&dipaddr, &autoip->llipaddr) &&
-           !eth_addr_cmp(&netifaddr, &hdr->shwaddr))) {
-        LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
-                    ("autoip_arp_reply(): Probe Conflict detected\n"));
-        autoip_restart(netif);
-      }
-    } else {
-      /* RFC 3927 Section 2.5:
-       * in any state we have a conflict if
-       * ip.src == llipaddr && hw.src != own hwaddr
-       */
-      if (ip4_addr_cmp(&sipaddr, &autoip->llipaddr) &&
-          !eth_addr_cmp(&netifaddr, &hdr->shwaddr)) {
-        LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
-                    ("autoip_arp_reply(): Conflicting ARP-Packet detected\n"));
-        autoip_handle_arp_conflict(netif);
-      }
-    }
-  }
-}
-
 /** check if AutoIP supplied netif->ip_addr
  *
  * @param netif the netif to check
- * @return 1 if AutoIP supplied netif->ip_addr (state BOUND or ANNOUNCING),
+ * @return 1 if AutoIP supplied netif->ip_addr (state BOUND),
  *         0 otherwise
  */
 u8_t
-autoip_supplied_address(const struct netif *netif)
+autoip_supplied_address(struct netif *netif)
 {
-  if ((netif != NULL) && (netif_autoip_data(netif) != NULL)) {
-    struct autoip *autoip = netif_autoip_data(netif);
-    return (autoip->state == AUTOIP_STATE_BOUND) || (autoip->state == AUTOIP_STATE_ANNOUNCING);
-  }
-  return 0;
+  struct autoip *autoip = netif_autoip_data(netif);
+  return     (autoip != NULL)
+          && (ip4_addr_eq(netif_ip4_addr(netif), &(autoip->llipaddr)))
+          && (autoip->state == AUTOIP_STATE_BOUND);
 }
 
 u8_t
 autoip_accept_packet(struct netif *netif, const ip4_addr_t *addr)
 {
   struct autoip *autoip = netif_autoip_data(netif);
-  return (autoip != NULL) && ip4_addr_cmp(addr, &(autoip->llipaddr));
+  return     (autoip != NULL)
+          && (ip4_addr_eq(addr, &(autoip->llipaddr)))
+          && (autoip->state == AUTOIP_STATE_BOUND);
 }
 
 #endif /* LWIP_IPV4 && LWIP_AUTOIP */
diff --git a/src/core/ipv4/dhcp.c b/src/core/ipv4/dhcp.c
index 76b9f68..d9ed8b0 100644
--- a/src/core/ipv4/dhcp.c
+++ b/src/core/ipv4/dhcp.c
@@ -75,6 +75,7 @@
 #include "lwip/def.h"
 #include "lwip/dhcp.h"
 #include "lwip/autoip.h"
+#include "lwip/acd.h"
 #include "lwip/dns.h"
 #include "lwip/etharp.h"
 #include "lwip/prot/dhcp.h"
@@ -92,6 +93,46 @@
 #define LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, offset) do { LWIP_UNUSED_ARG(msg); } while(0)
 #endif
 
+/** DHCP_ADD_EXTRA_REQUEST_OPTIONS: Additional options added to the list of options
+ * that the client requests from the servers (opt 55: DHCP_OPTION_PARAMETER_REQUEST_LIST)
+ * If additional options are requested, define this macro as a comma separated list, with leading comma.
+ * This macro is useful for example when requested vendor specific ids (VCI/VSI options), here is an example
+ * of requesting the VSI option (option 43) (yes, the notation is a bit strange, but it works :)
+ * (NOTE: the space between # and define is required because of doxygen...)
+ * # define DHCP_ADD_EXTRA_REQUEST_OPTIONS ,43
+ */
+#ifndef DHCP_ADD_EXTRA_REQUEST_OPTIONS
+#define DHCP_ADD_EXTRA_REQUEST_OPTIONS
+#endif
+
+/** DHCP_DEFINE_CUSTOM_TIMEOUTS: if this is defined then you can customize various DHCP timeouts using these macros:
+      - DHCP_SET_TIMEOUT_FROM_OFFERED_T0_LEASE() to adjust the t0 lease timeout from the offered value
+      - DHCP_SET_TIMEOUT_FROM_OFFERED_T1_RENEW() same for t1 renew
+      - DHCP_SET_TIMEOUT_FROM_OFFERED_T2_REBIND() same for t2 rebind
+      - DHCP_NEXT_TIMEOUT_THRESHOLD to adjust the period of the next timeout
+      - DHCP_REQUEST_BACKOFF_SEQUENCE to adjust back-off times based on DHCP request attempts
+ */
+#ifndef DHCP_DEFINE_CUSTOM_TIMEOUTS
+#define SET_TIMEOUT_FROM_OFFERED(result, offered, min, max) do { \
+  u32_t timeout = (offered + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;  \
+  if (timeout > max) {    \
+    timeout = max;        \
+  }                       \
+  if (timeout == min) {   \
+    timeout = 1;          \
+  } \
+  result = (dhcp_timeout_t)timeout; \
+} while(0)
+
+#define DHCP_SET_TIMEOUT_FROM_OFFERED_T0_LEASE(res, dhcp)  SET_TIMEOUT_FROM_OFFERED(res, (dhcp)->offered_t0_lease, 0, 0xffff)
+#define DHCP_SET_TIMEOUT_FROM_OFFERED_T1_RENEW(res, dhcp)  SET_TIMEOUT_FROM_OFFERED(res, (dhcp)->offered_t1_renew, 0, 0xffff)
+#define DHCP_SET_TIMEOUT_FROM_OFFERED_T2_REBIND(res, dhcp) SET_TIMEOUT_FROM_OFFERED(res, (dhcp)->offered_t2_rebind, 0, 0xffff)
+
+#define DHCP_NEXT_TIMEOUT_THRESHOLD ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)
+#define DHCP_REQUEST_BACKOFF_SEQUENCE(tries)   (u16_t)(( (tries) < 6 ? 1 << (tries) : 60) * 1000)
+
+#endif /* DHCP_DEFINE_CUSTOM_TIMEOUTS */
+
 /** DHCP_CREATE_RAND_XID: if this is set to 1, the xid is created using
  * LWIP_RAND() (this overrides DHCP_GLOBAL_XID)
  */
@@ -159,11 +200,11 @@
 
 /** Holds the decoded option values, only valid while in dhcp_recv.
     @todo: move this into struct dhcp? */
-u32_t dhcp_rx_options_val[DHCP_OPTION_IDX_MAX];
+static u32_t dhcp_rx_options_val[DHCP_OPTION_IDX_MAX];
 /** Holds a flag which option was received and is contained in dhcp_rx_options_val,
     only valid while in dhcp_recv.
     @todo: move this into struct dhcp? */
-u8_t  dhcp_rx_options_given[DHCP_OPTION_IDX_MAX];
+static u8_t  dhcp_rx_options_given[DHCP_OPTION_IDX_MAX];
 
 static u8_t dhcp_discover_request_options[] = {
   DHCP_OPTION_SUBNET_MASK,
@@ -175,6 +216,7 @@
 #if LWIP_DHCP_GET_NTP_SRV
   , DHCP_OPTION_NTP
 #endif /* LWIP_DHCP_GET_NTP_SRV */
+  DHCP_ADD_EXTRA_REQUEST_OPTIONS
 };
 
 #ifdef DHCP_GLOBAL_XID
@@ -196,9 +238,9 @@
 static err_t dhcp_discover(struct netif *netif);
 static err_t dhcp_select(struct netif *netif);
 static void dhcp_bind(struct netif *netif);
-#if DHCP_DOES_ARP_CHECK
+#if LWIP_DHCP_DOES_ACD_CHECK
 static err_t dhcp_decline(struct netif *netif);
-#endif /* DHCP_DOES_ARP_CHECK */
+#endif /* LWIP_DHCP_DOES_ACD_CHECK */
 static err_t dhcp_rebind(struct netif *netif);
 static err_t dhcp_reboot(struct netif *netif);
 static void dhcp_set_state(struct dhcp *dhcp, u8_t new_state);
@@ -294,13 +336,56 @@
   dhcp_discover(netif);
 }
 
-#if DHCP_DOES_ARP_CHECK
+#if LWIP_DHCP_DOES_ACD_CHECK
+/**
+* Handle conflict information from ACD module
+*
+* @param netif   network interface to handle conflict information on
+* @param state   acd_callback_enum_t
+ */
+static void
+dhcp_conflict_callback(struct netif *netif, acd_callback_enum_t state)
+{
+  struct dhcp *dhcp = netif_dhcp_data(netif);
+  u16_t msecs;
+
+  LWIP_ASSERT("DHCP should be enabled at this point, but it is not!",
+              (dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF));
+
+  switch (state) {
+    case ACD_IP_OK:
+      dhcp_bind(netif);
+      break;
+    case ACD_RESTART_CLIENT:
+      /* wait 10s before restarting
+       * According to RFC2131 section 3.1 point 5:
+       * If the client detects that the address is already in use (e.g., through
+       * the use of ARP), the client MUST send a DHCPDECLINE message to the
+       * server and restarts the configuration process.  The client SHOULD wait
+       * a minimum of ten seconds before restarting the configuration process to
+       * avoid excessive network traffic in case of looping. */
+       dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);
+       msecs = 10 * 1000;
+       dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
+       LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs));
+      break;
+    case ACD_DECLINE:
+      /* remove IP address from interface
+       * (prevents routing from selecting this interface) */
+      netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);
+      /* Let the DHCP server know we will not use the address */
+      dhcp_decline(netif);
+      break;
+    default:
+      break;
+  }
+}
+
 /**
  * Checks if the offered IP address is already in use.
  *
- * It does so by sending an ARP request for the offered address and
- * entering CHECKING state. If no ARP reply is received within a small
- * interval, the address is assumed to be free for use by us.
+ * It does this according to the address conflict detection method described in
+ * RFC5227.
  *
  * @param netif the netif under DHCP control
  */
@@ -308,25 +393,15 @@
 dhcp_check(struct netif *netif)
 {
   struct dhcp *dhcp = netif_dhcp_data(netif);
-  err_t result;
-  u16_t msecs;
+
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0],
               (s16_t)netif->name[1]));
   dhcp_set_state(dhcp, DHCP_STATE_CHECKING);
-  /* create an ARP query for the offered IP address, expecting that no host
-     responds, as the IP address should not be in use. */
-  result = etharp_query(netif, &dhcp->offered_ip_addr, NULL);
-  if (result != ERR_OK) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_check: could not perform ARP query\n"));
-  }
-  if (dhcp->tries < 255) {
-    dhcp->tries++;
-  }
-  msecs = 500;
-  dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_check(): set request timeout %"U16_F" msecs\n", msecs));
+
+  /* start ACD module */
+  acd_start(netif, &dhcp->acd, dhcp->offered_ip_addr);
 }
-#endif /* DHCP_DOES_ARP_CHECK */
+#endif /* LWIP_DHCP_DOES_ACD_CHECK */
 
 /**
  * Remember the configuration offered by a DHCP server.
@@ -520,19 +595,6 @@
       dhcp_release_and_stop(netif);
       dhcp_start(netif);
     }
-#if DHCP_DOES_ARP_CHECK
-    /* received no ARP reply for the offered address (which is good) */
-  } else if (dhcp->state == DHCP_STATE_CHECKING) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n"));
-    if (dhcp->tries <= 1) {
-      dhcp_check(netif);
-      /* no ARP replies on the offered address,
-         looks like the IP address is indeed free */
-    } else {
-      /* bind the interface to the offered address */
-      dhcp_bind(netif);
-    }
-#endif /* DHCP_DOES_ARP_CHECK */
   } else if (dhcp->state == DHCP_STATE_REBOOTING) {
     if (dhcp->tries < REBOOT_TRIES) {
       dhcp_reboot(netif);
@@ -563,8 +625,8 @@
        DHCP_STATE_RENEWING, not DHCP_STATE_BOUND */
     dhcp_renew(netif);
     /* Calculate next timeout */
-    if (((dhcp->t2_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)) {
-      dhcp->t1_renew_time = (u16_t)((dhcp->t2_timeout - dhcp->lease_used) / 2);
+    if (((dhcp->t2_timeout - dhcp->lease_used) / 2) >= DHCP_NEXT_TIMEOUT_THRESHOLD) {
+      dhcp->t1_renew_time = (dhcp_timeout_t)((dhcp->t2_timeout - dhcp->lease_used) / 2);
     }
   }
 }
@@ -589,8 +651,8 @@
        DHCP_STATE_REBINDING, not DHCP_STATE_BOUND */
     dhcp_rebind(netif);
     /* Calculate next timeout */
-    if (((dhcp->t0_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)) {
-      dhcp->t2_rebind_time = (u16_t)((dhcp->t0_timeout - dhcp->lease_used) / 2);
+    if (((dhcp->t0_timeout - dhcp->lease_used) / 2) >= DHCP_NEXT_TIMEOUT_THRESHOLD) {
+      dhcp->t2_rebind_time = (dhcp_timeout_t)((dhcp->t0_timeout - dhcp->lease_used) / 2);
     }
   }
 }
@@ -655,9 +717,9 @@
   if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
     /* remember given subnet mask */
     ip4_addr_set_u32(&dhcp->offered_sn_mask, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
-    dhcp->subnet_mask_given = 1;
+    dhcp->flags |= DHCP_FLAG_SUBNET_MASK_GIVEN;
   } else {
-    dhcp->subnet_mask_given = 0;
+    dhcp->flags &= ~DHCP_FLAG_SUBNET_MASK_GIVEN;
   }
 
   /* gateway router */
@@ -701,6 +763,8 @@
 
   /* clear data structure */
   memset(dhcp, 0, sizeof(struct dhcp));
+  /* mark this as externally allocated */
+  dhcp->flags |= DHCP_FLAG_EXTERNAL_MEM;
   /* dhcp_set_state(&dhcp, DHCP_STATE_OFF); */
   netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, dhcp);
 }
@@ -716,11 +780,15 @@
  */
 void dhcp_cleanup(struct netif *netif)
 {
+  struct dhcp *dhcp;
   LWIP_ASSERT_CORE_LOCKED();
   LWIP_ASSERT("netif != NULL", netif != NULL);
 
-  if (netif_dhcp_data(netif) != NULL) {
-    mem_free(netif_dhcp_data(netif));
+  dhcp = netif_dhcp_data(netif);
+  if (dhcp != NULL) {
+    if (!(dhcp->flags & DHCP_FLAG_EXTERNAL_MEM)) {
+      mem_free(dhcp);
+    }
     netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, NULL);
   }
 }
@@ -767,7 +835,7 @@
 
     /* store this dhcp client in the netif */
     netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, dhcp);
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp"));
+    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp\n"));
     /* already has DHCP client attached */
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n"));
@@ -782,6 +850,13 @@
   memset(dhcp, 0, sizeof(struct dhcp));
   /* dhcp_set_state(&dhcp, DHCP_STATE_OFF); */
 
+
+#if LWIP_DHCP_DOES_ACD_CHECK
+  /* add acd struct to list*/
+  acd_add(netif, &dhcp->acd, dhcp_conflict_callback);
+#endif /* LWIP_DHCP_DOES_ACD_CHECK */
+
+
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n"));
 
   if (dhcp_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP PCB is allocated */
@@ -860,7 +935,7 @@
  * address is still valid.
  */
 void
-dhcp_network_changed(struct netif *netif)
+dhcp_network_changed_link_up(struct netif *netif)
 {
   struct dhcp *dhcp = netif_dhcp_data(netif);
 
@@ -883,12 +958,6 @@
       /* INIT/REQUESTING/CHECKING/BACKING_OFF restart with new 'rid' because the
          state changes, SELECTING: continue with current 'rid' as we stay in the
          same state */
-#if LWIP_DHCP_AUTOIP_COOP
-      if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) {
-        autoip_stop(netif);
-        dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
-      }
-#endif /* LWIP_DHCP_AUTOIP_COOP */
       /* ensure we start with short timeouts, even if already discovering */
       dhcp->tries = 0;
       dhcp_discover(netif);
@@ -896,37 +965,7 @@
   }
 }
 
-#if DHCP_DOES_ARP_CHECK
-/**
- * Match an ARP reply with the offered IP address:
- * check whether the offered IP address is not in use using ARP
- *
- * @param netif the network interface on which the reply was received
- * @param addr The IP address we received a reply from
- */
-void
-dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr)
-{
-  struct dhcp *dhcp;
-
-  LWIP_ERROR("netif != NULL", (netif != NULL), return;);
-  dhcp = netif_dhcp_data(netif);
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_arp_reply()\n"));
-  /* is a DHCP client doing an ARP check? */
-  if ((dhcp != NULL) && (dhcp->state == DHCP_STATE_CHECKING)) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n",
-                ip4_addr_get_u32(addr)));
-    /* did a host respond with the address we
-       were offered by the DHCP server? */
-    if (ip4_addr_cmp(addr, &dhcp->offered_ip_addr)) {
-      /* we will not accept the offered address */
-      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
-                  ("dhcp_arp_reply(): arp reply matched with offered address, declining\n"));
-      dhcp_decline(netif);
-    }
-  }
-}
-
+#if LWIP_DHCP_DOES_ACD_CHECK
 /**
  * Decline an offered lease.
  *
@@ -941,12 +980,12 @@
 {
   struct dhcp *dhcp = netif_dhcp_data(netif);
   err_t result;
-  u16_t msecs;
   struct pbuf *p_out;
   u16_t options_out_len;
 
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline()\n"));
   dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);
+
   /* create and initialize the DHCP message header */
   p_out = dhcp_create_msg(netif, dhcp, DHCP_DECLINE, &options_out_len);
   if (p_out != NULL) {
@@ -966,15 +1005,9 @@
                 ("dhcp_decline: could not allocate DHCP request\n"));
     result = ERR_MEM;
   }
-  if (dhcp->tries < 255) {
-    dhcp->tries++;
-  }
-  msecs = 10 * 1000;
-  dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs));
   return result;
 }
-#endif /* DHCP_DOES_ARP_CHECK */
+#endif /* LWIP_DHCP_DOES_ACD_CHECK */
 
 
 /**
@@ -994,6 +1027,12 @@
 
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n"));
 
+#if LWIP_DHCP_AUTOIP_COOP
+  if (dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES) {
+    autoip_start(netif);
+  }
+#endif /* LWIP_DHCP_AUTOIP_COOP */
+
   ip4_addr_set_any(&dhcp->offered_ip_addr);
   dhcp_set_state(dhcp, DHCP_STATE_SELECTING);
   /* create and initialize the DHCP message header */
@@ -1005,6 +1044,10 @@
     options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
     options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif));
 
+#if LWIP_NETIF_HOSTNAME && LWIP_DHCP_DISCOVER_ADD_HOSTNAME
+    options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif);
+#endif /* LWIP NETIF HOSTNAME && LWIP_DHCP_DISCOVER_ADD_HOSTNAME */
+
     options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
     for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
       options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
@@ -1014,22 +1057,17 @@
 
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER)\n"));
     udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY);
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n"));
+    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()\n"));
     pbuf_free(p_out);
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n"));
   } else {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n"));
   }
+
   if (dhcp->tries < 255) {
     dhcp->tries++;
   }
-#if LWIP_DHCP_AUTOIP_COOP
-  if (dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {
-    dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;
-    autoip_start(netif);
-  }
-#endif /* LWIP_DHCP_AUTOIP_COOP */
-  msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000);
+  msecs = DHCP_REQUEST_BACKOFF_SEQUENCE(dhcp->tries);
   dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs));
   return result;
@@ -1044,7 +1082,6 @@
 static void
 dhcp_bind(struct netif *netif)
 {
-  u32_t timeout;
   struct dhcp *dhcp;
   ip4_addr_t sn_mask, gw_addr;
   LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;);
@@ -1058,14 +1095,7 @@
   if (dhcp->offered_t0_lease != 0xffffffffUL) {
     /* set renewal period timer */
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t0 renewal timer %"U32_F" secs\n", dhcp->offered_t0_lease));
-    timeout = (dhcp->offered_t0_lease + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
-    if (timeout > 0xffff) {
-      timeout = 0xffff;
-    }
-    dhcp->t0_timeout = (u16_t)timeout;
-    if (dhcp->t0_timeout == 0) {
-      dhcp->t0_timeout = 1;
-    }
+    DHCP_SET_TIMEOUT_FROM_OFFERED_T0_LEASE(dhcp->t0_timeout, dhcp);
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t0_lease * 1000));
   }
 
@@ -1073,28 +1103,14 @@
   if (dhcp->offered_t1_renew != 0xffffffffUL) {
     /* set renewal period timer */
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew));
-    timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
-    if (timeout > 0xffff) {
-      timeout = 0xffff;
-    }
-    dhcp->t1_timeout = (u16_t)timeout;
-    if (dhcp->t1_timeout == 0) {
-      dhcp->t1_timeout = 1;
-    }
+    DHCP_SET_TIMEOUT_FROM_OFFERED_T1_RENEW(dhcp->t1_timeout, dhcp);
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew * 1000));
     dhcp->t1_renew_time = dhcp->t1_timeout;
   }
   /* set renewal period timer */
   if (dhcp->offered_t2_rebind != 0xffffffffUL) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind));
-    timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
-    if (timeout > 0xffff) {
-      timeout = 0xffff;
-    }
-    dhcp->t2_timeout = (u16_t)timeout;
-    if (dhcp->t2_timeout == 0) {
-      dhcp->t2_timeout = 1;
-    }
+    DHCP_SET_TIMEOUT_FROM_OFFERED_T2_REBIND(dhcp->t2_timeout, dhcp);
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind * 1000));
     dhcp->t2_rebind_time = dhcp->t2_timeout;
   }
@@ -1104,7 +1120,7 @@
     dhcp->t1_timeout = 0;
   }
 
-  if (dhcp->subnet_mask_given) {
+  if (dhcp->flags & DHCP_FLAG_SUBNET_MASK_GIVEN) {
     /* copy offered network mask */
     ip4_addr_copy(sn_mask, dhcp->offered_sn_mask);
   } else {
@@ -1121,13 +1137,6 @@
 
   ip4_addr_copy(gw_addr, dhcp->offered_gw_addr);
 
-#if LWIP_DHCP_AUTOIP_COOP
-  if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) {
-    autoip_stop(netif);
-    dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
-  }
-#endif /* LWIP_DHCP_AUTOIP_COOP */
-
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F" SN: 0x%08"X32_F" GW: 0x%08"X32_F"\n",
               ip4_addr_get_u32(&dhcp->offered_ip_addr), ip4_addr_get_u32(&sn_mask), ip4_addr_get_u32(&gw_addr)));
   /* netif is now bound to DHCP leased address - set this before assigning the address
@@ -1371,12 +1380,10 @@
      dhcp_set_state(dhcp, DHCP_STATE_OFF);
   }
 
-#if LWIP_DHCP_AUTOIP_COOP
-  if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) {
-    autoip_stop(netif);
-    dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
-  }
-#endif /* LWIP_DHCP_AUTOIP_COOP */
+#if LWIP_DHCP_DOES_ACD_CHECK
+  /* stop acd because we may be in checking state and the callback would trigger a bind */
+  acd_remove(netif, &dhcp->acd);
+#endif
 
   if (dhcp->pcb_allocated != 0) {
     dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */
@@ -1570,7 +1577,7 @@
     } else {
       len = (q->next != NULL ? ((u8_t *)q->next->payload)[0] : 0);
     }
-    /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
+    /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F"\n", msg_offset, q->len)); */
     decode_len = len;
     switch (op) {
       /* case(DHCP_OPTION_END): handled above */
@@ -1744,7 +1751,7 @@
     /* make sure the string is really NULL-terminated */
     dhcp->boot_file_name[DHCP_FILE_LEN-1] = 0;
   }
-#endif /* LWIP_DHCP_BOOTP_FILE */ 
+#endif /* LWIP_DHCP_BOOTP_FILE */
   return ERR_OK;
 }
 
@@ -1823,10 +1830,11 @@
   /* message type is DHCP ACK? */
   if (msg_type == DHCP_ACK) {
     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n"));
-    /* in requesting state? */
-    if (dhcp->state == DHCP_STATE_REQUESTING) {
+    /* in requesting state or just reconnected to the network? */
+    if ((dhcp->state == DHCP_STATE_REQUESTING) ||
+        (dhcp->state == DHCP_STATE_REBOOTING)) {
       dhcp_handle_ack(netif, msg_in);
-#if DHCP_DOES_ARP_CHECK
+#if LWIP_DHCP_DOES_ACD_CHECK
       if ((netif->flags & NETIF_FLAG_ETHARP) != 0) {
         /* check if the acknowledged lease address is already in use */
         dhcp_check(netif);
@@ -1839,8 +1847,8 @@
       dhcp_bind(netif);
 #endif
     }
-    /* already bound to the given lease address? */
-    else if ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REBINDING) ||
+    /* already bound to the given lease address and using it? */
+    else if ((dhcp->state == DHCP_STATE_REBINDING) ||
              (dhcp->state == DHCP_STATE_RENEWING)) {
       dhcp_handle_ack(netif, msg_in);
       dhcp_bind(netif);
diff --git a/src/core/ipv4/etharp.c b/src/core/ipv4/etharp.c
index c3a5a10..3092dc9 100644
--- a/src/core/ipv4/etharp.c
+++ b/src/core/ipv4/etharp.c
@@ -7,7 +7,7 @@
  * requests from other machines for our physical address.
  *
  * This implementation complies with RFC 826 (Ethernet ARP). It supports
- * Gratuitious ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6
+ * Gratuitous ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6
  * if an interface calls etharp_gratuitous(our_netif) upon address change.
  */
 
@@ -52,6 +52,7 @@
 #include "lwip/snmp.h"
 #include "lwip/dhcp.h"
 #include "lwip/autoip.h"
+#include "lwip/acd.h"
 #include "lwip/prot/iana.h"
 #include "netif/ethernet.h"
 
@@ -141,7 +142,7 @@
 /**
  * Free a complete queue of etharp entries
  *
- * @param q a qeueue of etharp_q_entry's to free
+ * @param q a queue of etharp_q_entry's to free
  */
 static void
 free_etharp_q(struct etharp_q_entry *q)
@@ -291,7 +292,7 @@
       LWIP_ASSERT("state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE",
                   state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE);
       /* if given, does IP address match IP address in ARP entry? */
-      if (ipaddr && ip4_addr_cmp(ipaddr, &arp_table[i].ipaddr)
+      if (ipaddr && ip4_addr_eq(ipaddr, &arp_table[i].ipaddr)
 #if ETHARP_TABLE_MATCH_NETIF
           && ((netif == NULL) || (netif == arp_table[i].netif))
 #endif /* ETHARP_TABLE_MATCH_NETIF */
@@ -643,7 +644,7 @@
   struct etharp_hdr *hdr;
   /* these are aligned properly, whereas the ARP header fields might not be */
   ip4_addr_t sipaddr, dipaddr;
-  u8_t for_us;
+  u8_t for_us, from_us;
 
   LWIP_ASSERT_CORE_LOCKED();
 
@@ -666,12 +667,16 @@
   }
   ETHARP_STATS_INC(etharp.recv);
 
-#if LWIP_AUTOIP
-  /* We have to check if a host already has configured our random
-   * created link local address and continuously check if there is
-   * a host with this IP-address so we can detect collisions */
-  autoip_arp_reply(netif, hdr);
-#endif /* LWIP_AUTOIP */
+#if LWIP_ACD
+  /* We have to check if a host already has configured our ip address and
+   * continuously check if there is a host with this IP-address so we can
+   * detect collisions.
+   * acd_arp_reply ensures the detection of conflicts. It will handle possible
+   * defending or retreating and will make sure a new IP address is selected.
+   * etharp_input does not need to handle packets that originate "from_us".
+   */
+  acd_arp_reply(netif, hdr);
+#endif /* LWIP_ACD */
 
   /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
    * structure packing (not using structure copy which breaks strict-aliasing rules). */
@@ -681,9 +686,12 @@
   /* this interface is not configured? */
   if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {
     for_us = 0;
+    from_us = 0;
   } else {
     /* ARP packet directed to us? */
-    for_us = (u8_t)ip4_addr_cmp(&dipaddr, netif_ip4_addr(netif));
+    for_us = (u8_t)ip4_addr_eq(&dipaddr, netif_ip4_addr(netif));
+    /* ARP packet from us? */
+    from_us = (u8_t)ip4_addr_eq(&sipaddr, netif_ip4_addr(netif));
   }
 
   /* ARP message directed to us?
@@ -704,7 +712,7 @@
 
       LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: incoming ARP request\n"));
       /* ARP request for our address? */
-      if (for_us) {
+      if (for_us && !from_us) {
         /* send ARP response */
         etharp_raw(netif,
                    (struct eth_addr *)netif->hwaddr, &hdr->shwaddr,
@@ -724,13 +732,6 @@
     case PP_HTONS(ARP_REPLY):
       /* ARP reply. We already updated the ARP cache earlier. */
       LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: incoming ARP reply\n"));
-#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
-      /* DHCP wants to know about ARP replies from any host with an
-       * IP address also offered to us by the DHCP server. We do not
-       * want to take a duplicate IP address on a single network.
-       * @todo How should we handle redundant (fail-over) interfaces? */
-      dhcp_arp_reply(netif, &sipaddr);
-#endif /* (LWIP_DHCP && DHCP_DOES_ARP_CHECK) */
       break;
     default:
       LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP unknown opcode type %"S16_F"\n", lwip_htons(hdr->opcode)));
@@ -822,7 +823,7 @@
     netif_addr_idx_t i;
     /* outside local network? if so, this can neither be a global broadcast nor
        a subnet broadcast. */
-    if (!ip4_addr_netcmp(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) &&
+    if (!ip4_addr_net_eq(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) &&
         !ip4_addr_islinklocal(ipaddr)) {
 #if LWIP_AUTOIP
       struct ip_hdr *iphdr = LWIP_ALIGNMENT_CAST(struct ip_hdr *, q->payload);
@@ -862,7 +863,7 @@
 #if ETHARP_TABLE_MATCH_NETIF
             (arp_table[etharp_cached_entry].netif == netif) &&
 #endif
-            (ip4_addr_cmp(dst_addr, &arp_table[etharp_cached_entry].ipaddr))) {
+            (ip4_addr_eq(dst_addr, &arp_table[etharp_cached_entry].ipaddr))) {
           /* the per-pcb-cached entry is stable and the right one! */
           ETHARP_STATS_INC(etharp.cachehit);
           return etharp_output_to_arp_index(netif, q, etharp_cached_entry);
@@ -879,7 +880,7 @@
 #if ETHARP_TABLE_MATCH_NETIF
           (arp_table[i].netif == netif) &&
 #endif
-          (ip4_addr_cmp(dst_addr, &arp_table[i].ipaddr))) {
+          (ip4_addr_eq(dst_addr, &arp_table[i].ipaddr))) {
         /* found an existing, stable entry */
         ETHARP_SET_ADDRHINT(netif, i);
         return etharp_output_to_arp_index(netif, q, i);
@@ -1014,7 +1015,7 @@
      * new PBUF_RAM. See the definition of PBUF_NEEDS_COPY for details. */
     p = q;
     while (p) {
-      LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0));
+      LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == NULL));
       if (PBUF_NEEDS_COPY(p)) {
         copy_needed = 1;
         break;
@@ -1038,7 +1039,7 @@
       new_entry = (struct etharp_q_entry *)memp_malloc(MEMP_ARP_QUEUE);
       if (new_entry != NULL) {
         unsigned int qlen = 0;
-        new_entry->next = 0;
+        new_entry->next = NULL;
         new_entry->p = p;
         if (arp_table[i].q != NULL) {
           /* queue was already existent, append the new entry to the end */
@@ -1209,4 +1210,42 @@
   return etharp_request_dst(netif, ipaddr, &ethbroadcast);
 }
 
+#if LWIP_ACD
+/**
+ * Send an ARP request packet probing for an ipaddr.
+ * Used to send probe messages for address conflict detection.
+ *
+ * @param netif the lwip network interface on which to send the request
+ * @param ipaddr the IP address to probe
+ * @return ERR_OK if the request has been sent
+ *         ERR_MEM if the ARP packet couldn't be allocated
+ *         any other err_t on failure
+ */
+err_t
+etharp_acd_probe(struct netif *netif, const ip4_addr_t *ipaddr)
+{
+  return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
+                    (struct eth_addr *)netif->hwaddr, IP4_ADDR_ANY4, &ethzero,
+                    ipaddr, ARP_REQUEST);
+}
+
+/**
+ * Send an ARP request packet announcing an ipaddr.
+ * Used to send announce messages for address conflict detection.
+ *
+ * @param netif the lwip network interface on which to send the request
+ * @param ipaddr the IP address to announce
+ * @return ERR_OK if the request has been sent
+ *         ERR_MEM if the ARP packet couldn't be allocated
+ *         any other err_t on failure
+ */
+err_t
+etharp_acd_announce(struct netif *netif, const ip4_addr_t *ipaddr)
+{
+  return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
+                    (struct eth_addr *)netif->hwaddr, ipaddr, &ethzero,
+                    ipaddr, ARP_REQUEST);
+}
+#endif /* LWIP_ACD */
+
 #endif /* LWIP_IPV4 && LWIP_ARP */
diff --git a/src/core/ipv4/icmp.c b/src/core/ipv4/icmp.c
index 59b493a..9a82a67 100644
--- a/src/core/ipv4/icmp.c
+++ b/src/core/ipv4/icmp.c
@@ -171,7 +171,7 @@
           goto icmperr;
         }
         if (r->len < hlen + sizeof(struct icmp_echo_hdr)) {
-          LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("first pbuf cannot hold the ICMP header"));
+          LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("first pbuf cannot hold the ICMP header\n"));
           pbuf_free(r);
           goto icmperr;
         }
@@ -179,13 +179,13 @@
         MEMCPY(r->payload, iphdr_in, hlen);
         /* switch r->payload back to icmp header (cannot fail) */
         if (pbuf_remove_header(r, hlen)) {
-          LWIP_ASSERT("icmp_input: moving r->payload to icmp header failed\n", 0);
+          LWIP_ASSERT("icmp_input: moving r->payload to icmp header failed", 0);
           pbuf_free(r);
           goto icmperr;
         }
         /* copy the rest of the packet without ip header */
         if (pbuf_copy(r, p) != ERR_OK) {
-          LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("icmp_input: copying to new pbuf failed"));
+          LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("icmp_input: copying to new pbuf failed\n"));
           pbuf_free(r);
           goto icmperr;
         }
@@ -196,7 +196,7 @@
       } else {
         /* restore p->payload to point to icmp header (cannot fail) */
         if (pbuf_remove_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) {
-          LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0);
+          LWIP_ASSERT("icmp_input: restoring original p->payload failed", 0);
           goto icmperr;
         }
       }
@@ -206,7 +206,7 @@
        * setting the icmp type to ECHO_RESPONSE and updating the checksum. */
       iecho = (struct icmp_echo_hdr *)p->payload;
       if (pbuf_add_header(p, hlen)) {
-        LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Can't move over header in packet"));
+        LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Can't move over header in packet\n"));
       } else {
         err_t ret;
         struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;
@@ -341,8 +341,7 @@
 {
   struct pbuf *q;
   struct ip_hdr *iphdr;
-  /* we can use the echo header here */
-  struct icmp_echo_hdr *icmphdr;
+  struct icmp_hdr *icmphdr;
   ip4_addr_t iphdr_src;
   struct netif *netif;
   u16_t response_pkt_len;
@@ -357,31 +356,29 @@
   }
 
   /* ICMP header + part of original packet */
-  q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + response_pkt_len, PBUF_RAM);
+  q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_hdr) + response_pkt_len, PBUF_RAM);
   if (q == NULL) {
-    LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n"));
+    LWIP_DEBUGF(ICMP_DEBUG, ("icmp_send_response: failed to allocate pbuf for ICMP packet.\n"));
     MIB2_STATS_INC(mib2.icmpouterrors);
     return;
   }
   LWIP_ASSERT("check that first pbuf can hold icmp message",
-              (q->len >= (sizeof(struct icmp_echo_hdr) + response_pkt_len)));
+              (q->len >= (sizeof(struct icmp_hdr) + response_pkt_len)));
 
   iphdr = (struct ip_hdr *)p->payload;
-  LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from "));
+  LWIP_DEBUGF(ICMP_DEBUG, ("icmp_send_response: Sending ICMP type %02X for packet from ", type));
   ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->src);
   LWIP_DEBUGF(ICMP_DEBUG, (" to "));
   ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->dest);
   LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
 
-  icmphdr = (struct icmp_echo_hdr *)q->payload;
+  icmphdr = (struct icmp_hdr *)q->payload;
   icmphdr->type = type;
   icmphdr->code = code;
-  icmphdr->id = 0;
-  icmphdr->seqno = 0;
+  icmphdr->data = 0;
 
   /* copy fields from original packet */
-  SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload,
-          response_pkt_len);
+  pbuf_copy_partial_pbuf(q, p, response_pkt_len, sizeof(struct icmp_hdr));
 
   ip4_addr_copy(iphdr_src, iphdr->src);
 #ifdef LWIP_HOOK_IP4_ROUTE_SRC
diff --git a/src/core/ipv4/igmp.c b/src/core/ipv4/igmp.c
index b655aa3..a74df16 100644
--- a/src/core/ipv4/igmp.c
+++ b/src/core/ipv4/igmp.c
@@ -220,7 +220,7 @@
   struct igmp_group *group = netif_igmp_data(ifp);
 
   while (group != NULL) {
-    if (ip4_addr_cmp(&(group->group_address), addr)) {
+    if (ip4_addr_eq(&(group->group_address), addr)) {
       return group;
     }
     group = group->next;
@@ -266,13 +266,13 @@
     if (list_head == NULL) {
       /* this is the first entry in linked list */
       LWIP_ASSERT("igmp_lookup_group: first group must be allsystems",
-                  (ip4_addr_cmp(addr, &allsystems) != 0));
+                  (ip4_addr_eq(addr, &allsystems) != 0));
       group->next = NULL;
       netif_set_client_data(ifp, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP, group);
     } else {
       /* append _after_ first entry */
       LWIP_ASSERT("igmp_lookup_group: all except first group must not be allsystems",
-                  (ip4_addr_cmp(addr, &allsystems) == 0));
+                  (ip4_addr_eq(addr, &allsystems) == 0));
       group->next = list_head->next;
       list_head->next = group;
     }
@@ -366,7 +366,7 @@
   switch (igmp->igmp_msgtype) {
     case IGMP_MEMB_QUERY:
       /* IGMP_MEMB_QUERY to the "all systems" address ? */
-      if ((ip4_addr_cmp(dest, &allsystems)) && ip4_addr_isany(&igmp->igmp_group_address)) {
+      if ((ip4_addr_eq(dest, &allsystems)) && ip4_addr_isany(&igmp->igmp_group_address)) {
         /* THIS IS THE GENERAL QUERY */
         LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: General IGMP_MEMB_QUERY on \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp)));
 
@@ -395,7 +395,7 @@
         if (!ip4_addr_isany(&igmp->igmp_group_address)) {
           LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_MEMB_QUERY to a specific group "));
           ip4_addr_debug_print_val(IGMP_DEBUG, igmp->igmp_group_address);
-          if (ip4_addr_cmp(dest, &allsystems)) {
+          if (ip4_addr_eq(dest, &allsystems)) {
             ip4_addr_t groupaddr;
             LWIP_DEBUGF(IGMP_DEBUG, (" using \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp)));
             /* we first need to re-look for the group since we used dest last time */
@@ -455,12 +455,12 @@
 
   /* make sure it is multicast address */
   LWIP_ERROR("igmp_joingroup: attempt to join non-multicast address", ip4_addr_ismulticast(groupaddr), return ERR_VAL;);
-  LWIP_ERROR("igmp_joingroup: attempt to join allsystems address", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;);
+  LWIP_ERROR("igmp_joingroup: attempt to join allsystems address", (!ip4_addr_eq(groupaddr, &allsystems)), return ERR_VAL;);
 
   /* loop through netif's */
   NETIF_FOREACH(netif) {
     /* Should we join this interface ? */
-    if ((netif->flags & NETIF_FLAG_IGMP) && ((ip4_addr_isany(ifaddr) || ip4_addr_cmp(netif_ip4_addr(netif), ifaddr)))) {
+    if ((netif->flags & NETIF_FLAG_IGMP) && ((ip4_addr_isany(ifaddr) || ip4_addr_eq(netif_ip4_addr(netif), ifaddr)))) {
       err = igmp_joingroup_netif(netif, groupaddr);
       if (err != ERR_OK) {
         /* Return an error even if some network interfaces are joined */
@@ -490,7 +490,7 @@
 
   /* make sure it is multicast address */
   LWIP_ERROR("igmp_joingroup_netif: attempt to join non-multicast address", ip4_addr_ismulticast(groupaddr), return ERR_VAL;);
-  LWIP_ERROR("igmp_joingroup_netif: attempt to join allsystems address", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;);
+  LWIP_ERROR("igmp_joingroup_netif: attempt to join allsystems address", (!ip4_addr_eq(groupaddr, &allsystems)), return ERR_VAL;);
 
   /* make sure it is an igmp-enabled netif */
   LWIP_ERROR("igmp_joingroup_netif: attempt to join on non-IGMP netif", netif->flags & NETIF_FLAG_IGMP, return ERR_VAL;);
@@ -552,12 +552,12 @@
 
   /* make sure it is multicast address */
   LWIP_ERROR("igmp_leavegroup: attempt to leave non-multicast address", ip4_addr_ismulticast(groupaddr), return ERR_VAL;);
-  LWIP_ERROR("igmp_leavegroup: attempt to leave allsystems address", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;);
+  LWIP_ERROR("igmp_leavegroup: attempt to leave allsystems address", (!ip4_addr_eq(groupaddr, &allsystems)), return ERR_VAL;);
 
   /* loop through netif's */
   NETIF_FOREACH(netif) {
     /* Should we leave this interface ? */
-    if ((netif->flags & NETIF_FLAG_IGMP) && ((ip4_addr_isany(ifaddr) || ip4_addr_cmp(netif_ip4_addr(netif), ifaddr)))) {
+    if ((netif->flags & NETIF_FLAG_IGMP) && ((ip4_addr_isany(ifaddr) || ip4_addr_eq(netif_ip4_addr(netif), ifaddr)))) {
       err_t res = igmp_leavegroup_netif(netif, groupaddr);
       if (err != ERR_OK) {
         /* Store this result if we have not yet gotten a success */
@@ -586,7 +586,7 @@
 
   /* make sure it is multicast address */
   LWIP_ERROR("igmp_leavegroup_netif: attempt to leave non-multicast address", ip4_addr_ismulticast(groupaddr), return ERR_VAL;);
-  LWIP_ERROR("igmp_leavegroup_netif: attempt to leave allsystems address", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;);
+  LWIP_ERROR("igmp_leavegroup_netif: attempt to leave allsystems address", (!ip4_addr_eq(groupaddr, &allsystems)), return ERR_VAL;);
 
   /* make sure it is an igmp-enabled netif */
   LWIP_ERROR("igmp_leavegroup_netif: attempt to leave on non-IGMP netif", netif->flags & NETIF_FLAG_IGMP, return ERR_VAL;);
@@ -669,7 +669,7 @@
   /* If the state is IGMP_GROUP_DELAYING_MEMBER then we send a report for this group
      (unless it is the allsystems group) */
   if ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) &&
-      (!(ip4_addr_cmp(&(group->group_address), &allsystems)))) {
+      (!(ip4_addr_eq(&(group->group_address), &allsystems)))) {
     LWIP_DEBUGF(IGMP_DEBUG, ("igmp_timeout: report membership for group with address "));
     ip4_addr_debug_print_val(IGMP_DEBUG, group->group_address);
     LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void *)netif));
diff --git a/src/core/ipv4/ip4.c b/src/core/ipv4/ip4.c
index 26c26a9..e044bff 100644
--- a/src/core/ipv4/ip4.c
+++ b/src/core/ipv4/ip4.c
@@ -171,12 +171,12 @@
     /* is the netif up, does it have a link and a valid address? */
     if (netif_is_up(netif) && netif_is_link_up(netif) && !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
       /* network mask matches? */
-      if (ip4_addr_netcmp(dest, netif_ip4_addr(netif), netif_ip4_netmask(netif))) {
+      if (ip4_addr_net_eq(dest, netif_ip4_addr(netif), netif_ip4_netmask(netif))) {
         /* return netif on which to forward IP packet */
         return netif;
       }
       /* gateway matches on a non broadcast interface? (i.e. peer in a point to point interface) */
-      if (((netif->flags & NETIF_FLAG_BROADCAST) == 0) && ip4_addr_cmp(dest, netif_ip4_gw(netif))) {
+      if (((netif->flags & NETIF_FLAG_BROADCAST) == 0) && ip4_addr_eq(dest, netif_ip4_gw(netif))) {
         /* return netif on which to forward IP packet */
         return netif;
       }
@@ -184,10 +184,10 @@
   }
 
 #if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF
-  /* loopif is disabled, looopback traffic is passed through any netif */
+  /* loopif is disabled, loopback traffic is passed through any netif */
   if (ip4_addr_isloopback(dest)) {
     /* don't check for link on loopback traffic */
-    if (netif_default != NULL && netif_is_up(netif_default)) {
+    if ((netif_default != NULL) && netif_is_up(netif_default)) {
       return netif_default;
     }
     /* default netif is not up, just use any netif for loopback traffic */
@@ -336,6 +336,40 @@
     IPH_CHKSUM_SET(iphdr, (u16_t)(IPH_CHKSUM(iphdr) + PP_HTONS(0x100)));
   }
 
+  /* Take care of setting checksums to 0 for checksum offload netifs */
+  if (CHECKSUM_GEN_IP || NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_IP)) {
+    IPH_CHKSUM_SET(iphdr, 0);
+  }
+  switch (IPH_PROTO(iphdr)) {
+#if LWIP_UDP
+#if LWIP_UDPLITE
+  case IP_PROTO_UDPLITE:
+#endif
+  case IP_PROTO_UDP:
+    if (CHECKSUM_GEN_UDP || NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_UDP)) {
+      ((struct udp_hdr *)((u8_t *)iphdr + IPH_HL_BYTES(iphdr)))->chksum = 0;
+    }
+    break;
+#endif
+#if LWIP_TCP
+  case IP_PROTO_TCP:
+    if (CHECKSUM_GEN_TCP || NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_TCP)) {
+      ((struct tcp_hdr *)((u8_t *)iphdr + IPH_HL_BYTES(iphdr)))->chksum = 0;
+    }
+    break;
+#endif
+#if LWIP_ICMP
+  case IP_PROTO_ICMP:
+    if (CHECKSUM_GEN_ICMP || NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP)) {
+      ((struct icmp_hdr *)((u8_t *)iphdr + IPH_HL_BYTES(iphdr)))->chksum = 0;
+    }
+    break;
+#endif
+  default:
+    /* there's really nothing to do here other than satisfying 'switch-default' */
+    break;
+  }
+
   LWIP_DEBUGF(IP_DEBUG, ("ip4_forward: forwarding packet to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
                          ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()),
                          ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr())));
@@ -382,7 +416,7 @@
   /* interface is up and configured? */
   if ((netif_is_up(netif)) && (!ip4_addr_isany_val(*netif_ip4_addr(netif)))) {
     /* unicast to this interface address? */
-    if (ip4_addr_cmp(ip4_current_dest_addr(), netif_ip4_addr(netif)) ||
+    if (ip4_addr_eq(ip4_current_dest_addr(), netif_ip4_addr(netif)) ||
         /* or broadcast on this interface network address? */
         ip4_addr_isbroadcast(ip4_current_dest_addr(), netif)
 #if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF
@@ -522,7 +556,7 @@
       /* IGMP snooping switches need 0.0.0.0 to be allowed as source address (RFC 4541) */
       ip4_addr_t allsystems;
       IP4_ADDR(&allsystems, 224, 0, 0, 1);
-      if (ip4_addr_cmp(ip4_current_dest_addr(), &allsystems) &&
+      if (ip4_addr_eq(ip4_current_dest_addr(), &allsystems) &&
           ip4_addr_isany(ip4_current_src_addr())) {
         check_ip_src = 0;
       }
@@ -981,13 +1015,13 @@
   ip4_debug_print(p);
 
 #if ENABLE_LOOPBACK
-  if (ip4_addr_cmp(dest, netif_ip4_addr(netif))
+  if (ip4_addr_eq(dest, netif_ip4_addr(netif))
 #if !LWIP_HAVE_LOOPIF
       || ip4_addr_isloopback(dest)
 #endif /* !LWIP_HAVE_LOOPIF */
      ) {
     /* Packet to self, enqueue it for loopback */
-    LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()"));
+    LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()\n"));
     return netif_loop_output(netif, p);
   }
 #if LWIP_MULTICAST_TX_OPTIONS
diff --git a/src/core/ipv4/ip4_addr.c b/src/core/ipv4/ip4_addr.c
index f99d8dd..79127ac 100644
--- a/src/core/ipv4/ip4_addr.c
+++ b/src/core/ipv4/ip4_addr.c
@@ -73,7 +73,7 @@
   } else if (addr == ip4_addr_get_u32(netif_ip4_addr(netif))) {
     return 0;
     /*  on the same (sub) network... */
-  } else if (ip4_addr_netcmp(&ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif))
+  } else if (ip4_addr_net_eq(&ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif))
              /* ...and host identifier bits are all ones? =>... */
              && ((addr & ~ip4_addr_get_u32(netif_ip4_netmask(netif))) ==
                  (IPADDR_BROADCAST & ~ip4_addr_get_u32(netif_ip4_netmask(netif))))) {
diff --git a/src/core/ipv4/ip4_frag.c b/src/core/ipv4/ip4_frag.c
index a445530..5303144 100644
--- a/src/core/ipv4/ip4_frag.c
+++ b/src/core/ipv4/ip4_frag.c
@@ -106,8 +106,8 @@
 #endif
 
 #define IP_ADDRESSES_AND_ID_MATCH(iphdrA, iphdrB)  \
-  (ip4_addr_cmp(&(iphdrA)->src, &(iphdrB)->src) && \
-   ip4_addr_cmp(&(iphdrA)->dest, &(iphdrB)->dest) && \
+  (ip4_addr_eq(&(iphdrA)->src, &(iphdrB)->src) && \
+   ip4_addr_eq(&(iphdrA)->dest, &(iphdrB)->dest) && \
    IPH_ID(iphdrA) == IPH_ID(iphdrB)) ? 1 : 0
 
 /* global variables */
diff --git a/src/core/ipv6/dhcp6.c b/src/core/ipv6/dhcp6.c
index 41444a4..e6a7e64 100644
--- a/src/core/ipv6/dhcp6.c
+++ b/src/core/ipv6/dhcp6.c
@@ -16,8 +16,8 @@
  * - only start requests if a valid local address is available on the netif
  * - only start information requests if required (not for every RA)
  *
- * dhcp6_enable_stateful() enables stateful DHCPv6 for a netif (stateless disabled)\n
- * dhcp6_enable_stateless() enables stateless DHCPv6 for a netif (stateful disabled)\n
+ * dhcp6_enable_stateful() enables stateful DHCPv6 for a netif (stateless disabled)<br>
+ * dhcp6_enable_stateless() enables stateless DHCPv6 for a netif (stateful disabled)<br>
  * dhcp6_disable() disable DHCPv6 for a netif
  *
  * When enabled, requests are only issued after receipt of RA with the
@@ -240,7 +240,7 @@
       netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL);
       return NULL;
     }
-    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: allocated dhcp6", dbg_requester));
+    LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: allocated dhcp6\n", dbg_requester));
     dhcp6->pcb_allocated = 1;
   }
   return dhcp6;
@@ -299,7 +299,7 @@
 dhcp6_enable_stateful(struct netif *netif)
 {
   LWIP_UNUSED_ARG(netif);
-  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("stateful dhcp6 not implemented yet"));
+  LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("stateful dhcp6 not implemented yet\n"));
   return ERR_VAL;
 }
 
@@ -324,12 +324,12 @@
     return ERR_MEM;
   }
   if (dhcp6_stateless_enabled(dhcp6)) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_enable_stateless(): stateless DHCPv6 already enabled"));
+    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_enable_stateless(): stateless DHCPv6 already enabled\n"));
     return ERR_OK;
   } else if (dhcp6->state != DHCP6_STATE_OFF) {
     /* stateful running */
     /* @todo: stop stateful once it is implemented */
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_enable_stateless(): switching from stateful to stateless DHCPv6"));
+    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_enable_stateless(): switching from stateful to stateless DHCPv6\n"));
   }
   LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_enable_stateless(): stateless DHCPv6 enabled\n"));
   dhcp6_set_state(dhcp6, DHCP6_STATE_STATELESS_IDLE, "dhcp6_enable_stateless");
@@ -453,14 +453,14 @@
 {
   const u16_t requested_options[] = {
 #if LWIP_DHCP6_PROVIDE_DNS_SERVERS
-    DHCP6_OPTION_DNS_SERVERS, 
+    DHCP6_OPTION_DNS_SERVERS,
     DHCP6_OPTION_DOMAIN_LIST
 #endif
 #if LWIP_DHCP6_GET_NTP_SRV
     , DHCP6_OPTION_SNTP_SERVERS
 #endif
   };
-  
+
   u16_t msecs;
   struct pbuf *p_out;
   u16_t options_out_len;
@@ -579,7 +579,7 @@
 }
 #endif /* LWIP_IPV6_DHCP6_STATELESS */
 
-/** This function is called from nd6 module when an RA messsage is received
+/** This function is called from nd6 module when an RA message is received
  * It triggers DHCPv6 requests (if enabled).
  */
 void
@@ -645,7 +645,7 @@
       /* overflow */
       return ERR_BUF;
     }
-    /* copy option + length, might be split accross pbufs */
+    /* copy option + length, might be split across pbufs */
     op_len = (u8_t *)pbuf_get_contiguous(p, op_len_buf, 4, 4, offset);
     if (op_len == NULL) {
       /* failed to get option and length */
diff --git a/src/core/ipv6/icmp6.c b/src/core/ipv6/icmp6.c
index 4fd1021..ed0bd7b 100644
--- a/src/core/ipv6/icmp6.c
+++ b/src/core/ipv6/icmp6.c
@@ -388,7 +388,6 @@
   struct pbuf *q;
   struct icmp6_hdr *icmp6hdr;
   u16_t datalen = LWIP_MIN(p->tot_len, LWIP_ICMP6_DATASIZE);
-  u16_t offset;
 
   /* ICMPv6 header + datalen (as much of the offending packet as possible) */
   q = pbuf_alloc(PBUF_IP, sizeof(struct icmp6_hdr) + datalen,
@@ -406,16 +405,8 @@
   icmp6hdr->code = code;
   icmp6hdr->data = lwip_htonl(data);
 
-  /* copy fields from original packet (which may be a chain of pbufs) */
-  offset = sizeof(struct icmp6_hdr);
-  while (p && datalen) {
-    u16_t len = LWIP_MIN(datalen, p->len);
-    err_t res = pbuf_take_at(q, p->payload, len, offset);
-    if (res != ERR_OK) break;
-    datalen -= len;
-    offset += len;
-    p = p->next;
-  }
+  /* copy fields from original packet */
+  pbuf_copy_partial_pbuf(q, p, datalen, sizeof(struct icmp6_hdr));
 
   /* calculate checksum */
   icmp6hdr->chksum = 0;
diff --git a/src/core/ipv6/ip6.c b/src/core/ipv6/ip6.c
index 060d5f3..90e90dd 100644
--- a/src/core/ipv6/ip6.c
+++ b/src/core/ipv6/ip6.c
@@ -166,7 +166,7 @@
         }
         for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
           if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-              ip6_addr_cmp_zoneless(src, netif_ip6_addr(netif, i))) {
+              ip6_addr_zoneless_eq(src, netif_ip6_addr(netif, i))) {
             return netif;
           }
         }
@@ -199,9 +199,9 @@
     }
     for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
       if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-          ip6_addr_netcmp(dest, netif_ip6_addr(netif, i)) &&
+          ip6_addr_net_eq(dest, netif_ip6_addr(netif, i)) &&
           (netif_ip6_addr_isstatic(netif, i) ||
-          ip6_addr_nethostcmp(dest, netif_ip6_addr(netif, i)))) {
+          ip6_addr_nethost_eq(dest, netif_ip6_addr(netif, i)))) {
         return netif;
       }
     }
@@ -222,7 +222,7 @@
       }
       for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
         if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-            ip6_addr_cmp(src, netif_ip6_addr(netif, i))) {
+            ip6_addr_eq(src, netif_ip6_addr(netif, i))) {
           return netif;
         }
       }
@@ -332,8 +332,8 @@
     /* @todo compute the actual common bits, for longest matching prefix. */
     /* We cannot count on the destination address having a proper zone
      * assignment, so do not compare zones in this case. */
-    cand_bits = ip6_addr_netcmp_zoneless(cand_addr, dest); /* just 1 or 0 for now */
-    if (cand_bits && ip6_addr_nethostcmp(cand_addr, dest)) {
+    cand_bits = ip6_addr_net_zoneless_eq(cand_addr, dest); /* just 1 or 0 for now */
+    if (cand_bits && ip6_addr_nethost_eq(cand_addr, dest)) {
       return netif_ip_addr6(netif, i); /* Rule 1 */
     }
     if ((best_addr == NULL) || /* no alternative yet */
@@ -477,7 +477,7 @@
       * scope as well (e.g., is this interface on the same link?). */
     for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
       if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-          ip6_addr_cmp(ip6_current_dest_addr(), netif_ip6_addr(netif, i))
+          ip6_addr_eq(ip6_current_dest_addr(), netif_ip6_addr(netif, i))
 #if IPV6_CUSTOM_SCOPES
           && (!ip6_addr_has_zone(ip6_current_src_addr()) ||
               ip6_addr_test_zone(ip6_current_src_addr(), netif))
@@ -611,7 +611,7 @@
       netif = NULL;
       for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
         if (ip6_addr_isvalid(netif_ip6_addr_state(inp, i)) &&
-            ip6_addr_cmp_solicitednode(ip6_current_dest_addr(), netif_ip6_addr(inp, i))) {
+            ip6_addr_solicitednode_eq(ip6_current_dest_addr(), netif_ip6_addr(inp, i))) {
           netif = inp;
           LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: solicited node packet accepted on interface %c%c\n",
               netif->name[0], netif->name[1]));
@@ -703,6 +703,10 @@
   /* Init header length. */
   hlen = hlen_tot = IP6_HLEN;
 
+  LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: \n"));
+  ip6_debug_print(p);
+  LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
+
   /* Move to payload. */
   pbuf_remove_header(p, IP6_HLEN);
 
@@ -1042,12 +1046,8 @@
 options_done:
 
   /* send to upper layers */
-  LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: \n"));
-  ip6_debug_print(p);
-  LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
-
   ip_data.current_ip_header_tot_len = hlen_tot;
-  
+
 #if LWIP_RAW
   /* p points to IPv6 header again for raw_input. */
   pbuf_add_header_force(p, hlen_tot);
@@ -1245,7 +1245,7 @@
 #endif /* !LWIP_HAVE_LOOPIF */
     for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
       if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-          ip6_addr_cmp(dest, netif_ip6_addr(netif, i))) {
+          ip6_addr_eq(dest, netif_ip6_addr(netif, i))) {
         /* Packet to self, enqueue it for loopback */
         LWIP_DEBUGF(IP6_DEBUG, ("netif_loop_output()\n"));
         return netif_loop_output(netif, p);
diff --git a/src/core/ipv6/ip6_addr.c b/src/core/ipv6/ip6_addr.c
index 687c02f..6e0ac86 100644
--- a/src/core/ipv6/ip6_addr.c
+++ b/src/core/ipv6/ip6_addr.c
@@ -46,6 +46,7 @@
 
 #include "lwip/ip_addr.h"
 #include "lwip/def.h"
+#include "lwip/netif.h"
 
 #include <string.h>
 
@@ -185,6 +186,17 @@
     }
 
     ip6_addr_clear_zone(addr);
+#if LWIP_IPV6_SCOPES
+    if (*s == '%') {
+      const char *scopestr = s + 1;
+      if (*scopestr) {
+        struct netif *netif = netif_find(scopestr);
+        if (netif) {
+          ip6_addr_assign_zone(addr, IP6_UNKNOWN, netif);
+        }
+      }
+    }
+#endif
   }
 
   if (current_block_index != 7) {
diff --git a/src/core/ipv6/ip6_frag.c b/src/core/ipv6/ip6_frag.c
index 8b352f5..16bcf95 100644
--- a/src/core/ipv6/ip6_frag.c
+++ b/src/core/ipv6/ip6_frag.c
@@ -166,7 +166,7 @@
     /* Then, move back to the original ipv6 header (we are now pointing to Fragment header).
        This cannot fail since we already checked when receiving this fragment. */
     if (pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (u8_t*)ipr->iphdr))) {
-      LWIP_ASSERT("ip6_reass_free: moving p->payload to ip6 header failed\n", 0);
+      LWIP_ASSERT("ip6_reass_free: moving p->payload to ip6 header failed", 0);
     }
     else {
       /* Reconstruct the zoned source and destination addresses, so that we do
@@ -320,8 +320,8 @@
        in the reassembly buffer. If so, we proceed with copying the
        fragment into the buffer. */
     if ((frag_hdr->_identification == ipr->identification) &&
-        ip6_addr_cmp_packed(ip6_current_src_addr(), &(IPV6_FRAG_SRC(ipr)), ipr->src_zone) &&
-        ip6_addr_cmp_packed(ip6_current_dest_addr(), &(IPV6_FRAG_DEST(ipr)), ipr->dest_zone)) {
+        ip6_addr_packed_eq(ip6_current_src_addr(), &(IPV6_FRAG_SRC(ipr)), ipr->src_zone) &&
+        ip6_addr_packed_eq(ip6_current_dest_addr(), &(IPV6_FRAG_DEST(ipr)), ipr->dest_zone)) {
       IP6_FRAG_STATS_INC(ip6_frag.cachehit);
       break;
     }
@@ -652,7 +652,7 @@
 
     /* Move pbuf back to IPv6 header. This should never fail. */
     if (pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (u8_t*)iphdr_ptr))) {
-      LWIP_ASSERT("ip6_reass: moving p->payload to ip6 header failed\n", 0);
+      LWIP_ASSERT("ip6_reass: moving p->payload to ip6 header failed", 0);
       pbuf_free(p);
       return NULL;
     }
diff --git a/src/core/ipv6/mld6.c b/src/core/ipv6/mld6.c
index a9c917d..ac4fb01 100644
--- a/src/core/ipv6/mld6.c
+++ b/src/core/ipv6/mld6.c
@@ -5,12 +5,12 @@
  * @defgroup mld6 MLD6
  * @ingroup ip6
  * Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710.
- * No support for MLDv2.\n
- * Note: The allnodes (ff01::1, ff02::1) group is assumed be received by your 
+ * No support for MLDv2.<br>
+ * Note: The allnodes (ff01::1, ff02::1) group is assumed be received by your
  * netif since it must always be received for correct IPv6 operation (e.g. SLAAC).
- * Ensure the netif filters are configured accordingly!\n
+ * Ensure the netif filters are configured accordingly!<br>
  * The netif flags also need NETIF_FLAG_MLD6 flag set to enable MLD6 on a
- * netif ("netif->flags |= NETIF_FLAG_MLD6;").\n
+ * netif ("netif->flags |= NETIF_FLAG_MLD6;").<br>
  * To be called from TCPIP thread.
  */
 
@@ -146,7 +146,7 @@
   struct mld_group *group = netif_mld6_data(ifp);
 
   while (group != NULL) {
-    if (ip6_addr_cmp(&(group->group_address), addr)) {
+    if (ip6_addr_eq(&(group->group_address), addr)) {
       return group;
     }
     group = group->next;
diff --git a/src/core/ipv6/nd6.c b/src/core/ipv6/nd6.c
index 81992fa..3b13c21 100644
--- a/src/core/ipv6/nd6.c
+++ b/src/core/ipv6/nd6.c
@@ -72,6 +72,18 @@
 #if LWIP_IPV6_DUP_DETECT_ATTEMPTS > IP6_ADDR_TENTATIVE_COUNT_MASK
 #error LWIP_IPV6_DUP_DETECT_ATTEMPTS > IP6_ADDR_TENTATIVE_COUNT_MASK
 #endif
+#if LWIP_ND6_NUM_NEIGHBORS > 127
+#error LWIP_ND6_NUM_NEIGHBORS must fit into an s8_t (max value: 127)
+#endif
+#if LWIP_ND6_NUM_DESTINATIONS > 32767
+#error LWIP_ND6_NUM_DESTINATIONS must fit into an s16_t (max value: 32767)
+#endif
+#if LWIP_ND6_NUM_PREFIXES > 127
+#error LWIP_ND6_NUM_PREFIXES must fit into an s8_t (max value: 127)
+#endif
+#if LWIP_ND6_NUM_ROUTERS > 127
+#error LWIP_ND6_NUM_ROUTERS must fit into an s8_t (max value: 127)
+#endif
 
 /* Router tables. */
 struct nd6_neighbor_cache_entry neighbor_cache[LWIP_ND6_NUM_NEIGHBORS];
@@ -83,8 +95,11 @@
 u32_t reachable_time = LWIP_ND6_REACHABLE_TIME;
 u32_t retrans_timer = LWIP_ND6_RETRANS_TIMER; /* @todo implement this value in timer */
 
+#if LWIP_ND6_QUEUEING
+static u8_t nd6_queue_size = 0;
+#endif
+
 /* Index for cache entries. */
-static u8_t nd6_cached_neighbor_index;
 static netif_addr_idx_t nd6_cached_destination_index;
 
 /* Multicast address holder. */
@@ -210,7 +225,7 @@
   for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     addr_state = netif_ip6_addr_state(netif, i);
     if (!ip6_addr_isinvalid(addr_state) && !netif_ip6_addr_isstatic(netif, i) &&
-        ip6_addr_netcmp(prefix_addr, netif_ip6_addr(netif, i))) {
+        ip6_addr_net_eq(prefix_addr, netif_ip6_addr(netif, i))) {
       /* Update the valid lifetime, as per RFC 4862 Sec. 5.5.3 point (e).
        * The valid lifetime will never drop to zero as a result of this. */
       u32_t remaining_life = netif_ip6_addr_valid_life(netif, i);
@@ -258,7 +273,7 @@
   free_idx = 0;
   for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     if (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, i))) {
-      if (ip6_addr_cmp(&ip6addr, netif_ip6_addr(netif, i))) {
+      if (ip6_addr_eq(&ip6addr, netif_ip6_addr(netif, i))) {
         return; /* formed address already exists */
       }
     } else if (free_idx == 0) {
@@ -338,7 +353,7 @@
       for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
         if (!ip6_addr_isinvalid(netif_ip6_addr_state(inp, i)) &&
             !ip6_addr_isduplicated(netif_ip6_addr_state(inp, i)) &&
-            ip6_addr_cmp(&target_address, netif_ip6_addr(inp, i))) {
+            ip6_addr_eq(&target_address, netif_ip6_addr(inp, i))) {
           /* We are using a duplicate address. */
           nd6_duplicate_addr_detected(inp, i);
 
@@ -475,7 +490,7 @@
       if ((ip6_addr_isvalid(netif_ip6_addr_state(inp, i)) ||
            (ip6_addr_istentative(netif_ip6_addr_state(inp, i)) &&
             ip6_addr_isany(ip6_current_src_addr()))) &&
-          ip6_addr_cmp(&target_address, netif_ip6_addr(inp, i))) {
+          ip6_addr_eq(&target_address, netif_ip6_addr(inp, i))) {
         accepted = 1;
         break;
       }
@@ -492,7 +507,7 @@
       /* Sender is validating this address. */
       for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {
         if (!ip6_addr_isinvalid(netif_ip6_addr_state(inp, i)) &&
-            ip6_addr_cmp(&target_address, netif_ip6_addr(inp, i))) {
+            ip6_addr_eq(&target_address, netif_ip6_addr(inp, i))) {
           /* Send a NA back so that the sender does not use this address. */
           nd6_send_na(inp, netif_ip6_addr(inp, i), ND6_FLAG_OVERRIDE | ND6_SEND_FLAG_ALLNODES_DEST);
           if (ip6_addr_istentative(netif_ip6_addr_state(inp, i))) {
@@ -782,7 +797,7 @@
               u8_t s;
               for (s = 0; s < DNS_MAX_SERVERS; s++) {
                 const ip_addr_t *addr = dns_getserver(s);
-                if(ip_addr_cmp(addr, &rdnss_address)) {
+                if(ip_addr_eq(addr, &rdnss_address)) {
                   dns_setserver(s, NULL);
                 }
               }
@@ -1032,7 +1047,7 @@
          * its destination cache entries, as per RFC 4861 Sec. 5.3 and 6.3.5. */
         s8_t j;
         for (j = 0; j < LWIP_ND6_NUM_DESTINATIONS; j++) {
-          if (ip6_addr_cmp(&destination_cache[j].next_hop_addr,
+          if (ip6_addr_eq(&destination_cache[j].next_hop_addr,
                &default_router_list[i].neighbor_entry->next_hop_address)) {
              ip6_addr_set_any(&destination_cache[j].destination_addr);
           }
@@ -1161,7 +1176,7 @@
 
 /** Send a neighbor solicitation message for a specific neighbor cache entry
  *
- * @param entry the neightbor cache entry for wich to send the message
+ * @param entry the neightbor cache entry for which to send the message
  * @param flags one of ND6_SEND_FLAG_*
  */
 static void
@@ -1191,7 +1206,7 @@
     int i;
     for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
       if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-            ip6_addr_netcmp(target_addr, netif_ip6_addr(netif, i))) {
+            ip6_addr_net_eq(target_addr, netif_ip6_addr(netif, i))) {
         src_addr = netif_ip6_addr(netif, i);
         break;
       }
@@ -1414,7 +1429,7 @@
 {
   s8_t i;
   for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    if (ip6_addr_cmp(ip6addr, &(neighbor_cache[i].next_hop_address))) {
+    if (ip6_addr_eq(ip6addr, &(neighbor_cache[i].next_hop_address))) {
       return i;
     }
   }
@@ -1576,7 +1591,7 @@
   IP6_ADDR_ZONECHECK(ip6addr);
 
   for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {
-    if (ip6_addr_cmp(ip6addr, &(destination_cache[i].destination_addr))) {
+    if (ip6_addr_eq(ip6addr, &(destination_cache[i].destination_addr))) {
       return i;
     }
   }
@@ -1647,7 +1662,7 @@
   for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) {
     if ((prefix_list[i].netif == netif) &&
         (prefix_list[i].invalidation_timer > 0) &&
-        ip6_addr_netcmp(ip6addr, &(prefix_list[i].prefix))) {
+        ip6_addr_net_eq(ip6addr, &(prefix_list[i].prefix))) {
       return 1;
     }
   }
@@ -1658,7 +1673,7 @@
   for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
         netif_ip6_addr_isstatic(netif, i) &&
-        ip6_addr_netcmp(ip6addr, netif_ip6_addr(netif, i))) {
+        ip6_addr_net_eq(ip6addr, netif_ip6_addr(netif, i))) {
       return 1;
     }
   }
@@ -1762,7 +1777,7 @@
    * matches. Pick the first one that is associated with a suitable netif. */
   for (i = 0; i < LWIP_ND6_NUM_PREFIXES; ++i) {
     netif = prefix_list[i].netif;
-    if ((netif != NULL) && ip6_addr_netcmp(&prefix_list[i].prefix, ip6addr) &&
+    if ((netif != NULL) && ip6_addr_net_eq(&prefix_list[i].prefix, ip6addr) &&
         netif_is_up(netif) && netif_is_link_up(netif)) {
       return netif;
     }
@@ -1797,7 +1812,7 @@
   for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {
     if ((default_router_list[i].neighbor_entry != NULL) &&
         ((netif != NULL) ? netif == default_router_list[i].neighbor_entry->netif : 1) &&
-        ip6_addr_cmp(router_addr, &(default_router_list[i].neighbor_entry->next_hop_address))) {
+        ip6_addr_eq(router_addr, &(default_router_list[i].neighbor_entry->next_hop_address))) {
       return i;
     }
   }
@@ -1847,9 +1862,9 @@
   for (router_index = LWIP_ND6_NUM_ROUTERS - 1; router_index >= 0; router_index--) {
     /* check if router already exists (this is a special case for 2 netifs on the same subnet
        - e.g. wifi and cable) */
-    if(default_router_list[router_index].neighbor_entry == &(neighbor_cache[neighbor_index])){ 
-      return router_index; 
-    } 
+    if(default_router_list[router_index].neighbor_entry == &(neighbor_cache[neighbor_index])){
+      return router_index;
+    }
     if (default_router_list[router_index].neighbor_entry == NULL) {
       /* remember lowest free index to create a new entry */
       free_router_index = router_index;
@@ -1883,7 +1898,7 @@
 
   /* Look for prefix in list. */
   for (i = 0; i < LWIP_ND6_NUM_PREFIXES; ++i) {
-    if ((ip6_addr_netcmp(&(prefix_list[i].prefix), prefix)) &&
+    if ((ip6_addr_net_eq(&(prefix_list[i].prefix), prefix)) &&
         (prefix_list[i].netif == netif)) {
       return i;
     }
@@ -1940,6 +1955,7 @@
 #endif /* LWIP_HOOK_ND6_GET_GW */
   s8_t i;
   s16_t dst_idx;
+  struct nd6_destination_cache_entry *dest;
 
   IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif);
 
@@ -1953,8 +1969,11 @@
   }
 #endif /* LWIP_NETIF_HWADDRHINT */
 
+  LWIP_ASSERT("sane cache index", nd6_cached_destination_index < LWIP_ND6_NUM_DESTINATIONS);
+
   /* Look for ip6addr in destination cache. */
-  if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) {
+  dest = &destination_cache[nd6_cached_destination_index];
+  if (ip6_addr_eq(ip6addr, &dest->destination_addr)) {
     /* the cached entry index is the right one! */
     /* do nothing. */
     ND6_STATS_INC(nd6.cachehit);
@@ -1965,6 +1984,7 @@
       /* found destination entry. make it our new cached index. */
       LWIP_ASSERT("type overflow", (size_t)dst_idx < NETIF_ADDR_IDX_MAX);
       nd6_cached_destination_index = (netif_addr_idx_t)dst_idx;
+      dest = &destination_cache[dst_idx];
     } else {
       /* Not found. Create a new destination entry. */
       dst_idx = nd6_new_destination_cache_entry();
@@ -1972,72 +1992,71 @@
         /* got new destination entry. make it our new cached index. */
         LWIP_ASSERT("type overflow", (size_t)dst_idx < NETIF_ADDR_IDX_MAX);
         nd6_cached_destination_index = (netif_addr_idx_t)dst_idx;
+        dest = &destination_cache[dst_idx];
       } else {
         /* Could not create a destination cache entry. */
         return ERR_MEM;
       }
 
       /* Copy dest address to destination cache. */
-      ip6_addr_set(&(destination_cache[nd6_cached_destination_index].destination_addr), ip6addr);
+      ip6_addr_set(&dest->destination_addr, ip6addr);
 
       /* Now find the next hop. is it a neighbor? */
       if (ip6_addr_islinklocal(ip6addr) ||
           nd6_is_prefix_in_netif(ip6addr, netif)) {
         /* Destination in local link. */
-        destination_cache[nd6_cached_destination_index].pmtu = netif_mtu6(netif);
-        ip6_addr_copy(destination_cache[nd6_cached_destination_index].next_hop_addr, destination_cache[nd6_cached_destination_index].destination_addr);
+        dest->pmtu = netif_mtu6(netif);
+        ip6_addr_copy(dest->next_hop_addr, dest->destination_addr);
 #ifdef LWIP_HOOK_ND6_GET_GW
       } else if ((next_hop_addr = LWIP_HOOK_ND6_GET_GW(netif, ip6addr)) != NULL) {
         /* Next hop for destination provided by hook function. */
-        destination_cache[nd6_cached_destination_index].pmtu = netif->mtu;
-        ip6_addr_set(&destination_cache[nd6_cached_destination_index].next_hop_addr, next_hop_addr);
+        dest->pmtu = netif->mtu;
+        ip6_addr_set(&dest->next_hop_addr, next_hop_addr);
 #endif /* LWIP_HOOK_ND6_GET_GW */
       } else {
         /* We need to select a router. */
         i = nd6_select_router(ip6addr, netif);
         if (i < 0) {
           /* No router found. */
-          ip6_addr_set_any(&(destination_cache[nd6_cached_destination_index].destination_addr));
+          ip6_addr_set_any(&dest->destination_addr);
           return ERR_RTE;
         }
-        destination_cache[nd6_cached_destination_index].pmtu = netif_mtu6(netif); /* Start with netif mtu, correct through ICMPv6 if necessary */
-        ip6_addr_copy(destination_cache[nd6_cached_destination_index].next_hop_addr, default_router_list[i].neighbor_entry->next_hop_address);
+        dest->pmtu = netif_mtu6(netif); /* Start with netif mtu, correct through ICMPv6 if necessary */
+        ip6_addr_copy(dest->next_hop_addr, default_router_list[i].neighbor_entry->next_hop_address);
       }
     }
-  }
-
 #if LWIP_NETIF_HWADDRHINT
-  if (netif->hints != NULL) {
-    /* per-pcb cached entry was given */
-    netif->hints->addr_hint = nd6_cached_destination_index;
-  }
+    if (netif->hints != NULL) {
+      /* per-pcb cached entry was given */
+      netif->hints->addr_hint = nd6_cached_destination_index;
+    }
 #endif /* LWIP_NETIF_HWADDRHINT */
+  }
 
   /* Look in neighbor cache for the next-hop address. */
-  if (ip6_addr_cmp(&(destination_cache[nd6_cached_destination_index].next_hop_addr),
-                   &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) {
+  if (ip6_addr_eq(&dest->next_hop_addr,
+                   &(neighbor_cache[dest->cached_neighbor_idx].next_hop_address))) {
     /* Cache hit. */
     /* Do nothing. */
     ND6_STATS_INC(nd6.cachehit);
   } else {
-    i = nd6_find_neighbor_cache_entry(&(destination_cache[nd6_cached_destination_index].next_hop_addr));
+    i = nd6_find_neighbor_cache_entry(&dest->next_hop_addr);
     if (i >= 0) {
       /* Found a matching record, make it new cached entry. */
-      nd6_cached_neighbor_index = i;
+      dest->cached_neighbor_idx = i;
     } else {
       /* Neighbor not in cache. Make a new entry. */
       i = nd6_new_neighbor_cache_entry();
       if (i >= 0) {
         /* got new neighbor entry. make it our new cached index. */
-        nd6_cached_neighbor_index = i;
+        dest->cached_neighbor_idx = i;
       } else {
         /* Could not create a neighbor cache entry. */
         return ERR_MEM;
       }
 
       /* Initialize fields. */
-      ip6_addr_copy(neighbor_cache[i].next_hop_address,
-                   destination_cache[nd6_cached_destination_index].next_hop_addr);
+      ip6_addr_copy(neighbor_cache[i].next_hop_address, dest->next_hop_addr);
       neighbor_cache[i].isrouter = 0;
       neighbor_cache[i].netif = netif;
       neighbor_cache[i].state = ND6_INCOMPLETE;
@@ -2047,9 +2066,9 @@
   }
 
   /* Reset this destination's age. */
-  destination_cache[nd6_cached_destination_index].age = 0;
+  dest->age = 0;
 
-  return nd6_cached_neighbor_index;
+  return dest->cached_neighbor_idx;
 }
 
 /**
@@ -2109,7 +2128,11 @@
     /* queue packet ... */
 #if LWIP_ND6_QUEUEING
     /* allocate a new nd6 queue entry */
-    new_entry = (struct nd6_q_entry *)memp_malloc(MEMP_ND6_QUEUE);
+    new_entry = NULL;
+    if (nd6_queue_size < MEMP_NUM_ND6_QUEUE) {
+      new_entry = (struct nd6_q_entry *)memp_malloc(MEMP_ND6_QUEUE);
+      nd6_queue_size++;
+    }
     if ((new_entry == NULL) && (neighbor_cache[neighbor_index].q != NULL)) {
       /* Free oldest packet (as per RFC recommendation) */
       r = neighbor_cache[neighbor_index].q;
@@ -2117,6 +2140,7 @@
       r->next = NULL;
       nd6_free_q(r);
       new_entry = (struct nd6_q_entry *)memp_malloc(MEMP_ND6_QUEUE);
+      nd6_queue_size++;
     }
     if (new_entry != NULL) {
       new_entry->next = NULL;
@@ -2175,6 +2199,7 @@
     LWIP_ASSERT("r->p != NULL", (r->p != NULL));
     pbuf_free(r->p);
     memp_free(MEMP_ND6_QUEUE, r);
+    nd6_queue_size--;
   }
 }
 #endif /* LWIP_ND6_QUEUEING */
@@ -2215,6 +2240,7 @@
     pbuf_free(q->p);
     /* now queue entry can be freed */
     memp_free(MEMP_ND6_QUEUE, q);
+    nd6_queue_size--;
   }
 #else /* LWIP_ND6_QUEUEING */
   if (neighbor_cache[i].q != NULL) {
@@ -2331,9 +2357,10 @@
 {
   s8_t i;
   s16_t dst_idx;
+  struct nd6_destination_cache_entry *dest;
 
   /* Find destination in cache. */
-  if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) {
+  if (ip6_addr_eq(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) {
     dst_idx = nd6_cached_destination_index;
     ND6_STATS_INC(nd6.cachehit);
   } else {
@@ -2344,11 +2371,12 @@
   }
 
   /* Find next hop neighbor in cache. */
-  if (ip6_addr_cmp(&(destination_cache[dst_idx].next_hop_addr), &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) {
-    i = nd6_cached_neighbor_index;
+  dest = &destination_cache[dst_idx];
+  if (ip6_addr_eq(&dest->next_hop_addr, &(neighbor_cache[dest->cached_neighbor_idx].next_hop_address))) {
+    i = dest->cached_neighbor_idx;
     ND6_STATS_INC(nd6.cachehit);
   } else {
-    i = nd6_find_neighbor_cache_entry(&(destination_cache[dst_idx].next_hop_addr));
+    i = nd6_find_neighbor_cache_entry(&dest->next_hop_addr);
   }
   if (i < 0) {
     return;
diff --git a/src/core/mem.c b/src/core/mem.c
index 315fb3c..8566edc 100644
--- a/src/core/mem.c
+++ b/src/core/mem.c
@@ -688,7 +688,7 @@
 /**
  * Shrink memory returned by mem_malloc().
  *
- * @param rmem pointer to memory allocated by mem_malloc the is to be shrinked
+ * @param rmem pointer to memory allocated by mem_malloc the is to be shrunk
  * @param new_size required size after shrinking (needs to be smaller than or
  *                equal to the previous size)
  * @return for compatibility reasons: is always == rmem, at the moment
@@ -757,7 +757,7 @@
     LWIP_ASSERT("invalid next ptr", mem->next != MEM_SIZE_ALIGNED);
     /* remember the old next pointer */
     next = mem2->next;
-    /* create new struct mem which is moved directly after the shrinked mem */
+    /* create new struct mem which is moved directly after the shrunk mem */
     ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + newsize);
     if (lfree == mem2) {
       lfree = ptr_to_mem(ptr2);
diff --git a/src/core/netif.c b/src/core/netif.c
index 088b50e..d3a0677 100644
--- a/src/core/netif.c
+++ b/src/core/netif.c
@@ -80,6 +80,9 @@
 #if LWIP_DHCP
 #include "lwip/dhcp.h"
 #endif /* LWIP_DHCP */
+#if LWIP_ACD
+#include "lwip/acd.h"
+#endif /* LWIP_ACD */
 #if LWIP_IPV6_DHCP6
 #include "lwip/dhcp6.h"
 #endif /* LWIP_IPV6_DHCP6 */
@@ -140,6 +143,14 @@
 
 static struct netif loop_netif;
 
+#if LWIP_TESTMODE
+struct netif* netif_get_loopif(void)
+{
+  return &loop_netif;
+}
+#endif
+
+
 /**
  * Initialize a lwip network interface structure for a loopback interface
  *
@@ -256,16 +267,16 @@
  * @param state opaque data passed to the new netif
  * @param init callback function that initializes the interface
  * @param input callback function that is called to pass
- * ingress packets up in the protocol layer stack.\n
+ * ingress packets up in the protocol layer stack.<br>
  * It is recommended to use a function that passes the input directly
  * to the stack (netif_input(), NO_SYS=1 mode) or via sending a
- * message to TCPIP thread (tcpip_input(), NO_SYS=0 mode).\n
+ * message to TCPIP thread (tcpip_input(), NO_SYS=0 mode).<br>
  * These functions use netif flags NETIF_FLAG_ETHARP and NETIF_FLAG_ETHERNET
  * to decide whether to forward to ethernet_input() or ip_input().
  * In other words, the functions only work when the netif
- * driver is implemented correctly!\n
+ * driver is implemented correctly!<br>
  * Most members of struct netif should be be initialized by the
- * netif init function = netif driver (init parameter of this function).\n
+ * netif init function = netif driver (init parameter of this function).<br>
  * IPv6: Don't forget to call netif_create_ip6_linklocal_address() after
  * setting the MAC address in struct netif.hwaddr
  * (IPv6 requires a link-local address).
@@ -331,8 +342,8 @@
 #endif /* LWIP_NUM_NETIF_CLIENT_DATA */
 #if LWIP_IPV6
 #if LWIP_IPV6_AUTOCONFIG
-  /* IPv6 address autoconfiguration not enabled by default */
-  netif->ip6_autoconfig_enabled = 0;
+  /* IPv6 address autoconfiguration should be enabled by default */
+  netif->ip6_autoconfig_enabled = 1;
 #endif /* LWIP_IPV6_AUTOCONFIG */
   nd6_restart_netif(netif);
 #endif /* LWIP_IPV6 */
@@ -354,6 +365,9 @@
   netif->num = netif_num;
   netif->input = input;
 
+#if LWIP_ACD
+  netif->acd_list = NULL;
+#endif /* LWIP_ACD */
   NETIF_RESET_HINTS(netif);
 #if ENABLE_LOOPBACK
   netif->loop_first = NULL;
@@ -463,7 +477,7 @@
   LWIP_ASSERT("invalid pointer", old_addr != NULL);
 
   /* address is actually being changed? */
-  if (ip4_addr_cmp(ipaddr, netif_ip4_addr(netif)) == 0) {
+  if (ip4_addr_eq(ipaddr, netif_ip4_addr(netif)) == 0) {
     ip_addr_t new_addr;
     *ip_2_ip4(&new_addr) = *ipaddr;
     IP_SET_TYPE_VAL(new_addr, IPADDR_TYPE_V4);
@@ -473,6 +487,10 @@
     LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n"));
     netif_do_ip_addr_changed(old_addr, &new_addr);
 
+#if LWIP_ACD
+    acd_netif_ip_addr_changed(netif, old_addr, &new_addr);
+#endif /* LWIP_ACD */
+
     mib2_remove_ip4(netif);
     mib2_remove_route_ip4(0, netif);
     /* set new IP address to netif */
@@ -526,7 +544,7 @@
 netif_do_set_netmask(struct netif *netif, const ip4_addr_t *netmask, ip_addr_t *old_nm)
 {
   /* address is actually being changed? */
-  if (ip4_addr_cmp(netmask, netif_ip4_netmask(netif)) == 0) {
+  if (ip4_addr_eq(netmask, netif_ip4_netmask(netif)) == 0) {
 #if LWIP_NETIF_EXT_STATUS_CALLBACK
     LWIP_ASSERT("invalid pointer", old_nm != NULL);
     ip_addr_copy(*old_nm, *netif_ip_netmask4(netif));
@@ -590,7 +608,7 @@
 netif_do_set_gw(struct netif *netif, const ip4_addr_t *gw, ip_addr_t *old_gw)
 {
   /* address is actually being changed? */
-  if (ip4_addr_cmp(gw, netif_ip4_gw(netif)) == 0) {
+  if (ip4_addr_eq(gw, netif_ip4_gw(netif)) == 0) {
 #if LWIP_NETIF_EXT_STATUS_CALLBACK
     LWIP_ASSERT("invalid pointer", old_gw != NULL);
     ip_addr_copy(*old_gw, *netif_ip_gw4(netif));
@@ -724,6 +742,12 @@
 #if LWIP_NETIF_EXT_STATUS_CALLBACK
   if (change_reason != LWIP_NSC_NONE) {
     change_reason |= LWIP_NSC_IPV4_SETTINGS_CHANGED;
+  }
+  if (!remove) {
+    /* Issue a callback even if the address hasn't changed, eg. DHCP reboot */
+    change_reason |= LWIP_NSC_IPV4_ADDR_VALID;
+  }
+  if (change_reason != LWIP_NSC_NONE) {
     netif_invoke_ext_callback(netif, change_reason, &cb_args);
   }
 #endif
@@ -888,8 +912,11 @@
 #if LWIP_IPV4
   if ((report_type & NETIF_REPORT_TYPE_IPV4) &&
       !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
-#if LWIP_ARP
-    /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
+#if LWIP_ARP && !LWIP_ACD
+    /* For Ethernet network interfaces:
+     * we would like to send a "gratuitous ARP".
+     * Only needs to be done here if ACD isn't configured.
+     */
     if (netif->flags & (NETIF_FLAG_ETHARP)) {
       etharp_gratuitous(netif);
     }
@@ -998,11 +1025,11 @@
     netif_set_flags(netif, NETIF_FLAG_LINK_UP);
 
 #if LWIP_DHCP
-    dhcp_network_changed(netif);
+    dhcp_network_changed_link_up(netif);
 #endif /* LWIP_DHCP */
 
 #if LWIP_AUTOIP
-    autoip_network_changed(netif);
+    autoip_network_changed_link_up(netif);
 #endif /* LWIP_AUTOIP */
 
     netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
@@ -1034,6 +1061,15 @@
 
   if (netif->flags & NETIF_FLAG_LINK_UP) {
     netif_clear_flags(netif, NETIF_FLAG_LINK_UP);
+
+#if LWIP_AUTOIP
+    autoip_network_changed_link_down(netif);
+#endif /* LWIP_AUTOIP */
+
+#if LWIP_ACD
+    acd_network_changed_link_down(netif);
+#endif /* LWIP_ACD */
+
 #if LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES
     netif->mtu6 = netif->mtu;
 #endif
@@ -1496,7 +1532,7 @@
 
   for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
     if (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, i)) &&
-        ip6_addr_cmp_zoneless(netif_ip6_addr(netif, i), ip6addr)) {
+        ip6_addr_zoneless_eq(netif_ip6_addr(netif, i), ip6addr)) {
       return i;
     }
   }
@@ -1552,7 +1588,7 @@
   /* Set a link-local zone. Even though the zone is implied by the owning
    * netif, setting the zone anyway has two important conceptual advantages:
    * 1) it avoids the need for a ton of exceptions in internal code, allowing
-   *    e.g. ip6_addr_cmp() to be used on local addresses;
+   *    e.g. ip6_addr_eq() to be used on local addresses;
    * 2) the properly zoned address is visible externally, e.g. when any outside
    *    code enumerates available addresses or uses one to bind a socket.
    * Any external code unaware of address scoping is likely to just ignore the
@@ -1789,11 +1825,11 @@
       if (iter == callback) {
         LWIP_ASSERT("last != NULL", last != NULL);
         last->next = callback->next;
-        callback->next = NULL;
-        return;
+        break;
       }
     }
   }
+  callback->next = NULL;
 }
 
 /**
@@ -1810,8 +1846,10 @@
   LWIP_ASSERT("netif must be != NULL", netif != NULL);
 
   while (callback != NULL) {
+    /* cache next pointer: the callback might unregister itself */
+    netif_ext_callback_t *next = callback->next;
     callback->callback_fn(netif, reason, args);
-    callback = callback->next;
+    callback = next;
   }
 }
 #endif /* LWIP_NETIF_EXT_STATUS_CALLBACK */
diff --git a/src/core/pbuf.c b/src/core/pbuf.c
index 7638dfd..1fb64d4 100644
--- a/src/core/pbuf.c
+++ b/src/core/pbuf.c
@@ -441,8 +441,11 @@
 #endif /* LWIP_SUPPORT_CUSTOM_PBUF */
      ) {
     /* reallocate and adjust the length of the pbuf that will be split */
-    q = (struct pbuf *)mem_trim(q, (mem_size_t)(((u8_t *)q->payload - (u8_t *)q) + rem_len));
-    LWIP_ASSERT("mem_trim returned q == NULL", q != NULL);
+    struct pbuf *r = (struct pbuf *)mem_trim(q, (mem_size_t)(((u8_t *)q->payload - (u8_t *)q) + rem_len));
+    LWIP_ASSERT("mem_trim returned r == NULL", r != NULL);
+    /* help to detect faulty overridden implementation of mem_trim */
+    LWIP_ASSERT("mem_trim returned r != q", r == q);
+    LWIP_UNUSED_ARG(r);
   }
   /* adjust length fields for new last pbuf */
   q->len = rem_len;
@@ -677,7 +680,7 @@
       struct pbuf *f = p;
       free_left = (u16_t)(free_left - p->len);
       p = p->next;
-      f->next = 0;
+      f->next = NULL;
       pbuf_free(f);
     } else {
       pbuf_remove_header(p, free_left);
@@ -705,7 +708,6 @@
  * @return the number of pbufs that were de-allocated
  * from the head of the chain.
  *
- * @note MUST NOT be called on a packet queue (Not verified to work yet).
  * @note the reference counter of a pbuf equals the number of pointers
  * that refer to the pbuf (or into the pbuf).
  *
@@ -941,12 +943,7 @@
 
 /**
  * @ingroup pbuf
- * Create PBUF_RAM copies of pbufs.
- *
- * Used to queue packets on behalf of the lwIP stack, such as
- * ARP based queueing.
- *
- * @note You MUST explicitly use p = pbuf_take(p);
+ * Copy the contents of one packet buffer into another.
  *
  * @note Only one packet is copied, no packet queue!
  *
@@ -956,6 +953,7 @@
  * @return ERR_OK if pbuf was copied
  *         ERR_ARG if one of the pbufs is NULL or p_to is not big
  *                 enough to hold p_from
+ *         ERR_VAL if any of the pbufs are part of a queue
  */
 err_t
 pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from)
@@ -987,8 +985,7 @@
 err_t
 pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset)
 {
-  size_t offset_to = offset, offset_from = 0, len_calc;
-  u16_t len;
+  size_t offset_to = offset, offset_from = 0, len;
 
   LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy_partial_pbuf(%p, %p, %"U16_F", %"U16_F")\n",
               (const void *)p_to, (const void *)p_from, copy_len, offset));
@@ -1005,16 +1002,16 @@
     /* copy one part of the original chain */
     if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
       /* complete current p_from fits into current p_to */
-      len_calc = p_from->len - offset_from;
+      len = p_from->len - offset_from;
     } else {
       /* current p_from does not fit into current p_to */
-      len_calc = p_to->len - offset_to;
+      len = p_to->len - offset_to;
     }
-    len = (u16_t)LWIP_MIN(copy_len, len_calc);
+    len = LWIP_MIN(copy_len, len);
     MEMCPY((u8_t *)p_to->payload + offset_to, (u8_t *)p_from->payload + offset_from, len);
     offset_to += len;
     offset_from += len;
-    copy_len -= len;
+    copy_len = (u16_t)(copy_len - len);
     LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
     LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
     if (offset_from >= p_from->len) {
@@ -1206,7 +1203,7 @@
  * @param in input pbuf
  * @param in_offset offset to skip
  * @param out_offset resulting offset in the returned pbuf
- * @return the pbuf in the queue where the offset is
+ * @return the pbuf in the queue where the offset is or NULL when the offset is too high
  */
 struct pbuf *
 pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset)
diff --git a/src/core/raw.c b/src/core/raw.c
index 3b34544..d85aaec 100644
--- a/src/core/raw.c
+++ b/src/core/raw.c
@@ -2,14 +2,14 @@
  * @file
  * Implementation of raw protocol PCBs for low-level handling of
  * different types of protocols besides (or overriding) those
- * already available in lwIP.\n
+ * already available in lwIP.<br>
  * See also @ref raw_raw
  *
  * @defgroup raw_raw RAW
  * @ingroup callbackstyle_api
  * Implementation of raw protocol PCBs for low-level handling of
  * different types of protocols besides (or overriding) those
- * already available in lwIP.\n
+ * already available in lwIP.<br>
  * @see @ref api
  */
 
@@ -106,7 +106,7 @@
 #endif /* LWIP_IPV4 */
       /* Handle IPv4 and IPv6: catch all or exact match */
       if (ip_addr_isany(&pcb->local_ip) ||
-          ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
+          ip_addr_eq(&pcb->local_ip, ip_current_dest_addr())) {
         return 1;
       }
   }
@@ -166,7 +166,7 @@
   while (pcb != NULL) {
     if ((pcb->protocol == proto) && raw_input_local_match(pcb, broadcast) &&
         (((pcb->flags & RAW_FLAGS_CONNECTED) == 0) ||
-         ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()))) {
+         ip_addr_eq(&pcb->remote_ip, ip_current_src_addr()))) {
       /* receive callback function available? */
       if (pcb->recv != NULL) {
         u8_t eaten;
@@ -384,6 +384,7 @@
   if (netif == NULL) {
     LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: No route to "));
     ip_addr_debug_print(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ipaddr);
+    LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("\n"));
     return ERR_RTE;
   }
 
@@ -609,6 +610,7 @@
 #if LWIP_MULTICAST_TX_OPTIONS
     raw_set_multicast_ttl(pcb, RAW_TTL);
 #endif /* LWIP_MULTICAST_TX_OPTIONS */
+    pcb_tci_init(pcb);
     pcb->next = raw_pcbs;
     raw_pcbs = pcb;
   }
@@ -659,7 +661,7 @@
   if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) {
     for (rpcb = raw_pcbs; rpcb != NULL; rpcb = rpcb->next) {
       /* PCB bound to current local interface address? */
-      if (ip_addr_cmp(&rpcb->local_ip, old_addr)) {
+      if (ip_addr_eq(&rpcb->local_ip, old_addr)) {
         /* The PCB is bound to the old ipaddr and
          * is set to bound to the new one instead */
         ip_addr_copy(rpcb->local_ip, *new_addr);
diff --git a/src/core/stats.c b/src/core/stats.c
index 34e9b27..95445ec 100644
--- a/src/core/stats.c
+++ b/src/core/stats.c
@@ -166,4 +166,3 @@
 #endif /* LWIP_STATS_DISPLAY */
 
 #endif /* LWIP_STATS */
-
diff --git a/src/core/sys.c b/src/core/sys.c
index 5f08352..69d7197 100644
--- a/src/core/sys.c
+++ b/src/core/sys.c
@@ -45,30 +45,30 @@
  * No need to implement functions in this section in NO_SYS mode.
  * The OS-specific code should be implemented in arch/sys_arch.h
  * and sys_arch.c of your port.
- * 
+ *
  * The operating system emulation layer provides a common interface
  * between the lwIP code and the underlying operating system kernel. The
  * general idea is that porting lwIP to new architectures requires only
  * small changes to a few header files and a new sys_arch
  * implementation. It is also possible to do a sys_arch implementation
  * that does not rely on any underlying operating system.
- * 
+ *
  * The sys_arch provides semaphores, mailboxes and mutexes to lwIP. For the full
  * lwIP functionality, multiple threads support can be implemented in the
  * sys_arch, but this is not required for the basic lwIP
  * functionality. Timer scheduling is implemented in lwIP, but can be implemented
  * by the sys_arch port (LWIP_TIMERS_CUSTOM==1).
- * 
+ *
  * In addition to the source file providing the functionality of sys_arch,
  * the OS emulation layer must provide several header files defining
  * macros used throughout lwip.  The files required and the macros they
  * must define are listed below the sys_arch description.
- * 
+ *
  * Since lwIP 1.4.0, semaphore, mutexes and mailbox functions are prototyped in a way that
  * allows both using pointers or actual OS structures to be used. This way, memory
  * required for such types can be either allocated in place (globally or on the
  * stack) or on the heap (allocated internally in the "*_new()" functions).
- * 
+ *
  * Note:
  * -----
  * Be careful with using mem_malloc() in sys_arch. When malloc() refers to
@@ -96,7 +96,7 @@
  * Mailboxes should be implemented as a queue which allows multiple messages
  * to be posted (implementing as a rendez-vous point where only one message can be
  * posted at a time can have a highly negative impact on performance). A message
- * in a mailbox is just a pointer, nothing more. 
+ * in a mailbox is just a pointer, nothing more.
  *
  * @defgroup sys_time Time
  * @ingroup sys_layer
diff --git a/src/core/tcp.c b/src/core/tcp.c
index 371db2b..57af0a7 100644
--- a/src/core/tcp.c
+++ b/src/core/tcp.c
@@ -5,13 +5,13 @@
  *
  * @defgroup tcp_raw TCP
  * @ingroup callbackstyle_api
- * Transmission Control Protocol for IP\n
+ * Transmission Control Protocol for IP<br>
  * @see @ref api
  *
  * Common functions for the TCP implementation, such as functions
  * for manipulating the data structures and the TCP timer functions. TCP functions
- * related to input and output is found in tcp_in.c and tcp_out.c respectively.\n
- * 
+ * related to input and output is found in tcp_in.c and tcp_out.c respectively.<br>
+ *
  * TCP connection setup
  * --------------------
  * The functions used for setting up connections is similar to that of
@@ -24,7 +24,7 @@
  * - tcp_listen() and tcp_listen_with_backlog()
  * - tcp_accept()
  * - tcp_connect()
- * 
+ *
  * Sending TCP data
  * ----------------
  * TCP data is sent by enqueueing the data with a call to tcp_write() and
@@ -34,7 +34,7 @@
  * - tcp_write()
  * - tcp_output()
  * - tcp_sent()
- * 
+ *
  * Receiving TCP data
  * ------------------
  * TCP data reception is callback based - an application specified
@@ -44,7 +44,7 @@
  * window.
  * - tcp_recv()
  * - tcp_recved()
- * 
+ *
  * Application polling
  * -------------------
  * When a connection is idle (i.e., no data is either transmitted or
@@ -62,7 +62,7 @@
  * - tcp_close()
  * - tcp_abort()
  * - tcp_err()
- * 
+ *
  */
 
 /*
@@ -469,7 +469,7 @@
  * a closing state), the connection is closed, and put in a closing state.
  * The pcb is then automatically freed in tcp_slowtmr(). It is therefore
  * unsafe to reference it (unless an error is returned).
- * 
+ *
  * The function may return ERR_MEM if no memory
  * was available for closing the connection. If so, the application
  * should wait and try again either by using the acknowledgment
@@ -502,7 +502,7 @@
  * @ingroup tcp_raw
  * Causes all or part of a full-duplex connection of this PCB to be shut down.
  * This doesn't deallocate the PCB unless shutting down both sides!
- * Shutting down both sides is the same as calling tcp_close, so if it succeds
+ * Shutting down both sides is the same as calling tcp_close, so if it succeeds
  * (i.e. returns ER_OK), the PCB must not be referenced any more!
  *
  * @param pcb PCB to shutdown
@@ -728,7 +728,7 @@
             if ((IP_IS_V6(ipaddr) == IP_IS_V6_VAL(cpcb->local_ip)) &&
                 (ip_addr_isany(&cpcb->local_ip) ||
                  ip_addr_isany(ipaddr) ||
-                 ip_addr_cmp(&cpcb->local_ip, ipaddr))) {
+                 ip_addr_eq(&cpcb->local_ip, ipaddr))) {
               return ERR_USE;
             }
           }
@@ -798,7 +798,7 @@
  * When an incoming connection is accepted, the function specified with
  * the tcp_accept() function will be called. The pcb has to be bound
  * to a local port with the tcp_bind() function.
- * 
+ *
  * The tcp_listen() function returns a new connection identifier, and
  * the one passed as an argument to the function will be
  * deallocated. The reason for this behavior is that less memory is
@@ -813,7 +813,7 @@
  * The backlog limits the number of outstanding connections
  * in the listen queue to the value specified by the backlog argument.
  * To use it, your need to set TCP_LISTEN_BACKLOG=1 in your lwipopts.h.
- * 
+ *
  * @param pcb the original tcp_pcb
  * @param backlog the incoming connections queue limit
  * @return tcp_pcb used for listening, consumes less memory.
@@ -871,7 +871,7 @@
        this port is only used once for every local IP. */
     for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
       if ((lpcb->local_port == pcb->local_port) &&
-          ip_addr_cmp(&lpcb->local_ip, &pcb->local_ip)) {
+          ip_addr_eq(&lpcb->local_ip, &pcb->local_ip)) {
         /* this address/port is already used */
         lpcb = NULL;
         res = ERR_USE;
@@ -893,6 +893,9 @@
   lpcb->netif_idx = pcb->netif_idx;
   lpcb->ttl = pcb->ttl;
   lpcb->tos = pcb->tos;
+#if LWIP_VLAN_PCP
+  lpcb->netif_hints.tci = pcb->netif_hints.tci;
+#endif /* LWIP_VLAN_PCP */
 #if LWIP_IPV4 && LWIP_IPV6
   IP_SET_TYPE_VAL(lpcb->remote_ip, pcb->local_ip.type);
 #endif /* LWIP_IPV4 && LWIP_IPV6 */
@@ -1040,7 +1043,7 @@
  * Connects to another host. The function given as the "connected"
  * argument will be called when the connection has been established.
  *  Sets up the pcb to connect to the remote host and sends the
- * initial SYN segment which opens the connection. 
+ * initial SYN segment which opens the connection.
  *
  * The tcp_connect() function returns immediately; it does not wait for
  * the connection to be properly setup. Instead, it will call the
@@ -1059,7 +1062,7 @@
  * @param ipaddr the remote ip address to connect to
  * @param port the remote tcp port to connect to
  * @param connected callback function to call when connected (on error,
-                    the err calback will be called)
+                    the err callback will be called)
  * @return ERR_VAL if invalid arguments are given
  *         ERR_OK if connect request has been sent
  *         other err_t values if connect request couldn't be sent
@@ -1131,8 +1134,8 @@
         for (cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
           if ((cpcb->local_port == pcb->local_port) &&
               (cpcb->remote_port == port) &&
-              ip_addr_cmp(&cpcb->local_ip, &pcb->local_ip) &&
-              ip_addr_cmp(&cpcb->remote_ip, ipaddr)) {
+              ip_addr_eq(&cpcb->local_ip, &pcb->local_ip) &&
+              ip_addr_eq(&cpcb->remote_ip, ipaddr)) {
             /* linux returns EISCONN here, but ERR_USE should be OK for us */
             return ERR_USE;
           }
@@ -1212,9 +1215,9 @@
   }
   while (pcb != NULL) {
     LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
-    LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
-    LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
-    LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
+    LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED", pcb->state != CLOSED);
+    LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN", pcb->state != LISTEN);
+    LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
     if (pcb->last_timer == tcp_timer_ctr) {
       /* skip this pcb, we have already processed it */
       prev = pcb;
@@ -1635,7 +1638,7 @@
 }
 
 /**
- * @ingroup tcp
+ * @ingroup tcp_raw
  * Sets the priority of a connection.
  *
  * @param pcb the tcp_pcb to manipulate
@@ -1712,14 +1715,14 @@
 
   mprio = LWIP_MIN(TCP_PRIO_MAX, prio);
 
-  /* We want to kill connections with a lower prio, so bail out if 
+  /* We want to kill connections with a lower prio, so bail out if
    * supplied prio is 0 - there can never be a lower prio
    */
   if (mprio == 0) {
     return;
   }
 
-  /* We only want kill connections with a lower prio, so decrement prio by one 
+  /* We only want kill connections with a lower prio, so decrement prio by one
    * and start searching for oldest connection with same or lower priority than mprio.
    * We want to find the connections with the lowest possible prio, and among
    * these the one with the longest inactivity time.
@@ -1898,14 +1901,16 @@
     /* As initial send MSS, we use TCP_MSS but limit it to 536.
        The send MSS is updated when an MSS option is received. */
     pcb->mss = INITIAL_MSS;
-    pcb->rto = 3000 / TCP_SLOW_INTERVAL;
-    pcb->sv = 3000 / TCP_SLOW_INTERVAL;
+    /* Set initial TCP's retransmission timeout to 3000 ms by default.
+       This value could be configured in lwipopts */
+    pcb->rto = LWIP_TCP_RTO_TIME / TCP_SLOW_INTERVAL;
+    pcb->sv = LWIP_TCP_RTO_TIME / TCP_SLOW_INTERVAL;
     pcb->rtime = -1;
     pcb->cwnd = 1;
     pcb->tmr = tcp_ticks;
     pcb->last_timer = tcp_timer_ctr;
 
-    /* RFC 5681 recommends setting ssthresh abritrarily high and gives an example
+    /* RFC 5681 recommends setting ssthresh arbitrarily high and gives an example
     of using the largest advertised receive window.  We've seen complications with
     receiving TCPs that use window scaling and/or window auto-tuning where the
     initial advertised window is very small and then grows rapidly once the
@@ -1924,6 +1929,7 @@
     pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
     pcb->keep_cnt   = TCP_KEEPCNT_DEFAULT;
 #endif /* LWIP_TCP_KEEPALIVE */
+    pcb_tci_init(pcb);
   }
   return pcb;
 }
@@ -2044,7 +2050,7 @@
  * @ingroup tcp_raw
  * Used to specify the function that should be called when a fatal error
  * has occurred on the connection.
- * 
+ *
  * If a connection is aborted because of an error, the application is
  * alerted of this event by the err callback. Errors that might abort a
  * connection are when there is a shortage of memory. The callback
@@ -2095,7 +2101,7 @@
  * number of TCP coarse grained timer shots, which typically occurs
  * twice a second. An interval of 10 means that the application would
  * be polled every 5 seconds.
- * 
+ *
  * When a connection is idle (i.e., no data is either transmitted or
  * received), lwIP will repeatedly poll the application by calling a
  * specified callback function. This can be used either as a watchdog
@@ -2309,7 +2315,7 @@
 
   while (pcb != NULL) {
     /* PCB bound to current local interface address? */
-    if (ip_addr_cmp(&pcb->local_ip, old_addr)
+    if (ip_addr_eq(&pcb->local_ip, old_addr)
 #if LWIP_AUTOIP
         /* connections to link-local addresses must persist (RFC3927 ch. 1.9) */
         && (!IP_IS_V4_VAL(pcb->local_ip) || !ip4_addr_islinklocal(ip_2_ip4(&pcb->local_ip)))
@@ -2344,7 +2350,7 @@
       /* PCB bound to current local interface address? */
       for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
         /* PCB bound to current local interface address? */
-        if (ip_addr_cmp(&lpcb->local_ip, old_addr)) {
+        if (ip_addr_eq(&lpcb->local_ip, old_addr)) {
           /* The PCB is listening to the old ipaddr and
             * is set to listen to the new one instead */
           ip_addr_copy(lpcb->local_ip, *new_addr);
@@ -2537,7 +2543,7 @@
 /**
  * @defgroup tcp_raw_extargs ext arguments
  * @ingroup tcp_raw
- * Additional data storage per tcp pcb\n
+ * Additional data storage per tcp pcb<br>
  * @see @ref tcp_raw
  *
  * When LWIP_TCP_PCB_NUM_EXT_ARGS is > 0, every tcp pcb (including listen pcb)
@@ -2595,7 +2601,7 @@
  * @param callbacks callback table (const since it is referenced, not copied!)
  */
 void
-tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, uint8_t id, const struct tcp_ext_arg_callbacks * const callbacks)
+tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, u8_t id, const struct tcp_ext_arg_callbacks * const callbacks)
 {
   LWIP_ASSERT("pcb != NULL", pcb != NULL);
   LWIP_ASSERT("id < LWIP_TCP_PCB_NUM_EXT_ARGS", id < LWIP_TCP_PCB_NUM_EXT_ARGS);
@@ -2614,7 +2620,7 @@
  * @param id ext_args index to set (allocated via @ref tcp_ext_arg_alloc_id)
  * @param arg data pointer to set
  */
-void tcp_ext_arg_set(struct tcp_pcb *pcb, uint8_t id, void *arg)
+void tcp_ext_arg_set(struct tcp_pcb *pcb, u8_t id, void *arg)
 {
   LWIP_ASSERT("pcb != NULL", pcb != NULL);
   LWIP_ASSERT("id < LWIP_TCP_PCB_NUM_EXT_ARGS", id < LWIP_TCP_PCB_NUM_EXT_ARGS);
@@ -2632,7 +2638,7 @@
  * @param id ext_args index to set (allocated via @ref tcp_ext_arg_alloc_id)
  * @return data pointer at the given index
  */
-void *tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id)
+void *tcp_ext_arg_get(const struct tcp_pcb *pcb, u8_t id)
 {
   LWIP_ASSERT("pcb != NULL", pcb != NULL);
   LWIP_ASSERT("id < LWIP_TCP_PCB_NUM_EXT_ARGS", id < LWIP_TCP_PCB_NUM_EXT_ARGS);
diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c
index 2202e38..c7a1f7b 100644
--- a/src/core/tcp_in.c
+++ b/src/core/tcp_in.c
@@ -261,8 +261,8 @@
 
     if (pcb->remote_port == tcphdr->src &&
         pcb->local_port == tcphdr->dest &&
-        ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
-        ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
+        ip_addr_eq(&pcb->remote_ip, ip_current_src_addr()) &&
+        ip_addr_eq(&pcb->local_ip, ip_current_dest_addr())) {
       /* Move this PCB to the front of the list so that subsequent
          lookups will be faster (we exploit locality in TCP segment
          arrivals). */
@@ -294,8 +294,8 @@
 
       if (pcb->remote_port == tcphdr->src &&
           pcb->local_port == tcphdr->dest &&
-          ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
-          ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
+          ip_addr_eq(&pcb->remote_ip, ip_current_src_addr()) &&
+          ip_addr_eq(&pcb->local_ip, ip_current_dest_addr())) {
         /* We don't really care enough to move this PCB to the front
            of the list since we are not very likely to receive that
            many segments for connections in TIME-WAIT. */
@@ -333,7 +333,7 @@
           break;
 #endif /* SO_REUSE */
         } else if (IP_ADDR_PCB_VERSION_MATCH_EXACT(lpcb, ip_current_dest_addr())) {
-          if (ip_addr_cmp(&lpcb->local_ip, ip_current_dest_addr())) {
+          if (ip_addr_eq(&lpcb->local_ip, ip_current_dest_addr())) {
             /* found an exact match */
             break;
           } else if (ip_addr_isany(&lpcb->local_ip)) {
@@ -576,7 +576,7 @@
     if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
       TCP_STATS_INC(tcp.proterr);
       TCP_STATS_INC(tcp.drop);
-      tcp_rst(NULL, ackno, seqno + tcplen, ip_current_dest_addr(),
+      tcp_rst_netif(ip_data.current_input_netif, ackno, seqno + tcplen, ip_current_dest_addr(),
               ip_current_src_addr(), tcphdr->dest, tcphdr->src);
     }
     pbuf_free(p);
@@ -592,7 +592,7 @@
 }
 
 /** Called from tcp_input to check for TF_CLOSED flag. This results in closing
- * and deallocating a pcb at the correct place to ensure noone references it
+ * and deallocating a pcb at the correct place to ensure no one references it
  * any more.
  * @returns 1 if the pcb has been closed and deallocated, 0 otherwise
  */
@@ -646,7 +646,7 @@
     /* For incoming segments with the ACK flag set, respond with a
        RST. */
     LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n"));
-    tcp_rst((const struct tcp_pcb *)pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
+    tcp_rst_netif(ip_data.current_input_netif, ackno, seqno + tcplen, ip_current_dest_addr(),
             ip_current_src_addr(), tcphdr->dest, tcphdr->src);
   } else if (flags & TCP_SYN) {
     LWIP_DEBUGF(TCP_DEBUG, ("TCP connection request %"U16_F" -> %"U16_F".\n", tcphdr->src, tcphdr->dest));
@@ -690,6 +690,9 @@
 #if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
     npcb->listener = pcb;
 #endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */
+#if LWIP_VLAN_PCP
+    npcb->netif_hints.tci = pcb->netif_hints.tci;
+#endif /* LWIP_VLAN_PCP */
     /* inherit socket options */
     npcb->so_options = pcb->so_options & SOF_INHERITED;
     npcb->netif_idx = pcb->netif_idx;
@@ -849,6 +852,13 @@
 
   tcp_parseopt(pcb);
 
+  if (flags & TCP_SYN) {
+    /* accept SYN only in 2 states: */
+    if ((pcb->state != SYN_SENT) && (pcb->state != SYN_RCVD)) {
+      return ERR_OK;
+    }
+  }
+
   /* Do different things depending on the TCP state. */
   switch (pcb->state) {
     case SYN_SENT:
@@ -921,7 +931,12 @@
       }
       break;
     case SYN_RCVD:
-      if (flags & TCP_ACK) {
+      if (flags & TCP_SYN) {
+        if (seqno == pcb->rcv_nxt - 1) {
+          /* Looks like another copy of the SYN - retransmit our SYN-ACK */
+          tcp_rexmit(pcb);
+        }
+      } else if (flags & TCP_ACK) {
         /* expected ACK number? */
         if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
           pcb->state = ESTABLISHED;
@@ -972,9 +987,6 @@
           tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(),
                   ip_current_src_addr(), tcphdr->dest, tcphdr->src);
         }
-      } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {
-        /* Looks like another copy of the SYN - retransmit our SYN-ACK */
-        tcp_rexmit(pcb);
       }
       break;
     case CLOSE_WAIT:
@@ -1143,7 +1155,6 @@
 {
   s16_t m;
   u32_t right_wnd_edge;
-  int found_dupack = 0;
 
   LWIP_ASSERT("tcp_receive: invalid pcb", pcb != NULL);
   LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
@@ -1205,7 +1216,6 @@
           if (pcb->rtime >= 0) {
             /* Clause 5 */
             if (pcb->lastack == ackno) {
-              found_dupack = 1;
               if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) {
                 ++pcb->dupacks;
               }
@@ -1221,11 +1231,6 @@
           }
         }
       }
-      /* If Clause (1) or more is true, but not a duplicate ack, reset
-       * count of consecutive duplicate acks */
-      if (!found_dupack) {
-        pcb->dupacks = 0;
-      }
     } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
       /* We come here when the ACK acknowledges new data. */
       tcpwnd_size_t acked;
@@ -1481,7 +1486,7 @@
           }
           pbuf_realloc(inseg.p, inseg.len);
           tcplen = TCP_TCPLEN(&inseg);
-          LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n",
+          LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd",
                       (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));
         }
 #if TCP_QUEUE_OOSEQ
@@ -1530,7 +1535,7 @@
               }
               pbuf_realloc(inseg.p, inseg.len);
               tcplen = TCP_TCPLEN(&inseg);
-              LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue\n",
+              LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue",
                           (seqno + tcplen) == next->tcphdr->seqno);
             }
             pcb->ooseq = next;
@@ -1541,7 +1546,7 @@
         pcb->rcv_nxt = seqno + tcplen;
 
         /* Update the receiver's (our) window. */
-        LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen);
+        LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd", pcb->rcv_wnd >= tcplen);
         pcb->rcv_wnd -= tcplen;
 
         tcp_update_rcv_ann_wnd(pcb);
@@ -1577,7 +1582,7 @@
           seqno = pcb->ooseq->tcphdr->seqno;
 
           pcb->rcv_nxt += TCP_TCPLEN(cseg);
-          LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd\n",
+          LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd",
                       pcb->rcv_wnd >= TCP_TCPLEN(cseg));
           pcb->rcv_wnd -= TCP_TCPLEN(cseg);
 
@@ -1782,7 +1787,7 @@
                     next->next->len = (u16_t)(pcb->rcv_nxt + pcb->rcv_wnd - seqno);
                     pbuf_realloc(next->next->p, next->next->len);
                     tcplen = TCP_TCPLEN(next->next);
-                    LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n",
+                    LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd",
                                 (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));
                   }
                 }
diff --git a/src/core/tcp_out.c b/src/core/tcp_out.c
index 8149d39..64579ee 100644
--- a/src/core/tcp_out.c
+++ b/src/core/tcp_out.c
@@ -106,7 +106,7 @@
 #endif /* TCP_CHECKSUM_ON_COPY*/
 
 /** Define this to 1 for an extra check that the output checksum is valid
- * (usefule when the checksum is generated by the application, not the stack) */
+ * (useful when the checksum is generated by the application, not the stack) */
 #ifndef TCP_CHECKSUM_ON_COPY_SANITY_CHECK
 #define TCP_CHECKSUM_ON_COPY_SANITY_CHECK   0
 #endif
@@ -126,6 +126,9 @@
 
 /* Forward declarations.*/
 static err_t tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif);
+static err_t tcp_output_control_segment_netif(const struct tcp_pcb *pcb, struct pbuf *p,
+                                              const ip_addr_t *src, const ip_addr_t *dst,
+                                              struct netif *netif);
 
 /* tcp_route: common code that returns a fixed bound netif or calls ip_route */
 static struct netif *
@@ -355,7 +358,7 @@
  * it can send them more efficiently by combining them together).
  * To prompt the system to send data now, call tcp_output() after
  * calling tcp_write().
- * 
+ *
  * This function enqueues the data pointed to by the argument dataptr. The length of
  * the data is passed as the len parameter. The apiflags can be one or more of:
  * - TCP_WRITE_FLAG_COPY: indicates whether the new memory should be allocated
@@ -1037,12 +1040,12 @@
   u8_t optflags = 0;
   u8_t optlen = 0;
 
-  LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen));
-
   LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
               (flags & (TCP_SYN | TCP_FIN)) != 0);
   LWIP_ASSERT("tcp_enqueue_flags: invalid pcb", pcb != NULL);
 
+  LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen));
+
   /* No need to check pcb->snd_queuelen if only SYN or FIN are allowed! */
 
   /* Get options for this segment. This is a special case since this is the
@@ -1922,65 +1925,61 @@
 tcp_output_control_segment(const struct tcp_pcb *pcb, struct pbuf *p,
                            const ip_addr_t *src, const ip_addr_t *dst)
 {
-  err_t err;
   struct netif *netif;
 
   LWIP_ASSERT("tcp_output_control_segment: invalid pbuf", p != NULL);
 
   netif = tcp_route(pcb, src, dst);
   if (netif == NULL) {
-    err = ERR_RTE;
-  } else {
-    u8_t ttl, tos;
-#if CHECKSUM_GEN_TCP
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {
-      struct tcp_hdr *tcphdr = (struct tcp_hdr *)p->payload;
-      tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
-                                        src, dst);
-    }
-#endif
-    if (pcb != NULL) {
-      NETIF_SET_HINTS(netif, LWIP_CONST_CAST(struct netif_hint*, &(pcb->netif_hints)));
-      ttl = pcb->ttl;
-      tos = pcb->tos;
-    } else {
-      /* Send output with hardcoded TTL/HL since we have no access to the pcb */
-      ttl = TCP_TTL;
-      tos = 0;
-    }
-    TCP_STATS_INC(tcp.xmit);
-    err = ip_output_if(p, src, dst, ttl, tos, IP_PROTO_TCP, netif);
-    NETIF_RESET_HINTS(netif);
+    pbuf_free(p);
+    return ERR_RTE;
   }
+  return tcp_output_control_segment_netif(pcb, p, src, dst, netif);
+}
+
+/** Output a control segment pbuf to IP.
+ *
+ * Called instead of tcp_output_control_segment when we don't have a pcb but we
+ * do know the interface to send to.
+ */
+static err_t
+tcp_output_control_segment_netif(const struct tcp_pcb *pcb, struct pbuf *p,
+                                 const ip_addr_t *src, const ip_addr_t *dst,
+                                 struct netif *netif)
+{
+  err_t err;
+  u8_t ttl, tos;
+
+  LWIP_ASSERT("tcp_output_control_segment_netif: no netif given", netif != NULL);
+
+#if CHECKSUM_GEN_TCP
+  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {
+    struct tcp_hdr *tcphdr = (struct tcp_hdr *)p->payload;
+    tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
+                                      src, dst);
+  }
+#endif
+  if (pcb != NULL) {
+    NETIF_SET_HINTS(netif, LWIP_CONST_CAST(struct netif_hint*, &(pcb->netif_hints)));
+    ttl = pcb->ttl;
+    tos = pcb->tos;
+  } else {
+    /* Send output with hardcoded TTL/HL since we have no access to the pcb */
+    ttl = TCP_TTL;
+    tos = 0;
+  }
+  TCP_STATS_INC(tcp.xmit);
+  err = ip_output_if(p, src, dst, ttl, tos, IP_PROTO_TCP, netif);
+  NETIF_RESET_HINTS(netif);
+
   pbuf_free(p);
   return err;
 }
 
-/**
- * Send a TCP RESET packet (empty segment with RST flag set) either to
- * abort a connection or to show that there is no matching local connection
- * for a received segment.
- *
- * Called by tcp_abort() (to abort a local connection), tcp_input() (if no
- * matching local pcb was found), tcp_listen_input() (if incoming segment
- * has ACK flag set) and tcp_process() (received segment in the wrong state)
- *
- * Since a RST segment is in most cases not sent for an active connection,
- * tcp_rst() has a number of arguments that are taken from a tcp_pcb for
- * most other segment output functions.
- *
- * @param pcb TCP pcb (may be NULL if no pcb is available)
- * @param seqno the sequence number to use for the outgoing segment
- * @param ackno the acknowledge number to use for the outgoing segment
- * @param local_ip the local IP address to send the segment from
- * @param remote_ip the remote IP address to send the segment to
- * @param local_port the local TCP port to send the segment from
- * @param remote_port the remote TCP port to send the segment to
- */
-void
-tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno,
-        const ip_addr_t *local_ip, const ip_addr_t *remote_ip,
-        u16_t local_port, u16_t remote_port)
+static struct pbuf *
+tcp_rst_common(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno,
+               const ip_addr_t *local_ip, const ip_addr_t *remote_ip,
+               u16_t local_port, u16_t remote_port)
 {
   struct pbuf *p;
   u16_t wnd;
@@ -2001,14 +2000,81 @@
     remote_port, TCP_RST | TCP_ACK, wnd);
   if (p == NULL) {
     LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n"));
-    return;
+    return NULL;
   }
   tcp_output_fill_options(pcb, p, 0, 0);
 
   MIB2_STATS_INC(mib2.tcpoutrsts);
 
-  tcp_output_control_segment(pcb, p, local_ip, remote_ip);
   LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
+  return p;
+}
+
+/**
+ * Send a TCP RESET packet (empty segment with RST flag set) to abort a
+ * connection.
+ *
+ * Called by tcp_abort() (to abort a local connection), tcp_closen() (if not
+ * all data has been received by the application), tcp_timewait_input() (if a
+ * SYN is received) and tcp_process() (received segment in the wrong state).
+ *
+ * Since a RST segment is in most cases not sent for an active connection,
+ * tcp_rst() has a number of arguments that are taken from a tcp_pcb for
+ * most other segment output functions.
+ *
+ * @param pcb TCP pcb (may be NULL if no pcb is available)
+ * @param seqno the sequence number to use for the outgoing segment
+ * @param ackno the acknowledge number to use for the outgoing segment
+ * @param local_ip the local IP address to send the segment from
+ * @param remote_ip the remote IP address to send the segment to
+ * @param local_port the local TCP port to send the segment from
+ * @param remote_port the remote TCP port to send the segment to
+ */
+void
+tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno,
+        const ip_addr_t *local_ip, const ip_addr_t *remote_ip,
+        u16_t local_port, u16_t remote_port)
+{
+  struct pbuf *p;
+  
+  p = tcp_rst_common(pcb, seqno, ackno, local_ip, remote_ip, local_port, remote_port);
+  if (p != NULL) {
+    tcp_output_control_segment(pcb, p, local_ip, remote_ip);
+  }
+}
+
+/**
+ * Send a TCP RESET packet (empty segment with RST flag set) to show that there
+ * is no matching local connection for a received segment.
+ *
+ * Called by tcp_input() (if no matching local pcb was found) and
+ * tcp_listen_input() (if incoming segment has ACK flag set).
+ *
+ * Since a RST segment is in most cases not sent for an active connection,
+ * tcp_rst() has a number of arguments that are taken from a tcp_pcb for
+ * most other segment output functions.
+ *
+ * @param netif the netif on which to send the RST (since we have no pcb)
+ * @param seqno the sequence number to use for the outgoing segment
+ * @param ackno the acknowledge number to use for the outgoing segment
+ * @param local_ip the local IP address to send the segment from
+ * @param remote_ip the remote IP address to send the segment to
+ * @param local_port the local TCP port to send the segment from
+ * @param remote_port the remote TCP port to send the segment to
+ */
+void
+tcp_rst_netif(struct netif *netif, u32_t seqno, u32_t ackno,
+              const ip_addr_t *local_ip, const ip_addr_t *remote_ip,
+              u16_t local_port, u16_t remote_port)
+{
+  if (netif) {
+    struct pbuf *p = tcp_rst_common(NULL, seqno, ackno, local_ip, remote_ip, local_port, remote_port);
+    if (p != NULL) {
+      tcp_output_control_segment_netif(NULL, p, local_ip, remote_ip, netif);
+    }
+  } else {
+    LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_rst_netif: no netif given\n"));
+  }
 }
 
 /**
diff --git a/src/core/timeouts.c b/src/core/timeouts.c
index f37acfe..91657eb 100644
--- a/src/core/timeouts.c
+++ b/src/core/timeouts.c
@@ -51,7 +51,7 @@
 #include "lwip/ip4_frag.h"
 #include "lwip/etharp.h"
 #include "lwip/dhcp.h"
-#include "lwip/autoip.h"
+#include "lwip/acd.h"
 #include "lwip/igmp.h"
 #include "lwip/dns.h"
 #include "lwip/nd6.h"
@@ -91,9 +91,9 @@
   {DHCP_COARSE_TIMER_MSECS, HANDLER(dhcp_coarse_tmr)},
   {DHCP_FINE_TIMER_MSECS, HANDLER(dhcp_fine_tmr)},
 #endif /* LWIP_DHCP */
-#if LWIP_AUTOIP
-  {AUTOIP_TMR_INTERVAL, HANDLER(autoip_tmr)},
-#endif /* LWIP_AUTOIP */
+#if LWIP_ACD
+  {ACD_TMR_INTERVAL, HANDLER(acd_tmr)},
+#endif /* LWIP_ACD */
 #if LWIP_IGMP
   {IGMP_TMR_INTERVAL, HANDLER(igmp_tmr)},
 #endif /* LWIP_IGMP */
@@ -241,7 +241,7 @@
   cyclic->handler();
 
   now = sys_now();
-  next_timeout_time = (u32_t)(current_timeout_due_time + cyclic->interval_ms);  /* overflow handled by TIME_LESS_THAN macro */ 
+  next_timeout_time = (u32_t)(current_timeout_due_time + cyclic->interval_ms);  /* overflow handled by TIME_LESS_THAN macro */
   if (TIME_LESS_THAN(next_timeout_time, now)) {
     /* timer would immediately expire again -> "overload" -> restart without any correction */
 #if LWIP_DEBUG_TIMERNAMES
@@ -296,7 +296,7 @@
 
   LWIP_ASSERT("Timeout time too long, max is LWIP_UINT32_MAX/4 msecs", msecs <= (LWIP_UINT32_MAX / 4));
 
-  next_timeout_time = (u32_t)(sys_now() + msecs); /* overflow handled by TIME_LESS_THAN macro */ 
+  next_timeout_time = (u32_t)(sys_now() + msecs); /* overflow handled by TIME_LESS_THAN macro */
 
 #if LWIP_DEBUG_TIMERNAMES
   sys_timeout_abs(next_timeout_time, handler, arg, handler_name);
diff --git a/src/core/udp.c b/src/core/udp.c
index 0b609d3..23c2be2 100644
--- a/src/core/udp.c
+++ b/src/core/udp.c
@@ -1,12 +1,12 @@
 /**
  * @file
- * User Datagram Protocol module\n
- * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828).\n
+ * User Datagram Protocol module<br>
+ * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828).<br>
  * See also @ref udp_raw
  *
  * @defgroup udp_raw UDP
  * @ingroup callbackstyle_api
- * User Datagram Protocol module\n
+ * User Datagram Protocol module<br>
  * @see @ref api
  */
 
@@ -163,14 +163,14 @@
       {
         if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||
             ((ip4_current_dest_addr()->addr == IPADDR_BROADCAST)) ||
-            ip4_addr_netcmp(ip_2_ip4(&pcb->local_ip), ip4_current_dest_addr(), netif_ip4_netmask(inp))) {
+            ip4_addr_net_eq(ip_2_ip4(&pcb->local_ip), ip4_current_dest_addr(), netif_ip4_netmask(inp))) {
           return 1;
         }
       }
     } else
 #endif /* LWIP_IPV4 */
       /* Handle IPv4 and IPv6: all or exact match */
-      if (ip_addr_isany(&pcb->local_ip) || ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
+      if (ip_addr_isany(&pcb->local_ip) || ip_addr_eq(&pcb->local_ip, ip_current_dest_addr())) {
         return 1;
       }
   }
@@ -268,9 +268,9 @@
 #if LWIP_IPV4
         } else if (broadcast && ip4_current_dest_addr()->addr == IPADDR_BROADCAST) {
           /* global broadcast address (only valid for IPv4; match was checked before) */
-          if (!IP_IS_V4_VAL(uncon_pcb->local_ip) || !ip4_addr_cmp(ip_2_ip4(&uncon_pcb->local_ip), netif_ip4_addr(inp))) {
+          if (!IP_IS_V4_VAL(uncon_pcb->local_ip) || !ip4_addr_eq(ip_2_ip4(&uncon_pcb->local_ip), netif_ip4_addr(inp))) {
             /* uncon_pcb does not match the input netif, check this pcb */
-            if (IP_IS_V4_VAL(pcb->local_ip) && ip4_addr_cmp(ip_2_ip4(&pcb->local_ip), netif_ip4_addr(inp))) {
+            if (IP_IS_V4_VAL(pcb->local_ip) && ip4_addr_eq(ip_2_ip4(&pcb->local_ip), netif_ip4_addr(inp))) {
               /* better match */
               uncon_pcb = pcb;
             }
@@ -288,7 +288,7 @@
       /* compare PCB remote addr+port to UDP source addr+port */
       if ((pcb->remote_port == src) &&
           (ip_addr_isany_val(pcb->remote_ip) ||
-           ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()))) {
+           ip_addr_eq(&pcb->remote_ip, ip_current_src_addr()))) {
         /* the first fully matching PCB */
         if (prev != NULL) {
           /* move the pcb to the front of udp_pcbs so that is
@@ -321,7 +321,7 @@
 #endif /* LWIP_IPV6 */
 #if LWIP_IPV4
     if (!ip_current_is_v6()) {
-      for_us = ip4_addr_cmp(netif_ip4_addr(inp), ip4_current_dest_addr());
+      for_us = ip4_addr_eq(netif_ip4_addr(inp), ip4_current_dest_addr());
     }
 #endif /* LWIP_IPV4 */
   }
@@ -365,7 +365,7 @@
 #endif /* CHECKSUM_CHECK_UDP */
     if (pbuf_remove_header(p, UDP_HLEN)) {
       /* Can we cope with this failing? Just assert for now */
-      LWIP_ASSERT("pbuf_remove_header failed\n", 0);
+      LWIP_ASSERT("pbuf_remove_header failed", 0);
       UDP_STATS_INC(udp.drop);
       MIB2_STATS_INC(mib2.udpinerrors);
       pbuf_free(p);
@@ -570,7 +570,7 @@
              in pcb->mcast_ip4 that is used for routing. If this routing lookup
              fails, we try regular routing as though no override was set. */
           if (!ip4_addr_isany_val(pcb->mcast_ip4) &&
-              !ip4_addr_cmp(&pcb->mcast_ip4, IP4_ADDR_BROADCAST)) {
+              !ip4_addr_eq(&pcb->mcast_ip4, IP4_ADDR_BROADCAST)) {
             netif = ip4_route_src(ip_2_ip4(&pcb->local_ip), &pcb->mcast_ip4);
           }
         }
@@ -678,7 +678,7 @@
     } else {
       /* check if UDP PCB local IP address is correct
        * this could be an old address if netif->ip_addr has changed */
-      if (!ip4_addr_cmp(ip_2_ip4(&(pcb->local_ip)), netif_ip4_addr(netif))) {
+      if (!ip4_addr_eq(ip_2_ip4(&(pcb->local_ip)), netif_ip4_addr(netif))) {
         /* local_ip doesn't match, drop the packet */
         return ERR_RTE;
       }
@@ -911,7 +911,7 @@
 /**
  * @ingroup udp_raw
  * Bind an UDP PCB.
- * 
+ *
  * @param pcb UDP PCB to be bound with a local address ipaddr and port.
  * @param ipaddr local IP address to bind with. Use IP_ANY_TYPE to
  * bind to all local interfaces.
@@ -999,7 +999,7 @@
           if ((ipcb->local_port == port) &&
               (((IP_GET_TYPE(&ipcb->local_ip) == IP_GET_TYPE(ipaddr)) &&
               /* IP address matches or any IP used? */
-              (ip_addr_cmp(&ipcb->local_ip, ipaddr) ||
+              (ip_addr_eq(&ipcb->local_ip, ipaddr) ||
               ip_addr_isany(ipaddr) ||
               ip_addr_isany(&ipcb->local_ip))) ||
               (IP_GET_TYPE(&ipcb->local_ip) == IPADDR_TYPE_ANY) ||
@@ -1172,8 +1172,8 @@
 
 /**
  * @ingroup udp_raw
- * Removes and deallocates the pcb.  
- * 
+ * Removes and deallocates the pcb.
+ *
  * @param pcb UDP PCB to be removed. The PCB is removed from the list of
  * UDP PCB's and the data structure is freed from memory.
  *
@@ -1238,6 +1238,7 @@
 #if LWIP_MULTICAST_TX_OPTIONS
     udp_set_multicast_ttl(pcb, UDP_TTL);
 #endif /* LWIP_MULTICAST_TX_OPTIONS */
+    pcb_tci_init(pcb);
   }
   return pcb;
 }
@@ -1288,7 +1289,7 @@
   if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) {
     for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) {
       /* PCB bound to current local interface address? */
-      if (ip_addr_cmp(&upcb->local_ip, old_addr)) {
+      if (ip_addr_eq(&upcb->local_ip, old_addr)) {
         /* The PCB is bound to the old ipaddr and
          * is set to bound to the new one instead */
         ip_addr_copy(upcb->local_ip, *new_addr);
diff --git a/src/include/compat/posix/net/if.h b/src/include/compat/posix/net/if.h
index 6b8e63a..8b8e481 100644
--- a/src/include/compat/posix/net/if.h
+++ b/src/include/compat/posix/net/if.h
@@ -7,7 +7,7 @@
  * 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, 
+ * 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,
@@ -16,17 +16,17 @@
  *    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. 
+ *    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 
+ * 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.
diff --git a/src/include/lwip/acd.h b/src/include/lwip/acd.h
new file mode 100644
index 0000000..e2e6cdd
--- /dev/null
+++ b/src/include/lwip/acd.h
@@ -0,0 +1,109 @@
+/**
+ * @file
+ *
+ * ACD IPv4 Address Conflict Detection
+ */
+
+/*
+ *
+ * Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>
+ * Copyright (c) 2018 Jasper Verschueren <jasper.verschueren@apart-audio.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.
+ *
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
+ * Author: Dominik Spies <kontakt@dspies.de>
+ */
+
+#ifndef LWIP_HDR_ACD_H
+#define LWIP_HDR_ACD_H
+
+#include "lwip/opt.h"
+
+/* don't build if not configured for use in lwipopts.h */
+#if LWIP_IPV4 && LWIP_ACD
+
+#include "lwip/netif.h"
+#include "lwip/etharp.h"
+#include "lwip/prot/acd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** ACD Timing
+ *  ACD_TMR_INTERVAL msecs, I recommend a value of 100.
+ *  The value must divide 1000 with a remainder almost 0. Possible values are
+ *  1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 ....
+ */
+#define ACD_TMR_INTERVAL      100
+
+/**
+ * Callback function: Handle conflict information from ACD module
+ *
+ * @param netif   network interface to handle conflict information on
+ * @param state   acd_callback_enum_t
+ */
+typedef void (*acd_conflict_callback_t)(struct netif *netif, acd_callback_enum_t state);
+
+/** ACD state information per netif */
+struct acd
+{
+  /** next acd module */
+  struct acd *next;
+  /** the currently selected, probed, announced or used IP-Address */
+  ip4_addr_t ipaddr;
+  /** current ACD state machine state */
+  acd_state_enum_t state;
+  /** sent number of probes or announces, dependent on state */
+  u8_t sent_num;
+  /** ticks to wait, tick is ACD_TMR_INTERVAL long */
+  u16_t ttw;
+  /** ticks until a conflict can again be solved by defending */
+  u8_t lastconflict;
+  /** total number of probed/used IP-Addresses that resulted in a conflict */
+  u8_t num_conflicts;
+  /** callback function -> let's the acd user know if the address is good or
+      if a conflict is detected */
+  acd_conflict_callback_t acd_conflict_callback;
+};
+
+err_t acd_add(struct netif *netif, struct acd *acd,
+              acd_conflict_callback_t acd_conflict_callback);
+void acd_remove(struct netif *netif, struct acd *acd);
+err_t acd_start(struct netif *netif, struct acd *acd, ip4_addr_t ipaddr);
+err_t acd_stop(struct acd *acd);
+void acd_arp_reply(struct netif *netif, struct etharp_hdr *hdr);
+void acd_tmr(void);
+void acd_network_changed_link_down(struct netif *netif);
+void acd_netif_ip_addr_changed(struct netif *netif, const ip_addr_t *old_addr,
+                               const ip_addr_t *new_addr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_IPV4 && LWIP_ACD */
+
+#endif /* LWIP_HDR_ACD_H */
diff --git a/src/include/lwip/altcp.h b/src/include/lwip/altcp.h
index 1b24544..11acaff 100644
--- a/src/include/lwip/altcp.h
+++ b/src/include/lwip/altcp.h
@@ -1,6 +1,6 @@
 /**
  * @file
- * Application layered TCP connection API (to be used from TCPIP thread)\n
+ * Application layered TCP connection API (to be used from TCPIP thread)
  *
  * This file contains the generic API.
  * For more details see @ref altcp_api.
@@ -80,7 +80,8 @@
   u8_t pollinterval;
 };
 
-/** @ingroup altcp */
+/** @ingroup altcp
+ *  Struct containing an allocator and its state. */
 typedef struct altcp_allocator_s {
   /** Allocator function */
   altcp_new_fn  alloc;
diff --git a/src/include/lwip/altcp_tcp.h b/src/include/lwip/altcp_tcp.h
index dbde584..ca47379 100644
--- a/src/include/lwip/altcp_tcp.h
+++ b/src/include/lwip/altcp_tcp.h
@@ -1,6 +1,6 @@
 /**
  * @file
- * Application layered TCP connection API (to be used from TCPIP thread)\n
+ * Application layered TCP connection API (to be used from TCPIP thread)<br>
  * This interface mimics the tcp callback API to the application while preventing
  * direct linking (much like virtual functions).
  * This way, an application can make use of other application layer protocols
diff --git a/src/include/lwip/altcp_tls.h b/src/include/lwip/altcp_tls.h
index ff797f2..fcb784d 100644
--- a/src/include/lwip/altcp_tls.h
+++ b/src/include/lwip/altcp_tls.h
@@ -51,6 +51,13 @@
 
 #include "lwip/altcp.h"
 
+/* check if mbedtls port is enabled */
+#include "lwip/apps/altcp_tls_mbedtls_opts.h"
+/* allow session structure to be fully defined when using mbedtls port */
+#if LWIP_ALTCP_TLS_MBEDTLS
+#include "mbedtls/ssl.h"
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -63,7 +70,7 @@
 /** @ingroup altcp_tls
  * Create an ALTCP_TLS server configuration handle prepared for multiple certificates
  */
-struct altcp_tls_config *altcp_tls_create_config_server(uint8_t cert_count);
+struct altcp_tls_config *altcp_tls_create_config_server(u8_t cert_count);
 
 /** @ingroup altcp_tls
  * Add a certificate to an ALTCP_TLS server configuration handle
@@ -95,6 +102,15 @@
                             const u8_t *cert, size_t cert_len);
 
 /** @ingroup altcp_tls
+ * Configure ALPN TLS extension
+ * Example:<br>
+ * static const char *g_alpn_protocols[] = { "x-amzn-mqtt-ca", NULL };<br>
+ * tls_config = altcp_tls_create_config_client(ca, ca_len);<br>
+ * altcp_tls_conf_alpn_protocols(tls_config, g_alpn_protocols);<br>
+ */
+int altcp_tls_configure_alpn_protocols(struct altcp_tls_config *conf, const char **protos);
+
+/** @ingroup altcp_tls
  * Free an ALTCP_TLS configuration handle
  */
 void altcp_tls_free_config(struct altcp_tls_config *conf);
@@ -123,7 +139,7 @@
 /** @ingroup altcp_tls
  * Create new ALTCP_TLS layer pcb and its inner tcp pcb.
  * Same as @ref altcp_tls_new but this allocator function fits to
- * @ref altcp_allocator_t / @ref altcp_new.\n
+ * @ref altcp_allocator_t / @ref altcp_new.<br>
  'arg' must contain a struct altcp_tls_config *.
  */
 struct altcp_pcb *altcp_tls_alloc(void *arg, u8_t ip_type);
@@ -134,6 +150,43 @@
  */
 void *altcp_tls_context(struct altcp_pcb *conn);
 
+/** @ingroup altcp_tls
+ * ALTCP_TLS session handle, content depends on port (e.g. mbedtls)
+ */
+struct altcp_tls_session
+#if LWIP_ALTCP_TLS_MBEDTLS
+{
+    mbedtls_ssl_session data;
+}
+#endif
+;
+
+/** @ingroup altcp_tls
+ * Initialise a TLS session buffer.
+ * Real type depends on port (e.g. mbedtls use mbedtls_ssl_session)
+ */
+void altcp_tls_init_session(struct altcp_tls_session *dest);
+
+/** @ingroup altcp_tls
+ * Save current connected session to reuse it later. Should be called after altcp_connect() succeeded.
+ * Return error if saving session fail.
+ * Real type depends on port (e.g. mbedtls use mbedtls_ssl_session)
+ */
+err_t altcp_tls_get_session(struct altcp_pcb *conn, struct altcp_tls_session *dest);
+
+/** @ingroup altcp_tls
+ * Restore a previously saved session. Must be called before altcp_connect().
+ * Return error if cannot restore session.
+ * Real type depends on port (e.g. mbedtls use mbedtls_ssl_session)
+ */
+err_t altcp_tls_set_session(struct altcp_pcb *conn, struct altcp_tls_session *from);
+
+/** @ingroup altcp_tls
+ * Free allocated data inside a TLS session buffer.
+ * Real type depends on port (e.g. mbedtls use mbedtls_ssl_session)
+ */
+void altcp_tls_free_session(struct altcp_tls_session *dest);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/api.h b/src/include/lwip/api.h
index c2afaf2..be8c22a 100644
--- a/src/include/lwip/api.h
+++ b/src/include/lwip/api.h
@@ -153,27 +153,27 @@
 };
 
 /** Used to inform the callback function about changes
- * 
+ *
  * Event explanation:
- * 
+ *
  * In the netconn implementation, there are three ways to block a client:
- * 
+ *
  * - accept mbox (sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, 0); in netconn_accept())
  * - receive mbox (sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0); in netconn_recv_data())
  * - send queue is full (sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0); in lwip_netconn_do_write())
- * 
+ *
  * The events have to be seen as events signaling the state of these mboxes/semaphores. For non-blocking
  * connections, you need to know in advance whether a call to a netconn function call would block or not,
  * and these events tell you about that.
- * 
- * RCVPLUS events say: Safe to perform a potentially blocking call call once more. 
+ *
+ * RCVPLUS events say: Safe to perform a potentially blocking call call once more.
  * They are counted in sockets - three RCVPLUS events for accept mbox means you are safe
  * to call netconn_accept 3 times without being blocked.
  * Same thing for receive mbox.
- * 
+ *
  * RCVMINUS events say: Your call to to a possibly blocking function is "acknowledged".
  * Socket implementation decrements the counter.
- * 
+ *
  * For TX, there is no need to count, its merely a flag. SENDPLUS means you may send something.
  * SENDPLUS occurs when enough data was delivered to peer so netconn_send() can be called again.
  * A SENDMINUS event occurs when the next call to a netconn_send() would be blocking.
@@ -246,10 +246,10 @@
       all threads when closing while threads are waiting. */
   int mbox_threads_waiting;
 #endif
-  /** only used for socket layer */
-#if LWIP_SOCKET
-  int socket;
-#endif /* LWIP_SOCKET */
+  union {
+    int socket;
+    void *ptr;
+  } callback_arg;
 #if LWIP_SO_SNDTIMEO
   /** timeout to wait for sending data (which means enqueueing data for sending
       in internal buffers) in milliseconds */
@@ -373,6 +373,9 @@
 #define netconn_clear_flags(conn, clr_flags)   do { (conn)->flags = (u8_t)((conn)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0)
 #define netconn_is_flag_set(conn, flag)        (((conn)->flags & (flag)) != 0)
 
+#define netconn_set_callback_arg(conn, arg)   do { (conn)->callback_arg.ptr = (arg); } while(0)
+#define netconn_get_callback_arg(conn)        ((conn)->callback_arg.ptr)
+
 /** Set the blocking status of netconn calls (@todo: write/send is missing) */
 #define netconn_set_nonblocking(conn, val)  do { if(val) { \
   netconn_set_flags(conn, NETCONN_FLAG_NON_BLOCKING); \
diff --git a/src/include/lwip/apps/altcp_tls_mbedtls_opts.h b/src/include/lwip/apps/altcp_tls_mbedtls_opts.h
index 71aa599..e41301c 100644
--- a/src/include/lwip/apps/altcp_tls_mbedtls_opts.h
+++ b/src/include/lwip/apps/altcp_tls_mbedtls_opts.h
@@ -100,6 +100,12 @@
 #define ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS  (60 * 60 * 24)
 #endif
 
+/** Certificate verification mode: MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL (default),
+ * MBEDTLS_SSL_VERIFY_REQUIRED (recommended)*/
+#ifndef ALTCP_MBEDTLS_AUTHMODE
+#define ALTCP_MBEDTLS_AUTHMODE                        MBEDTLS_SSL_VERIFY_OPTIONAL
+#endif
+
 #endif /* LWIP_ALTCP */
 
 #endif /* LWIP_HDR_ALTCP_TLS_OPTS_H */
diff --git a/src/include/lwip/apps/fs.h b/src/include/lwip/apps/fs.h
index 67b9a60..82b219a 100644
--- a/src/include/lwip/apps/fs.h
+++ b/src/include/lwip/apps/fs.h
@@ -1,8 +1,8 @@
 /*
  * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
- * All rights reserved. 
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
+ * 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,
@@ -11,21 +11,21 @@
  *    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. 
+ *    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 
+ * 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>
  *
  */
@@ -54,6 +54,7 @@
 #define FS_FILE_FLAGS_HEADER_PERSISTENT   0x02
 #define FS_FILE_FLAGS_HEADER_HTTPVER_1_1  0x04
 #define FS_FILE_FLAGS_SSI                 0x08
+#define FS_FILE_FLAGS_CUSTOM              0x10
 
 /** Define FS_FILE_EXTENSION_T_DEFINED if you have typedef'ed to your private
  * pointer type (defaults to 'void' so the default usage is 'void*')
@@ -66,17 +67,16 @@
   const char *data;
   int len;
   int index;
+#if LWIP_HTTPD_FILE_EXTENSION
   /* pextension is free for implementations to hold private (extensional)
      arbitrary data, e.g. holding some file state or file system handle */
   fs_file_extension *pextension;
+#endif /* LWIP_HTTPD_FILE_EXTENSION */
 #if HTTPD_PRECALCULATED_CHECKSUM
   const struct fsdata_chksum *chksum;
   u16_t chksum_count;
 #endif /* HTTPD_PRECALCULATED_CHECKSUM */
   u8_t flags;
-#if LWIP_HTTPD_CUSTOM_FILES
-  u8_t is_custom_file;
-#endif /* LWIP_HTTPD_CUSTOM_FILES */
 #if LWIP_HTTPD_FILE_STATE
   void *state;
 #endif /* LWIP_HTTPD_FILE_STATE */
@@ -119,6 +119,19 @@
 #endif /* HTTPD_PRECALCULATED_CHECKSUM */
 };
 
+#if LWIP_HTTPD_CUSTOM_FILES
+/* Prototypes required to implement custom files as fs addon */
+int fs_open_custom(struct fs_file *file, const char *name);
+void fs_close_custom(struct fs_file *file);
+#if LWIP_HTTPD_FS_ASYNC_READ
+u8_t fs_canread_custom(struct fs_file *file);
+u8_t fs_wait_read_custom(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg);
+int fs_read_async_custom(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg);
+#else /* LWIP_HTTPD_FS_ASYNC_READ */
+int fs_read_custom(struct fs_file *file, char *buffer, int count);
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+#endif /* LWIP_HTTPD_CUSTOM_FILES */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/apps/http_client.h b/src/include/lwip/apps/http_client.h
index 8a06308..d39e1bf 100644
--- a/src/include/lwip/apps/http_client.h
+++ b/src/include/lwip/apps/http_client.h
@@ -52,7 +52,7 @@
 #endif
 
 /**
- * @ingroup httpc 
+ * @ingroup httpc
  * HTTPC_HAVE_FILE_IO: define this to 1 to have functions dowloading directly
  * to disk via fopen/fwrite.
  * These functions are example implementations of the interface only.
@@ -62,13 +62,13 @@
 #endif
 
 /**
- * @ingroup httpc 
+ * @ingroup httpc
  * The default TCP port used for HTTP
  */
 #define HTTP_DEFAULT_PORT         LWIP_IANA_PORT_HTTP
 
 /**
- * @ingroup httpc 
+ * @ingroup httpc
  * HTTP client result codes
  */
 typedef enum ehttpc_result {
@@ -97,7 +97,7 @@
 typedef struct _httpc_state httpc_state_t;
 
 /**
- * @ingroup httpc 
+ * @ingroup httpc
  * Prototype of a http client callback function
  *
  * @param arg argument specified when initiating the request
@@ -110,7 +110,7 @@
 typedef void (*httpc_result_fn)(void *arg, httpc_result_t httpc_result, u32_t rx_content_len, u32_t srv_res, err_t err);
 
 /**
- * @ingroup httpc 
+ * @ingroup httpc
  * Prototype of http client callback: called when the headers are received
  *
  * @param connection http client connection
diff --git a/src/include/lwip/apps/httpd.h b/src/include/lwip/apps/httpd.h
index e872429..1ecdd74 100644
--- a/src/include/lwip/apps/httpd.h
+++ b/src/include/lwip/apps/httpd.h
@@ -95,6 +95,7 @@
     tCGIHandler pfnCGIHandler;
 } tCGI;
 
+/** Set the array of cgi handlers. */
 void http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers);
 
 #endif /* LWIP_HTTPD_CGI */
diff --git a/src/include/lwip/apps/httpd_opts.h b/src/include/lwip/apps/httpd_opts.h
index 8723961..2b66e67 100644
--- a/src/include/lwip/apps/httpd_opts.h
+++ b/src/include/lwip/apps/httpd_opts.h
@@ -94,7 +94,7 @@
  *
  * To save memory, the maximum tag length is limited (@see LWIP_HTTPD_MAX_TAG_NAME_LEN).
  * To save memory, the maximum insertion string length is limited (@see
- * LWIP_HTTPD_MAX_TAG_INSERT_LEN). If this is not enought, @ref LWIP_HTTPD_SSI_MULTIPART
+ * LWIP_HTTPD_MAX_TAG_INSERT_LEN). If this is not enough, @ref LWIP_HTTPD_SSI_MULTIPART
  * can be used.
  */
 #if !defined LWIP_HTTPD_SSI || defined __DOXYGEN__
@@ -112,7 +112,9 @@
 /** Set this to 0 to prevent parsing the file extension at runtime to decide
  * if a file should be scanned for SSI tags or not.
  * Default is 1 (file extensions are checked using the g_pcSSIExtensions array)
- * Set to 2 to override this runtime test function.
+ * Set to 2 to override this runtime test function. In this case, you have to
+ * provide an external function that does the check:
+ *   u8_t http_uri_is_ssi(struct fs_file *file, const char *uri)
  *
  * This is enabled by default, but if you only use a newer version of makefsdata
  * supporting the "-ssi" option, this info is already present in
@@ -121,6 +123,14 @@
 #define LWIP_HTTPD_SSI_BY_FILE_EXTENSION  1
 #endif
 
+/** This is a list of file extensions handled as SSI files. This define
+ * is used to initialize a 'const char *const[]'. It is only used if
+ * LWIP_HTTPD_SSI_BY_FILE_EXTENSION != 0.
+ */
+#if !defined LWIP_HTTPD_SSI_EXTENSIONS || defined __DOXYGEN__
+#define LWIP_HTTPD_SSI_EXTENSIONS ".shtml", ".shtm", ".ssi", ".xml", ".json"
+#endif
+
 /** Set this to 1 to support HTTP POST */
 #if !defined LWIP_HTTPD_SUPPORT_POST || defined __DOXYGEN__
 #define LWIP_HTTPD_SUPPORT_POST   0
@@ -175,7 +185,7 @@
 #define HTTPD_DEBUG         LWIP_DBG_OFF
 #endif
 
-/** Set this to 1 to use a memp pool for allocating 
+/** Set this to 1 to use a memp pool for allocating
  * struct http_state instead of the heap.
  * If enabled, you'll need to define MEMP_NUM_PARALLEL_HTTPD_CONNS
  * (and MEMP_NUM_PARALLEL_HTTPD_SSI_CONNS for SSI) to set the size of
@@ -365,6 +375,16 @@
 #define LWIP_HTTPD_FILE_STATE         0
 #endif
 
+/** Set this to 1 to add the pextension field to the fs_file structure.
+ * This is included here to retain compatibility with legacy code that
+ * relies on the presence of the pextension field.
+ * New code should use LWIP_HTTPD_FILE_STATE instead.
+ * This option may be removed in a future version of lwip.
+ */
+#if !defined LWIP_HTTPD_FILE_EXTENSION || defined __DOXYGEN__
+#define LWIP_HTTPD_FILE_EXTENSION     0
+#endif
+
 /** HTTPD_PRECALCULATED_CHECKSUM==1: include precompiled checksums for
  * predefined (MSS-sized) chunks of the files to prevent having to calculate
  * the checksums at runtime. */
diff --git a/src/include/lwip/apps/lwiperf.h b/src/include/lwip/apps/lwiperf.h
index cc86e7f..e6f4476 100644
--- a/src/include/lwip/apps/lwiperf.h
+++ b/src/include/lwip/apps/lwiperf.h
@@ -76,7 +76,16 @@
 
 /** Prototype of a report function that is called when a session is finished.
     This report function can show the test results.
-    @param report_type contains the test result */
+    @param arg Report_arg from when the test was started.
+    @param report_type contains the test result
+    @param local_addr The local address from the session
+    @param local_port The local port
+    @param remote_addr The remote address from the session
+    @param remote_port The remote port
+    @param bytes_transferred Total transferred bytes
+    @param ms_duration Total session duration, in milliseconds
+    @param bandwidth_kbitpsec Average bandwidth during the session, in kbps
+*/
 typedef void (*lwiperf_report_fn)(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);
diff --git a/src/include/lwip/apps/mdns.h b/src/include/lwip/apps/mdns.h
index 20d7ee2..33da4a3 100644
--- a/src/include/lwip/apps/mdns.h
+++ b/src/include/lwip/apps/mdns.h
@@ -32,6 +32,7 @@
  * This file is part of the lwIP TCP/IP stack.
  *
  * Author: Erik Ekman <erik@kryo.se>
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
  *
  */
 
@@ -56,10 +57,41 @@
 #define MDNS_PROBING_SUCCESSFUL 1
 
 #define MDNS_LABEL_MAXLEN  63
+#define MDNS_DOMAIN_MAXLEN 256
 
 struct mdns_host;
 struct mdns_service;
 
+/* Domain structs */
+struct mdns_domain {
+  /* Encoded domain name */
+  u8_t name[MDNS_DOMAIN_MAXLEN];
+  /* Total length of domain name, including zero */
+  u16_t length;
+  /* Set if compression of this domain is not allowed */
+  u8_t skip_compression;
+};
+
+/** Domain, type and class.
+ *  Shared between questions and answers */
+struct mdns_rr_info {
+  struct mdns_domain domain;
+  u16_t type;
+  u16_t klass;
+};
+
+struct mdns_answer {
+  struct mdns_rr_info info;
+  /** cache flush command bit */
+  u16_t cache_flush;
+  /* Validity time in seconds */
+  u32_t ttl;
+  /** Length of variable answer */
+  u16_t rd_length;
+  /** Offset of start of variable answer in packet */
+  u16_t rd_offset;
+};
+
 /** Callback function to add text to a reply, called when generating the reply */
 typedef void (*service_get_txt_fn_t)(struct mdns_service *service, void *txt_userdata);
 
@@ -67,22 +99,26 @@
  * uniqueness, called with result MDNS_PROBING_SUCCESSFUL if no other node claimed
  * use for the name for the netif or a service and is safe to use, or MDNS_PROBING_CONFLICT
  * if another node is already using it and mdns is disabled on this interface */
-typedef void (*mdns_name_result_cb_t)(struct netif* netif, u8_t result);
+typedef void (*mdns_name_result_cb_t)(struct netif* netif, u8_t result, s8_t slot);
+
+void *mdns_get_service_txt_userdata(struct netif *netif, s8_t slot);
 
 void mdns_resp_init(void);
 
 void mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb);
 
-err_t mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl);
+err_t mdns_resp_add_netif(struct netif *netif, const char *hostname);
 err_t mdns_resp_remove_netif(struct netif *netif);
 err_t mdns_resp_rename_netif(struct netif *netif, const char *hostname);
+int mdns_resp_netif_active(struct netif *netif);
 
-s8_t  mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_userdata);
-err_t mdns_resp_del_service(struct netif *netif, s8_t slot);
-err_t mdns_resp_rename_service(struct netif *netif, s8_t slot, const char *name);
+s8_t  mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, service_get_txt_fn_t txt_fn, void *txt_userdata);
+err_t mdns_resp_del_service(struct netif *netif, u8_t slot);
+err_t mdns_resp_rename_service(struct netif *netif, u8_t slot, const char *name);
 
 err_t mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len);
 
+void mdns_resp_restart_delay(struct netif *netif, uint32_t delay);
 void mdns_resp_restart(struct netif *netif);
 void mdns_resp_announce(struct netif *netif);
 
@@ -96,6 +132,19 @@
  */
 #define mdns_resp_netif_settings_changed(netif) mdns_resp_announce(netif)
 
+#if LWIP_MDNS_SEARCH
+typedef void (*search_result_fn_t)(struct mdns_answer *answer, const char *varpart, int varlen, int flags, void *arg);
+/* flags bits, both can be set! */
+#define MDNS_SEARCH_RESULT_FIRST    1 /* First answer in received frame. */
+#define MDNS_SEARCH_RESULT_LAST     2 /* Last answer. */
+
+err_t mdns_search_service(const char *name, const char *service, enum mdns_sd_proto proto,
+                          struct netif *netif, search_result_fn_t result_fn, void *arg,
+                          u8_t *request_id);
+void mdns_search_stop(u8_t request_id);
+
+#endif /* LWIP_MDNS_SEARCH */
+
 #endif /* LWIP_MDNS_RESPONDER */
 
 #ifdef __cplusplus
diff --git a/src/include/lwip/apps/mdns_domain.h b/src/include/lwip/apps/mdns_domain.h
new file mode 100644
index 0000000..9fa804e
--- /dev/null
+++ b/src/include/lwip/apps/mdns_domain.h
@@ -0,0 +1,80 @@
+/**
+ * @file
+ * MDNS responder - domain related functionalities 
+ */
+
+ /*
+ * Copyright (c) 2015 Verisure Innovation AB
+ * 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: Erik Ekman <erik@kryo.se>
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
+ *
+ */
+
+#ifndef LWIP_HDR_APPS_MDNS_DOMAIN_H
+#define LWIP_HDR_APPS_MDNS_DOMAIN_H
+
+#include "lwip/apps/mdns_opts.h"
+#include "lwip/apps/mdns_priv.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if LWIP_MDNS_RESPONDER
+
+/* Domain methods - also visible for unit tests */
+
+err_t mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len);
+err_t mdns_domain_add_domain(struct mdns_domain *domain, struct mdns_domain *source);
+err_t mdns_domain_add_string(struct mdns_domain *domain, const char *source);
+u16_t mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain);
+void mdns_domain_debug_print(struct mdns_domain *domain);
+int mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b);
+#if LWIP_IPV4
+err_t mdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr);
+#endif
+#if LWIP_IPV6
+err_t mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr);
+#endif
+err_t mdns_build_host_domain(struct mdns_domain *domain, struct mdns_host *mdns);
+err_t mdns_build_dnssd_domain(struct mdns_domain *domain);
+err_t mdns_build_service_domain(struct mdns_domain *domain, struct mdns_service *service, int include_name);
+#if LWIP_MDNS_SEARCH
+err_t mdns_build_request_domain(struct mdns_domain *domain, struct mdns_request *request, int include_name);
+#endif
+u16_t mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain);
+err_t mdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain);
+
+#endif /* LWIP_MDNS_RESPONDER */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_APPS_MDNS_DOMAIN_H */
diff --git a/src/include/lwip/apps/mdns_opts.h b/src/include/lwip/apps/mdns_opts.h
index 45f2c50..1eee3e3 100644
--- a/src/include/lwip/apps/mdns_opts.h
+++ b/src/include/lwip/apps/mdns_opts.h
@@ -32,6 +32,7 @@
  * This file is part of the lwIP TCP/IP stack.
  *
  * Author: Erik Ekman <erik@kryo.se>
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
  *
  */
 
@@ -59,6 +60,34 @@
 #define MDNS_MAX_SERVICES               1
 #endif
 
+/** The minimum delay between probes in ms. RFC 6762 require 250ms.
+ * In noisy WiFi environment, adding 30-50ms to this value help a lot for
+ * a successful Apple BCT tests.
+ */
+#ifndef MDNS_PROBE_DELAY_MS
+#define MDNS_PROBE_DELAY_MS           250
+#endif
+
+/** The maximum number of received packets stored in chained list of known
+ * answers for pending truncated questions. This value define the size of
+ * the MDNS_PKTS mempool.
+ * Up to MDNS_MAX_STORED_PKTS pbuf can be stored in addition to TC questions
+ * that are pending.
+ */
+#ifndef MDNS_MAX_STORED_PKTS
+#define MDNS_MAX_STORED_PKTS            4
+#endif
+
+/** Payload size allocated for each outgoing UDP packet. Will be allocated with
+ * PBUF_RAM and freed after packet was sent.
+ * According to RFC 6762, there is no reason to retain the 512 bytes restriction
+ * for link-local multicast packet.
+ * 512 bytes isn't enough when 2 services need to be probed.
+ */
+#ifndef MDNS_OUTPUT_PACKET_SIZE
+#define MDNS_OUTPUT_PACKET_SIZE      ((MDNS_MAX_SERVICES == 1) ? 512 : 1450)
+#endif
+
 /** MDNS_RESP_USENETIF_EXTCALLBACK==1: register an ext_callback on the netif
  * to automatically restart probing/announcing on status or address change.
  */
@@ -67,6 +96,18 @@
 #endif
 
 /**
+ * LWIP_MDNS_SEARCH==1: Turn on search over multicast DNS module.
+ */
+#ifndef LWIP_MDNS_SEARCH
+#define LWIP_MDNS_SEARCH                1
+#endif
+
+/** The maximum number of running requests */
+#ifndef MDNS_MAX_REQUESTS
+#define MDNS_MAX_REQUESTS               2
+#endif
+
+/**
  * MDNS_DEBUG: Enable debugging for multicast DNS.
  */
 #ifndef MDNS_DEBUG
@@ -78,4 +119,3 @@
  */
 
 #endif /* LWIP_HDR_APPS_MDNS_OPTS_H */
-
diff --git a/src/include/lwip/apps/mdns_out.h b/src/include/lwip/apps/mdns_out.h
new file mode 100644
index 0000000..e6a7e38
--- /dev/null
+++ b/src/include/lwip/apps/mdns_out.h
@@ -0,0 +1,138 @@
+/**
+ * @file
+ * MDNS responder - output related functionalities
+ */
+
+ /*
+ * Copyright (c) 2015 Verisure Innovation AB
+ * 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: Erik Ekman <erik@kryo.se>
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
+ *
+ */
+
+#ifndef LWIP_HDR_APPS_MDNS_OUT_H
+#define LWIP_HDR_APPS_MDNS_OUT_H
+
+#include "lwip/apps/mdns_opts.h"
+#include "lwip/apps/mdns_priv.h"
+#include "lwip/netif.h"
+#include "lwip/timeouts.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if LWIP_MDNS_RESPONDER
+
+/** Bitmasks outmsg generation */
+/* Probe for ALL types with hostname */
+#define QUESTION_PROBE_HOST_ANY          0x10
+/* Probe for ALL types with service instance name */
+#define QUESTION_PROBE_SERVICE_NAME_ANY  0x10
+
+/* Lookup from hostname -> IPv4 */
+#define REPLY_HOST_A            0x01
+/* Lookup from IPv4/v6 -> hostname */
+#define REPLY_HOST_PTR_V4       0x02
+/* Lookup from hostname -> IPv6 */
+#define REPLY_HOST_AAAA         0x04
+/* Lookup from hostname -> IPv6 */
+#define REPLY_HOST_PTR_V6       0x08
+
+/* Lookup for service types */
+#define REPLY_SERVICE_TYPE_PTR  0x10
+/* Lookup for instances of service */
+#define REPLY_SERVICE_NAME_PTR  0x20
+/* Lookup for location of service instance */
+#define REPLY_SERVICE_SRV       0x40
+/* Lookup for text info on service instance */
+#define REPLY_SERVICE_TXT       0x80
+
+/* RFC6762 section 6:
+ * To protect the network against excessive packet flooding due to software bugs
+ * or malicious attack, a Multicast DNS responder MUST NOT (except in the one
+ * special case of answering probe queries) multicast a record on a given
+ * interface until at least one second has elapsed since the last time that
+ * record was multicast on that particular interface.
+ */
+#define MDNS_MULTICAST_TIMEOUT    1000
+
+/* RFC6762 section 6:
+ * In this special case only, when responding via multicast to a probe, a
+ * Multicast DNS responder is only required to delay its transmission as
+ * necessary to ensure an interval of at least 250 ms since the last time the
+ * record was multicast on that interface.
+ */
+#define MDNS_MULTICAST_PROBE_TIMEOUT    250
+
+/* RFC6762 section 5.4:
+ * When receiving a question with the unicast-response bit set, a responder
+ * SHOULD usually respond with a unicast packet directed back to the querier.
+ * However, if the responder has not multicast that record recently (within one
+ * quarter of its TTL), then the responder SHOULD instead multicast the response
+ * so as to keep all the peer caches up to date, and to permit passive conflict
+ * detection.
+ * -> we implement a stripped down version. Depending on a timeout of 30s
+ *    (25% of 120s) all QU questions are send via multicast or unicast.
+ */
+#define MDNS_MULTICAST_TIMEOUT_25TTL  30000
+
+err_t mdns_create_outpacket(struct netif *netif, struct mdns_outmsg *msg,
+                            struct mdns_outpacket *outpkt);
+err_t mdns_send_outpacket(struct mdns_outmsg *msg, struct netif *netif);
+void mdns_set_timeout(struct netif *netif, u32_t msecs,
+                        sys_timeout_handler handler, u8_t *busy_flag);
+#if LWIP_IPV4
+void mdns_multicast_timeout_reset_ipv4(void *arg);
+void mdns_multicast_probe_timeout_reset_ipv4(void *arg);
+void mdns_multicast_timeout_25ttl_reset_ipv4(void *arg);
+void mdns_send_multicast_msg_delayed_ipv4(void *arg);
+void mdns_send_unicast_msg_delayed_ipv4(void *arg);
+void mdns_start_multicast_timeouts_ipv4(struct netif *netif);
+#endif
+#if LWIP_IPV6
+void mdns_multicast_timeout_reset_ipv6(void *arg);
+void mdns_multicast_probe_timeout_reset_ipv6(void *arg);
+void mdns_multicast_timeout_25ttl_reset_ipv6(void *arg);
+void mdns_send_multicast_msg_delayed_ipv6(void *arg);
+void mdns_send_unicast_msg_delayed_ipv6(void *arg);
+void mdns_start_multicast_timeouts_ipv6(struct netif *netif);
+#endif
+void mdns_prepare_txtdata(struct mdns_service *service);
+#ifdef LWIP_MDNS_SEARCH
+err_t mdns_send_request(struct mdns_request *req, struct netif *netif, const ip_addr_t *destination);
+#endif
+
+#endif /* LWIP_MDNS_RESPONDER */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_APPS_MDNS_OUT_H */
diff --git a/src/include/lwip/apps/mdns_priv.h b/src/include/lwip/apps/mdns_priv.h
index 9635b5b..5209ba0 100644
--- a/src/include/lwip/apps/mdns_priv.h
+++ b/src/include/lwip/apps/mdns_priv.h
@@ -32,11 +32,13 @@
  * This file is part of the lwIP TCP/IP stack.
  *
  * Author: Erik Ekman <erik@kryo.se>
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
  *
  */
 #ifndef LWIP_HDR_MDNS_PRIV_H
 #define LWIP_HDR_MDNS_PRIV_H
 
+#include "lwip/apps/mdns.h"
 #include "lwip/apps/mdns_opts.h"
 #include "lwip/pbuf.h"
 
@@ -46,24 +48,185 @@
 
 #if LWIP_MDNS_RESPONDER
 
-/* Domain struct and methods - visible for unit tests */
-
-#define MDNS_DOMAIN_MAXLEN 256
 #define MDNS_READNAME_ERROR 0xFFFF
+#define NUM_DOMAIN_OFFSETS 10
 
-struct mdns_domain {
-  /* Encoded domain name */
-  u8_t name[MDNS_DOMAIN_MAXLEN];
-  /* Total length of domain name, including zero */
-  u16_t length;
-  /* Set if compression of this domain is not allowed */
-  u8_t skip_compression;
+#define SRV_PRIORITY 0
+#define SRV_WEIGHT   0
+
+/* mDNS TTL: (RFC6762 section 10)
+ *  - 120 seconds if the hostname appears somewhere in the RR
+ *  - 75 minutes if not (4500 seconds)
+ *  - 10 seconds if responding to a legacy query
+ */
+#define MDNS_TTL_10    10
+#define MDNS_TTL_120   120
+#define MDNS_TTL_4500  4500
+
+/* RFC6762 section 8.1: If fifteen conflicts occur within any ten-second period,
+ * then the host MUST wait at least five seconds before each successive
+ * additional probe attempt.
+ */
+#define MDNS_PROBE_MAX_CONFLICTS_BEFORE_RATE_LIMIT  15
+#define MDNS_PROBE_MAX_CONFLICTS_TIME_WINDOW        10000
+#define MDNS_PROBE_MAX_CONFLICTS_TIMEOUT            5000
+
+#if LWIP_MDNS_SEARCH
+/** Description of a search request */
+struct mdns_request {
+  /** Name of service, like 'myweb' */
+  char name[MDNS_LABEL_MAXLEN + 1];
+  /** Type of service, like '_http' or '_services._dns-sd' */
+  struct mdns_domain service;
+  /** Callback function called for each response */
+  search_result_fn_t result_fn;
+  void *arg;
+  /** Protocol, TCP or UDP */
+  u16_t proto;
+  /** Query type (PTR, SRV, ...) */
+  u8_t qtype;
+  /** PTR only request. */
+  u16_t only_ptr;
+};
+#endif
+
+/** Description of a service */
+struct mdns_service {
+  /** TXT record to answer with */
+  struct mdns_domain txtdata;
+  /** Name of service, like 'myweb' */
+  char name[MDNS_LABEL_MAXLEN + 1];
+  /** Type of service, like '_http' */
+  char service[MDNS_LABEL_MAXLEN + 1];
+  /** Callback function and userdata
+   * to update txtdata buffer */
+  service_get_txt_fn_t txt_fn;
+  void *txt_userdata;
+  /** Protocol, TCP or UDP */
+  u16_t proto;
+  /** Port of the service */
+  u16_t port;
 };
 
-err_t mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len);
-u16_t mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain);
-int mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b);
-u16_t mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain);
+/** mDNS output packet */
+struct mdns_outpacket {
+  /** Packet data */
+  struct pbuf *pbuf;
+  /** Current write offset in packet */
+  u16_t write_offset;
+  /** Number of questions written */
+  u16_t questions;
+  /** Number of normal answers written */
+  u16_t answers;
+  /** Number of authoritative answers written */
+  u16_t authoritative;
+  /** Number of additional answers written */
+  u16_t additional;
+  /** Offsets for written domain names in packet.
+   *  Used for compression */
+  u16_t domain_offsets[NUM_DOMAIN_OFFSETS];
+};
+
+/** mDNS output message */
+struct mdns_outmsg {
+  /** Identifier. Used in legacy queries */
+  u16_t tx_id;
+  /** dns flags */
+  u8_t flags;
+  /** Destination IP/port if sent unicast */
+  ip_addr_t dest_addr;
+  u16_t dest_port;
+  /** If all answers in packet should set cache_flush bit */
+  u8_t cache_flush;
+  /** If reply should be sent unicast (as requested) */
+  u8_t unicast_reply_requested;
+  /** If legacy query. (tx_id needed, and write
+   *  question again in reply before answer) */
+  u8_t legacy_query;
+  /** If the query is a probe msg we need to respond immediately. Independent of
+   *  the QU or QM flag. */
+  u8_t probe_query_recv;
+  /* Question bitmask for host information */
+  u8_t host_questions;
+  /* Questions bitmask per service */
+  u8_t serv_questions[MDNS_MAX_SERVICES];
+  /* Reply bitmask for host information */
+  u8_t host_replies;
+  /* Bitmask for which reverse IPv6 hosts to answer */
+  u8_t host_reverse_v6_replies;
+  /* Reply bitmask per service */
+  u8_t serv_replies[MDNS_MAX_SERVICES];
+#ifdef LWIP_MDNS_SEARCH
+  /** Search query to send */
+  struct mdns_request *query;
+#endif
+};
+
+/** Delayed msg info */
+struct mdns_delayed_msg {
+  /** Signals if a multicast msg needs to be send out */
+  u8_t multicast_msg_waiting;
+  /** Multicast timeout for all multicast traffic except probe answers */
+  u8_t multicast_timeout;
+  /** Multicast timeout only for probe answers */
+  u8_t multicast_probe_timeout;
+  /** Output msg used for delayed multicast responses */
+  struct mdns_outmsg delayed_msg_multicast;
+  /** Prefer multicast over unicast timeout -> 25% of TTL = we take 30s as
+      general delay. */
+  u8_t multicast_timeout_25TTL;
+  /** Only send out new unicast message if previous was send */
+  u8_t unicast_msg_in_use;
+  /** Output msg used for delayed unicast responses */
+  struct mdns_outmsg delayed_msg_unicast;
+};
+
+/* MDNS states */
+typedef enum {
+  /* MDNS module is off */
+  MDNS_STATE_OFF,
+  /* Waiting before probing can be started */
+  MDNS_STATE_PROBE_WAIT,
+  /* Probing the unique records */
+  MDNS_STATE_PROBING,
+  /* Waiting before announcing the probed unique records */
+  MDNS_STATE_ANNOUNCE_WAIT,
+  /* Announcing all records */
+  MDNS_STATE_ANNOUNCING,
+  /* Probing and announcing completed */
+  MDNS_STATE_COMPLETE
+} mdns_resp_state_enum_t;
+
+/** Description of a host/netif */
+struct mdns_host {
+  /** Hostname */
+  char name[MDNS_LABEL_MAXLEN + 1];
+  /** Pointer to services */
+  struct mdns_service *services[MDNS_MAX_SERVICES];
+  /** Number of probes/announces sent for the current name */
+  u8_t sent_num;
+  /** State of the mdns responder */
+  mdns_resp_state_enum_t state;
+#if LWIP_IPV4
+  /** delayed msg struct for IPv4 */
+  struct mdns_delayed_msg ipv4;
+#endif
+#if LWIP_IPV6
+  /** delayed msg struct for IPv6 */
+  struct mdns_delayed_msg ipv6;
+#endif
+  /** Timestamp of probe conflict saved in list */
+  u32_t conflict_time[MDNS_PROBE_MAX_CONFLICTS_BEFORE_RATE_LIMIT];
+  /** Rate limit flag */
+  u8_t rate_limit_activated;
+  /** List index for timestamps */
+  u8_t index;
+  /** number of conflicts since startup */
+  u8_t num_conflicts;
+};
+
+struct mdns_host* netif_mdns_data(struct netif *netif);
+struct udp_pcb* get_mdns_pcb(void);
 
 #endif /* LWIP_MDNS_RESPONDER */
 
diff --git a/src/include/lwip/apps/mqtt.h b/src/include/lwip/apps/mqtt.h
index c2bb228..bece400 100644
--- a/src/include/lwip/apps/mqtt.h
+++ b/src/include/lwip/apps/mqtt.h
@@ -134,7 +134,7 @@
   MQTT_DATA_FLAG_LAST = 1
 };
 
-/** 
+/**
  * @ingroup mqtt
  * Function prototype for MQTT incoming publish data callback function. Called when data
  * arrives to a subscribed topic @see mqtt_subscribe
@@ -149,7 +149,7 @@
 typedef void (*mqtt_incoming_data_cb_t)(void *arg, const u8_t *data, u16_t len, u8_t flags);
 
 
-/** 
+/**
  * @ingroup mqtt
  * Function prototype for MQTT incoming publish function. Called when an incoming publish
  * arrives to a subscribed topic @see mqtt_subscribe
@@ -183,7 +183,7 @@
 
 u8_t mqtt_client_is_connected(mqtt_client_t *client);
 
-void mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t,
+void mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb,
                              mqtt_incoming_data_cb_t data_cb, void *arg);
 
 err_t mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub);
diff --git a/src/include/lwip/apps/netbiosns_opts.h b/src/include/lwip/apps/netbiosns_opts.h
index 1f51ab0..cc0da95 100644
--- a/src/include/lwip/apps/netbiosns_opts.h
+++ b/src/include/lwip/apps/netbiosns_opts.h
@@ -42,7 +42,7 @@
 
 /** NetBIOS name of lwip device
  * This must be uppercase until NETBIOS_STRCMP() is defined to a string
- * comparision function that is case insensitive.
+ * comparison function that is case insensitive.
  * If you want to use the netif's hostname, use this (with LWIP_NETIF_HOSTNAME):
  * (ip_current_netif() != NULL ? ip_current_netif()->hostname != NULL ? ip_current_netif()->hostname : "" : "")
  *
diff --git a/src/include/lwip/apps/smtp_opts.h b/src/include/lwip/apps/smtp_opts.h
index bc743f6..c588fb9 100644
--- a/src/include/lwip/apps/smtp_opts.h
+++ b/src/include/lwip/apps/smtp_opts.h
@@ -6,14 +6,14 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
-    
+
 /**
  * @defgroup smtp_opts Options
  * @ingroup smtp
- * 
+ *
  * @{
  */
-    
+
 /** Set this to 1 to enable data handler callback on BODY */
 #ifndef SMTP_BODYDH
 #define SMTP_BODYDH             0
@@ -78,4 +78,3 @@
 #endif
 
 #endif /* SMTP_OPTS_H */
-
diff --git a/src/include/lwip/apps/snmp.h b/src/include/lwip/apps/snmp.h
index a3f8eb1..dc5bb0d 100644
--- a/src/include/lwip/apps/snmp.h
+++ b/src/include/lwip/apps/snmp.h
@@ -50,7 +50,7 @@
 #include "lwip/err.h"
 #include "lwip/apps/snmp_core.h"
 
-/** SNMP variable binding descriptor (publically needed for traps) */
+/** SNMP variable binding descriptor (publicly needed for traps) */
 struct snmp_varbind
 {
   /** pointer to next varbind, NULL for last in list */
@@ -101,6 +101,16 @@
 err_t snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds);
 err_t snmp_send_trap(const struct snmp_obj_id* oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds);
 
+err_t snmp_send_inform_generic(s32_t generic_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id);
+err_t snmp_send_inform_specific(s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id);
+err_t snmp_send_inform(const struct snmp_obj_id* oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds, s32_t *ptr_request_id);
+struct snmp_request;
+typedef void (*snmp_inform_callback_fct)(struct snmp_request *request, void* callback_arg);
+void snmp_set_inform_callback(snmp_inform_callback_fct inform_callback, void* callback_arg);
+
+void snmp_set_default_trap_version(u8_t snmp_version);
+u8_t snmp_get_default_trap_version(void);
+
 #define SNMP_AUTH_TRAPS_DISABLED 0
 #define SNMP_AUTH_TRAPS_ENABLED  1
 void snmp_set_auth_traps_enabled(u8_t enable);
diff --git a/src/include/lwip/apps/snmp_core.h b/src/include/lwip/apps/snmp_core.h
index 6021c72..5a8a49f 100644
--- a/src/include/lwip/apps/snmp_core.h
+++ b/src/include/lwip/apps/snmp_core.h
@@ -101,7 +101,7 @@
 /** error codes predefined by SNMP prot. */
 typedef enum {
   SNMP_ERR_NOERROR             = 0,
-/* 
+/*
 outdated v1 error codes. do not use anmore!
 #define SNMP_ERR_NOSUCHNAME 2  use SNMP_ERR_NOSUCHINSTANCE instead
 #define SNMP_ERR_BADVALUE   3  use SNMP_ERR_WRONGTYPE,SNMP_ERR_WRONGLENGTH,SNMP_ERR_WRONGENCODING or SNMP_ERR_WRONGVALUE instead
diff --git a/src/include/lwip/apps/snmp_mib2.h b/src/include/lwip/apps/snmp_mib2.h
index 2f4a689..453e519 100644
--- a/src/include/lwip/apps/snmp_mib2.h
+++ b/src/include/lwip/apps/snmp_mib2.h
@@ -60,7 +60,7 @@
 #define SNMP_SYSSERVICES ((1 << 6) | (1 << 3) | ((IP_FORWARD) << 2))
 #endif
 
-void snmp_mib2_set_sysdescr(const u8_t* str, const u16_t* len); /* read-only be defintion */
+void snmp_mib2_set_sysdescr(const u8_t* str, const u16_t* len); /* read-only be definition */
 void snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize);
 void snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen);
 void snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize);
diff --git a/src/include/lwip/apps/snmp_threadsync.h b/src/include/lwip/apps/snmp_threadsync.h
index a25dbf2..76f1118 100644
--- a/src/include/lwip/apps/snmp_threadsync.h
+++ b/src/include/lwip/apps/snmp_threadsync.h
@@ -72,7 +72,7 @@
   struct snmp_node_instance proxy_instance;
 };
 
-/** Thread sync instance. Needed EXCATLY once for every thread to be synced into. */
+/** Thread sync instance. Needed EXACTLY once for every thread to be synced into. */
 struct snmp_threadsync_instance
 {
   sys_sem_t                       sem;
diff --git a/src/include/lwip/apps/sntp.h b/src/include/lwip/apps/sntp.h
index c415253..11dacce 100644
--- a/src/include/lwip/apps/sntp.h
+++ b/src/include/lwip/apps/sntp.h
@@ -57,6 +57,7 @@
 
 void sntp_setserver(u8_t idx, const ip_addr_t *addr);
 const ip_addr_t* sntp_getserver(u8_t idx);
+u8_t sntp_getkodreceived(u8_t idx);
 
 #if SNTP_MONITOR_SERVER_REACHABILITY
 u8_t sntp_getreachability(u8_t idx);
diff --git a/src/include/lwip/apps/tftp_client.h b/src/include/lwip/apps/tftp_client.h
new file mode 100644
index 0000000..24dbda6
--- /dev/null
+++ b/src/include/lwip/apps/tftp_client.h
@@ -0,0 +1,50 @@
+/**
+ *
+ * @file tftp_client.h
+ * TFTP client header
+ *
+ */
+
+/*
+ * 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_HDR_APPS_TFTP_CLIENT_H
+#define LWIP_HDR_APPS_TFTP_CLIENT_H
+
+#include "lwip/apps/tftp_common.h"
+
+enum tftp_transfer_mode {
+  TFTP_MODE_OCTET,
+  TFTP_MODE_NETASCII,
+  TFTP_MODE_BINARY /* used in old versions only */
+};
+
+err_t tftp_init_client(const struct tftp_context* ctx);
+err_t tftp_get(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enum tftp_transfer_mode mode);
+err_t tftp_put(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enum tftp_transfer_mode mode);
+
+#endif /* LWIP_HDR_APPS_TFTP_CLIENT_H */
diff --git a/src/include/lwip/apps/tftp_common.h b/src/include/lwip/apps/tftp_common.h
new file mode 100644
index 0000000..4bc2c17
--- /dev/null
+++ b/src/include/lwip/apps/tftp_common.h
@@ -0,0 +1,108 @@
+/**
+ *
+ * @file tftp_common.h
+ *
+ * @author   Logan Gunthorpe <logang@deltatee.com>
+ *
+ * @brief    Trivial File Transfer Protocol (RFC 1350)
+ *
+ * Copyright (c) Deltatee Enterprises Ltd. 2013
+ * 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: Logan Gunthorpe <logang@deltatee.com>
+ *
+ */
+
+#ifndef LWIP_HDR_APPS_TFTP_COMMON_H
+#define LWIP_HDR_APPS_TFTP_COMMON_H
+
+#include "lwip/apps/tftp_opts.h"
+#include "lwip/err.h"
+#include "lwip/pbuf.h"
+#include "lwip/ip_addr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @ingroup tftp
+ * TFTP context containing callback functions for TFTP transfers
+ */
+struct tftp_context {
+  /**
+   * Open file for read/write (server mode only).
+   * @param fname Filename
+   * @param mode Mode string from TFTP RFC 1350 (netascii, octet, mail)
+   * @param write Flag indicating read (0) or write (!= 0) access
+   * @returns File handle supplied to other functions
+   */
+  void* (*open)(const char* fname, const char* mode, u8_t write);
+  /**
+   * Close file handle
+   * @param handle File handle returned by open()/tftp_put()/tftp_get()
+   */
+  void (*close)(void* handle);
+  /**
+   * Read from file
+   * @param handle File handle returned by open()/tftp_put()/tftp_get()
+   * @param buf Target buffer to copy read data to
+   * @param bytes Number of bytes to copy to buf
+   * @returns &gt;= 0: Success; &lt; 0: Error
+   */
+  int (*read)(void* handle, void* buf, int bytes);
+  /**
+   * Write to file
+   * @param handle File handle returned by open()/tftp_put()/tftp_get()
+   * @param pbuf PBUF adjusted such that payload pointer points
+   *             to the beginning of write data. In other words,
+   *             TFTP headers are stripped off.
+   * @returns &gt;= 0: Success; &lt; 0: Error
+   */
+  int (*write)(void* handle, struct pbuf* p);
+  /**
+   * Error indication from client or response from server
+   * @param handle File handle set by open()/tftp_get()/tftp_put()
+   * @param err error code from client or server
+   * @param msg error message from client or server
+   * @param size size of msg
+   */
+  void (*error)(void* handle, int err, const char* msg, int size);
+};
+
+#define LWIP_TFTP_MODE_SERVER       0x01
+#define LWIP_TFTP_MODE_CLIENT       0x02
+#define LWIP_TFTP_MODE_CLIENTSERVER (LWIP_TFTP_MODE_SERVER | LWIP_TFTP_MODE_CLIENT)
+
+err_t tftp_init_common(u8_t mode, const struct tftp_context* ctx);
+void tftp_cleanup(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_APPS_TFTP_COMMON_H */
diff --git a/src/include/lwip/apps/tftp_opts.h b/src/include/lwip/apps/tftp_opts.h
index 198f632..509fabd 100644
--- a/src/include/lwip/apps/tftp_opts.h
+++ b/src/include/lwip/apps/tftp_opts.h
@@ -11,7 +11,7 @@
  *
  */
 
-/* 
+/*
  * Redistribution and use in source and binary forms, with or without
  * modification,are permitted provided that the following conditions are met:
  *
@@ -96,7 +96,7 @@
  * Max. length of TFTP mode
  */
 #if !defined TFTP_MAX_MODE_LEN || defined __DOXYGEN__
-#define TFTP_MAX_MODE_LEN     7
+#define TFTP_MAX_MODE_LEN     10
 #endif
 
 /**
diff --git a/src/include/lwip/apps/tftp_server.h b/src/include/lwip/apps/tftp_server.h
index 0a7fbee..a5769ce 100644
--- a/src/include/lwip/apps/tftp_server.h
+++ b/src/include/lwip/apps/tftp_server.h
@@ -1,17 +1,11 @@
 /**
  *
  * @file tftp_server.h
- *
- * @author   Logan Gunthorpe <logang@deltatee.com>
- *
- * @brief    Trivial File Transfer Protocol (RFC 1350)
- *
- * Copyright (c) Deltatee Enterprises Ltd. 2013
- * All rights reserved.
+ * TFTP server header
  *
  */
 
-/* 
+/*
  * Redistribution and use in source and binary forms, with or without
  * modification,are permitted provided that the following conditions are met:
  *
@@ -34,62 +28,15 @@
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * Author: Logan Gunthorpe <logang@deltatee.com>
+ * This file is part of the lwIP TCP/IP stack.
  *
  */
 
 #ifndef LWIP_HDR_APPS_TFTP_SERVER_H
 #define LWIP_HDR_APPS_TFTP_SERVER_H
 
-#include "lwip/apps/tftp_opts.h"
-#include "lwip/err.h"
-#include "lwip/pbuf.h"
+#include "lwip/apps/tftp_common.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** @ingroup tftp
- * TFTP context containing callback functions for TFTP transfers
- */
-struct tftp_context {
-  /**
-   * Open file for read/write.
-   * @param fname Filename
-   * @param mode Mode string from TFTP RFC 1350 (netascii, octet, mail)
-   * @param write Flag indicating read (0) or write (!= 0) access
-   * @returns File handle supplied to other functions
-   */
-  void* (*open)(const char* fname, const char* mode, u8_t write);
-  /**
-   * Close file handle
-   * @param handle File handle returned by open()
-   */
-  void (*close)(void* handle);
-  /**
-   * Read from file 
-   * @param handle File handle returned by open()
-   * @param buf Target buffer to copy read data to
-   * @param bytes Number of bytes to copy to buf
-   * @returns &gt;= 0: Success; &lt; 0: Error
-   */
-  int (*read)(void* handle, void* buf, int bytes);
-  /**
-   * Write to file
-   * @param handle File handle returned by open()
-   * @param pbuf PBUF adjusted such that payload pointer points
-   *             to the beginning of write data. In other words,
-   *             TFTP headers are stripped off.
-   * @returns &gt;= 0: Success; &lt; 0: Error
-   */
-  int (*write)(void* handle, struct pbuf* p);
-};
-
-err_t tftp_init(const struct tftp_context* ctx);
-void tftp_cleanup(void);
-
-#ifdef __cplusplus
-}
-#endif
+err_t tftp_init_server(const struct tftp_context* ctx);
 
 #endif /* LWIP_HDR_APPS_TFTP_SERVER_H */
diff --git a/src/include/lwip/arch.h b/src/include/lwip/arch.h
index 58dae33..596c1c9 100644
--- a/src/include/lwip/arch.h
+++ b/src/include/lwip/arch.h
@@ -72,9 +72,9 @@
 #define LWIP_RAND() ((u32_t)rand())
 #endif
 
-/** Platform specific diagnostic output.\n
+/** Platform specific diagnostic output.<br>
  * Note the default implementation pulls in printf, which may
- * in turn pull in a lot of standard libary code. In resource-constrained 
+ * in turn pull in a lot of standard library code. In resource-constrained
  * systems, this should be defined to something less resource-consuming.
  */
 #ifndef LWIP_PLATFORM_DIAG
@@ -83,9 +83,9 @@
 #include <stdlib.h>
 #endif
 
-/** Platform specific assertion handling.\n
+/** Platform specific assertion handling.<br>
  * Note the default implementation pulls in printf, fflush and abort, which may
- * in turn pull in a lot of standard libary code. In resource-constrained 
+ * in turn pull in a lot of standard library code. In resource-constrained
  * systems, this should be defined to something less resource-consuming.
  */
 #ifndef LWIP_PLATFORM_ASSERT
@@ -261,10 +261,10 @@
  * its start address using LWIP_MEM_ALIGN.
  * You can declare your own version here e.g. to enforce alignment without adding
  * trailing padding bytes (see LWIP_MEM_ALIGN_BUFFER) or your own section placement
- * requirements.\n
- * e.g. if you use gcc and need 32 bit alignment:\n
- * \#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[size] \_\_attribute\_\_((aligned(4)))\n
- * or more portable:\n
+ * requirements.<br>
+ * e.g. if you use gcc and need 32 bit alignment:<br>
+ * \#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[size] \_\_attribute\_\_((aligned(4)))<br>
+ * or more portable:<br>
  * \#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u32_t variable_name[(size + sizeof(u32_t) - 1) / sizeof(u32_t)]
  */
 #ifndef LWIP_DECLARE_MEMORY_ALIGNED
@@ -299,8 +299,8 @@
 #endif
 
 /** Packed structs support.
-  * Placed BEFORE declaration of a packed struct.\n
-  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n
+  * Placed BEFORE declaration of a packed struct.<br>
+  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br>
   * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.
   */
 #ifndef PACK_STRUCT_BEGIN
@@ -308,8 +308,8 @@
 #endif /* PACK_STRUCT_BEGIN */
 
 /** Packed structs support.
-  * Placed AFTER declaration of a packed struct.\n
-  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n
+  * Placed AFTER declaration of a packed struct.<br>
+  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br>
   * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.
   */
 #ifndef PACK_STRUCT_END
@@ -317,8 +317,8 @@
 #endif /* PACK_STRUCT_END */
 
 /** Packed structs support.
-  * Placed between end of declaration of a packed struct and trailing semicolon.\n
-  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n
+  * Placed between end of declaration of a packed struct and trailing semicolon.<br>
+  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br>
   * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.
   */
 #ifndef PACK_STRUCT_STRUCT
@@ -330,8 +330,8 @@
 #endif /* PACK_STRUCT_STRUCT */
 
 /** Packed structs support.
-  * Wraps u32_t and u16_t members.\n
-  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n
+  * Wraps u32_t and u16_t members.<br>
+  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br>
   * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.
   */
 #ifndef PACK_STRUCT_FIELD
@@ -339,8 +339,8 @@
 #endif /* PACK_STRUCT_FIELD */
 
 /** Packed structs support.
-  * Wraps u8_t members, where some compilers warn that packing is not necessary.\n
-  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n
+  * Wraps u8_t members, where some compilers warn that packing is not necessary.<br>
+  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br>
   * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.
   */
 #ifndef PACK_STRUCT_FLD_8
@@ -348,20 +348,20 @@
 #endif /* PACK_STRUCT_FLD_8 */
 
 /** Packed structs support.
-  * Wraps members that are packed structs themselves, where some compilers warn that packing is not necessary.\n
-  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n
+  * Wraps members that are packed structs themselves, where some compilers warn that packing is not necessary.<br>
+  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br>
   * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.
   */
 #ifndef PACK_STRUCT_FLD_S
 #define PACK_STRUCT_FLD_S(x) PACK_STRUCT_FIELD(x)
 #endif /* PACK_STRUCT_FLD_S */
 
-/** PACK_STRUCT_USE_INCLUDES==1: Packed structs support using \#include files before and after struct to be packed.\n
- * The file included BEFORE the struct is "arch/bpstruct.h".\n
- * The file included AFTER the struct is "arch/epstruct.h".\n
+/** PACK_STRUCT_USE_INCLUDES==1: Packed structs support using \#include files before and after struct to be packed.<br>
+ * The file included BEFORE the struct is "arch/bpstruct.h".<br>
+ * The file included AFTER the struct is "arch/epstruct.h".<br>
  * This can be used to implement struct packing on MS Visual C compilers, see
- * the Win32 port in the lwIP contrib repository for reference.
- * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n
+ * the Win32 port in the lwIP/contrib subdir for reference.
+ * For examples of packed struct declarations, see include/lwip/prot/ subfolder.<br>
  * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.
  */
 #ifdef __DOXYGEN__
@@ -382,6 +382,15 @@
 #define LWIP_PROVIDE_ERRNO
 #endif
 
+/* Use a special, reproducable version of rand() for fuzz tests? */
+#ifdef LWIP_RAND_FOR_FUZZ
+#ifdef LWIP_RAND
+#undef LWIP_RAND
+#endif
+u32_t lwip_fuzz_rand(void);
+#define LWIP_RAND() lwip_fuzz_rand()
+#endif
+
 /**
  * @}
  */
diff --git a/src/include/lwip/autoip.h b/src/include/lwip/autoip.h
index 1d85bcc..b3f9feb 100644
--- a/src/include/lwip/autoip.h
+++ b/src/include/lwip/autoip.h
@@ -48,15 +48,12 @@
 #include "lwip/netif.h"
 /* #include "lwip/udp.h" */
 #include "lwip/etharp.h"
+#include "lwip/acd.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/** AutoIP Timing */
-#define AUTOIP_TMR_INTERVAL      100
-#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL)
-
 /** AutoIP state information per netif */
 struct autoip
 {
@@ -64,26 +61,20 @@
   ip4_addr_t llipaddr;
   /** current AutoIP state machine state */
   u8_t state;
-  /** sent number of probes or announces, dependent on state */
-  u8_t sent_num;
-  /** ticks to wait, tick is AUTOIP_TMR_INTERVAL long */
-  u16_t ttw;
-  /** ticks until a conflict can be solved by defending */
-  u8_t lastconflict;
   /** total number of probed/used Link Local IP-Addresses */
   u8_t tried_llipaddr;
+  /** acd struct */
+  struct acd acd;
 };
 
 
 void autoip_set_struct(struct netif *netif, struct autoip *autoip);
-/** Remove a struct autoip previously set to the netif using autoip_set_struct() */
-#define autoip_remove_struct(netif) do { (netif)->autoip = NULL; } while (0)
+void autoip_remove_struct(struct netif *netif);
 err_t autoip_start(struct netif *netif);
 err_t autoip_stop(struct netif *netif);
-void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr);
-void autoip_tmr(void);
-void autoip_network_changed(struct netif *netif);
-u8_t autoip_supplied_address(const struct netif *netif);
+void autoip_network_changed_link_up(struct netif *netif);
+void autoip_network_changed_link_down(struct netif *netif);
+u8_t autoip_supplied_address(struct netif *netif);
 
 /* for lwIP internal use by ip4.c */
 u8_t autoip_accept_packet(struct netif *netif, const ip4_addr_t *addr);
diff --git a/src/include/lwip/debug.h b/src/include/lwip/debug.h
index 579fd24..0ec7e76 100644
--- a/src/include/lwip/debug.h
+++ b/src/include/lwip/debug.h
@@ -140,11 +140,12 @@
 #endif
 
 #ifdef LWIP_DEBUG
-#define LWIP_DEBUGF(debug, message) do { \
-                               if ( \
-                                   ((debug) & LWIP_DBG_ON) && \
+#define LWIP_DEBUG_ENABLED(debug) (((debug) & LWIP_DBG_ON) && \
                                    ((debug) & LWIP_DBG_TYPES_ON) && \
-                                   ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
+                                   ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL))
+
+#define LWIP_DEBUGF(debug, message) do { \
+                               if (LWIP_DEBUG_ENABLED(debug)) { \
                                  LWIP_PLATFORM_DIAG(message); \
                                  if ((debug) & LWIP_DBG_HALT) { \
                                    while(1); \
@@ -153,6 +154,7 @@
                              } while(0)
 
 #else  /* LWIP_DEBUG */
+#define LWIP_DEBUG_ENABLED(debug) 0
 #define LWIP_DEBUGF(debug, message)
 #endif /* LWIP_DEBUG */
 
diff --git a/src/include/lwip/def.h b/src/include/lwip/def.h
index dfb266d..d6bf763 100644
--- a/src/include/lwip/def.h
+++ b/src/include/lwip/def.h
@@ -144,6 +144,10 @@
 /* This can be #defined to strnstr() depending on your platform */
 char* lwip_strnstr(const char* buffer, const char* token, size_t n);
 #endif
+#ifndef lwip_strnistr
+/* This can be #defined to strnistr() depending on your platform */
+char* lwip_strnistr(const char* buffer, const char* token, size_t n);
+#endif
 
 #ifdef __cplusplus
 }
diff --git a/src/include/lwip/dhcp.h b/src/include/lwip/dhcp.h
index c78aa0b..b413fa6 100644
--- a/src/include/lwip/dhcp.h
+++ b/src/include/lwip/dhcp.h
@@ -45,12 +45,25 @@
 #include "lwip/netif.h"
 #include "lwip/udp.h"
 
+#if LWIP_DHCP_DOES_ACD_CHECK
+#include "lwip/acd.h"
+#endif /* LWIP_DHCP_DOES_ACD_CHECK */
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+/** Define DHCP_TIMEOUT_SIZE_T in opt.h if you want use a different integer than u16_t.
+ *  Especially useful if DHCP_COARSE_TIMER_SECS is in smaller units, so timeouts easily reach UINT16_MAX and more */
+#ifdef DHCP_TIMEOUT_SIZE_T
+typedef DHCP_TIMEOUT_SIZE_T dhcp_timeout_t;
+#else /* DHCP_TIMEOUT_SIZE_T */
+typedef u16_t dhcp_timeout_t;
+#endif /* DHCP_TIMEOUT_SIZE_T*/
 /** period (in seconds) of the application calling dhcp_coarse_tmr() */
+#ifndef DHCP_COARSE_TIMER_SECS
 #define DHCP_COARSE_TIMER_SECS  60
+#endif /* DHCP_COARSE_TIMER_SECS */
 /** period (in milliseconds) of the application calling dhcp_coarse_tmr() */
 #define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL)
 /** period (in milliseconds) of the application calling dhcp_fine_tmr() */
@@ -58,6 +71,9 @@
 
 #define DHCP_BOOT_FILE_LEN      128U
 
+#define DHCP_FLAG_SUBNET_MASK_GIVEN 0x01
+#define DHCP_FLAG_EXTERNAL_MEM      0x02
+
 /* AutoIP cooperation flags (struct dhcp.autoip_coop_state) */
 typedef enum {
   DHCP_AUTOIP_COOP_STATE_OFF  = 0,
@@ -74,18 +90,16 @@
   u8_t state;
   /** retries of current request */
   u8_t tries;
-#if LWIP_DHCP_AUTOIP_COOP
-  u8_t autoip_coop_state;
-#endif
-  u8_t subnet_mask_given;
+  /** see DHCP_FLAG_* */
+  u8_t flags;
 
-  u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */
-  u16_t t1_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */
-  u16_t t2_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */
-  u16_t t1_renew_time;  /* #ticks with period DHCP_COARSE_TIMER_SECS until next renew try */
-  u16_t t2_rebind_time; /* #ticks with period DHCP_COARSE_TIMER_SECS until next rebind try */
-  u16_t lease_used; /* #ticks with period DHCP_COARSE_TIMER_SECS since last received DHCP ack */
-  u16_t t0_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for lease time */
+  dhcp_timeout_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */
+  dhcp_timeout_t t1_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */
+  dhcp_timeout_t t2_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */
+  dhcp_timeout_t t1_renew_time;  /* #ticks with period DHCP_COARSE_TIMER_SECS until next renew try */
+  dhcp_timeout_t t2_rebind_time; /* #ticks with period DHCP_COARSE_TIMER_SECS until next rebind try */
+  dhcp_timeout_t lease_used; /* #ticks with period DHCP_COARSE_TIMER_SECS since last received DHCP ack */
+  dhcp_timeout_t t0_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for lease time */
   ip_addr_t server_ip_addr; /* dhcp server address that offered this lease (ip_addr_t because passed to UDP) */
   ip4_addr_t offered_ip_addr;
   ip4_addr_t offered_sn_mask;
@@ -98,6 +112,10 @@
   ip4_addr_t offered_si_addr;
   char boot_file_name[DHCP_BOOT_FILE_LEN];
 #endif /* LWIP_DHCP_BOOTPFILE */
+#if LWIP_DHCP_DOES_ACD_CHECK
+  /** acd struct */
+  struct acd acd;
+#endif /* LWIP_DHCP_DOES_ACD_CHECK */
 };
 
 
@@ -111,10 +129,8 @@
 void dhcp_stop(struct netif *netif);
 void dhcp_release_and_stop(struct netif *netif);
 void dhcp_inform(struct netif *netif);
-void dhcp_network_changed(struct netif *netif);
-#if DHCP_DOES_ARP_CHECK
-void dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr);
-#endif
+void dhcp_network_changed_link_up(struct netif *netif);
+
 u8_t dhcp_supplied_address(const struct netif *netif);
 /* to be called every minute */
 void dhcp_coarse_tmr(void);
diff --git a/src/include/lwip/etharp.h b/src/include/lwip/etharp.h
index 2036b24..48a1d22 100644
--- a/src/include/lwip/etharp.h
+++ b/src/include/lwip/etharp.h
@@ -88,6 +88,11 @@
 #define etharp_gratuitous(netif) etharp_request((netif), netif_ip4_addr(netif))
 void etharp_cleanup_netif(struct netif *netif);
 
+#if LWIP_ACD
+err_t etharp_acd_probe(struct netif *netif, const ip4_addr_t *ipaddr);
+err_t etharp_acd_announce(struct netif *netif, const ip4_addr_t *ipaddr);
+#endif /* LWIP_ACD */
+
 #if ETHARP_SUPPORT_STATIC_ENTRIES
 err_t etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr);
 err_t etharp_remove_static_entry(const ip4_addr_t *ipaddr);
diff --git a/src/include/lwip/igmp.h b/src/include/lwip/igmp.h
index ffd80e6..0a16db0 100644
--- a/src/include/lwip/igmp.h
+++ b/src/include/lwip/igmp.h
@@ -99,7 +99,7 @@
 err_t  igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr);
 void   igmp_tmr(void);
 
-/** @ingroup igmp 
+/** @ingroup igmp
  * Get list head of IGMP groups for netif.
  * Note: The allsystems group IP is contained in the list as first entry.
  * @see @ref netif_set_igmp_mac_filter()
diff --git a/src/include/lwip/inet.h b/src/include/lwip/inet.h
index 2982a0f..0970885 100644
--- a/src/include/lwip/inet.h
+++ b/src/include/lwip/inet.h
@@ -41,6 +41,11 @@
 #define LWIP_HDR_INET_H
 
 #include "lwip/opt.h"
+
+#if LWIP_SOCKET_EXTERNAL_HEADERS
+#include LWIP_SOCKET_EXTERNAL_HEADER_INET_H
+#else /* LWIP_SOCKET_EXTERNAL_HEADERS */
+
 #include "lwip/def.h"
 #include "lwip/ip_addr.h"
 #include "lwip/ip6_addr.h"
@@ -120,6 +125,18 @@
 
 #define IN_LOOPBACKNET      IP_LOOPBACKNET
 
+#define IN6_IS_ADDR_UNSPECIFIED(a)  ip6_addr_isany((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_LOOPBACK(a)     ip6_addr_isloopback((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_MULTICAST(a)    ip6_addr_ismulticast((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_LINKLOCAL(a)    ip6_addr_islinklocal((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_SITELOCAL(a)    ip6_addr_issitelocal((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_V4MAPPED(a)     ip6_addr_isipv4mappedipv6((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_V4COMPAT(a)     ip6_addr_isipv4compat((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_MC_NODELOCAL(a) ip6_addr_ismulticast_iflocal((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_MC_LINKLOCAL(a) ip6_addr_ismulticast_linklocal((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_MC_SITELOCAL(a) ip6_addr_ismulticast_sitelocal((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_MC_ORGLOCAL(a)  ip6_addr_ismulticast_orglocal((ip6_addr_t*)(a))
+#define IN6_IS_ADDR_MC_GLOBAL(a)    ip6_addr_ismulticast_global((ip6_addr_t*)(a))
 
 #ifndef INET_ADDRSTRLEN
 #define INET_ADDRSTRLEN     IP4ADDR_STRLEN_MAX
@@ -166,4 +183,6 @@
 }
 #endif
 
+#endif /* LWIP_SOCKET_EXTERNAL_HEADERS */
+
 #endif /* LWIP_HDR_INET_H */
diff --git a/src/include/lwip/inet_chksum.h b/src/include/lwip/inet_chksum.h
index 76893ef..33296d2 100644
--- a/src/include/lwip/inet_chksum.h
+++ b/src/include/lwip/inet_chksum.h
@@ -102,4 +102,3 @@
 #endif
 
 #endif /* LWIP_HDR_INET_H */
-
diff --git a/src/include/lwip/init.h b/src/include/lwip/init.h
index 6cabfc8..43e5e04 100644
--- a/src/include/lwip/init.h
+++ b/src/include/lwip/init.h
@@ -52,9 +52,9 @@
 /** X.x.x: Major version of the stack */
 #define LWIP_VERSION_MAJOR      2
 /** x.X.x: Minor version of the stack */
-#define LWIP_VERSION_MINOR      1
+#define LWIP_VERSION_MINOR      2
 /** x.x.X: Revision of the stack */
-#define LWIP_VERSION_REVISION   3
+#define LWIP_VERSION_REVISION   0
 /** For release candidates, this is set to 1..254
   * For official releases, this is set to 255 (LWIP_RC_RELEASE)
   * For development versions (Git), this is set to 0 (LWIP_RC_DEVELOPMENT) */
diff --git a/src/include/lwip/ip.h b/src/include/lwip/ip.h
index 653c3b2..668d831 100644
--- a/src/include/lwip/ip.h
+++ b/src/include/lwip/ip.h
@@ -93,6 +93,17 @@
   IP_PCB;
 };
 
+#if LWIP_VLAN_PCP
+#define pcb_has_tci(pcb) ((pcb)->netif_hints.tci >= 0)
+#define pcb_tci_get(pcb) ((pcb)->netif_hints.tci)
+#define pcb_tci_clear(pcb) do { (pcb)->netif_hints.tci = -1; } while(0)
+#define pcb_tci_set(pcb, tci_val) do { (pcb)->netif_hints.tci = (tci_val) & 0xffff; } while(0)
+#define pcb_tci_set_pcp_dei_vid(pcb, pcp, dei, vid) pcb_tci_set(pcb, (((pcp) & 7) << 13) | (((dei) & 1) << 12) | ((vid) & 0xFFF))
+#define pcb_tci_init(pcb) pcb_tci_clear(pcb)
+#else
+#define pcb_tci_init(pcb)
+#endif
+
 /*
  * Option flags per-socket. These are the same like SO_XXX in sockets.h
  */
@@ -326,5 +337,3 @@
 #endif
 
 #endif /* LWIP_HDR_IP_H */
-
-
diff --git a/src/include/lwip/ip4.h b/src/include/lwip/ip4.h
index fd35a33..4d7228d 100644
--- a/src/include/lwip/ip4.h
+++ b/src/include/lwip/ip4.h
@@ -107,5 +107,3 @@
 #endif /* LWIP_IPV4 */
 
 #endif /* LWIP_HDR_IP_H */
-
-
diff --git a/src/include/lwip/ip4_addr.h b/src/include/lwip/ip4_addr.h
index f244c4f..9fd8a0a 100644
--- a/src/include/lwip/ip4_addr.h
+++ b/src/include/lwip/ip4_addr.h
@@ -132,17 +132,26 @@
 
 /**
  * Determine if two address are on the same network.
+ * @deprecated Renamed to @ref ip4_addr_net_eq
+ */
+#define ip4_addr_netcmp(addr1, addr2, mask) ip4_addr_net_eq(addr1, addr2, mask)
+/**
+ * Determine if two address are on the same network.
  *
  * @arg addr1 IP address 1
  * @arg addr2 IP address 2
  * @arg mask network identifier mask
  * @return !0 if the network identifiers of both address match
  */
-#define ip4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
+#define ip4_addr_net_eq(addr1, addr2, mask) (((addr1)->addr & \
                                               (mask)->addr) == \
                                              ((addr2)->addr & \
                                               (mask)->addr))
-#define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)
+/**
+ * @deprecated Renamed to ip4_addr_eq
+ */
+#define ip4_addr_cmp(addr1, addr2) ip4_addr_eq(addr1, addr2)
+#define ip4_addr_eq(addr1, addr2) ((addr1)->addr == (addr2)->addr)
 
 #define ip4_addr_isany_val(addr1)   ((addr1).addr == IPADDR_ANY)
 #define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1)))
diff --git a/src/include/lwip/ip6_addr.h b/src/include/lwip/ip6_addr.h
index 29c2a34..5937fed 100644
--- a/src/include/lwip/ip6_addr.h
+++ b/src/include/lwip/ip6_addr.h
@@ -146,29 +146,41 @@
                                         ip6_addr_set_zone((dest), (src) == NULL ? IP6_NO_ZONE : ip6_addr_zone(src));}while(0)
 
 
+/** @deprecated Renamed to @ref ip6_addr_net_zoneless_eq */
+#define ip6_addr_netcmp_zoneless(addr1, addr2) ip6_addr_net_zoneless_eq(addr1, addr2)
 /** Compare IPv6 networks, ignoring zone information. To be used sparingly! */
-#define ip6_addr_netcmp_zoneless(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
+#define ip6_addr_net_zoneless_eq(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
                                                ((addr1)->addr[1] == (addr2)->addr[1]))
 
 /**
  * Determine if two IPv6 address are on the same network.
+ * @deprecated Renamed to @ref ip6_addr_net_eq
+ */
+#define ip6_addr_netcmp(addr1, addr2) ip6_addr_net_eq(addr1, addr2)
+/**
+ * Determine if two IPv6 address are on the same network.
  *
  * @param addr1 IPv6 address 1
  * @param addr2 IPv6 address 2
  * @return 1 if the network identifiers of both address match, 0 if not
  */
-#define ip6_addr_netcmp(addr1, addr2) (ip6_addr_netcmp_zoneless((addr1), (addr2)) && \
-                                       ip6_addr_cmp_zone((addr1), (addr2)))
+#define ip6_addr_net_eq(addr1, addr2) (ip6_addr_net_zoneless_eq((addr1), (addr2)) && \
+                                       ip6_addr_zone_eq((addr1), (addr2)))
 
-/* Exact-host comparison *after* ip6_addr_netcmp() succeeded, for efficiency. */
-#define ip6_addr_nethostcmp(addr1, addr2) (((addr1)->addr[2] == (addr2)->addr[2]) && \
+#define ip6_addr_nethostcmp(addr1, addr2) ip6_addr_nethost_eq(addr1, addr2)
+/* Exact-host comparison *after* ip6_addr_net_eq() succeeded, for efficiency. */
+#define ip6_addr_nethost_eq(addr1, addr2) (((addr1)->addr[2] == (addr2)->addr[2]) && \
                                            ((addr1)->addr[3] == (addr2)->addr[3]))
 
+/** @deprecated Renamed to @ref ip6_addr_zoneless_eq */
+#define ip6_addr_cmp_zoneless(addr1, addr2) ip6_addr_zoneless_eq(addr1, addr2)
 /** Compare IPv6 addresses, ignoring zone information. To be used sparingly! */
-#define ip6_addr_cmp_zoneless(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
+#define ip6_addr_zoneless_eq(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
                                     ((addr1)->addr[1] == (addr2)->addr[1]) && \
                                     ((addr1)->addr[2] == (addr2)->addr[2]) && \
                                     ((addr1)->addr[3] == (addr2)->addr[3]))
+/** @deprecated Renamed to @ref ip6_addr_eq */
+#define ip6_addr_cmp(addr1, addr2) ip6_addr_eq(addr1, addr2)
 /**
  * Determine if two IPv6 addresses are the same. In particular, the address
  * part of both must be the same, and the zone must be compatible.
@@ -177,11 +189,13 @@
  * @param addr2 IPv6 address 2
  * @return 1 if the addresses are considered equal, 0 if not
  */
-#define ip6_addr_cmp(addr1, addr2) (ip6_addr_cmp_zoneless((addr1), (addr2)) && \
-                                    ip6_addr_cmp_zone((addr1), (addr2)))
+#define ip6_addr_eq(addr1, addr2) (ip6_addr_zoneless_eq((addr1), (addr2)) && \
+                                    ip6_addr_zone_eq((addr1), (addr2)))
 
+/** @deprecated Renamed to @ref ip6_addr_packed_eq */
+#define ip6_addr_cmp_packed(ip6addr, paddr, zone_idx) ip6_addr_packed_eq(ip6addr, paddr, zone_idx)
 /** Compare IPv6 address to packed address and zone */
-#define ip6_addr_cmp_packed(ip6addr, paddr, zone_idx) (((ip6addr)->addr[0] == (paddr)->addr[0]) && \
+#define ip6_addr_packed_eq(ip6addr, paddr, zone_idx) (((ip6addr)->addr[0] == (paddr)->addr[0]) && \
                                     ((ip6addr)->addr[1] == (paddr)->addr[1]) && \
                                     ((ip6addr)->addr[2] == (paddr)->addr[2]) && \
                                     ((ip6addr)->addr[3] == (paddr)->addr[3]) && \
@@ -210,6 +224,11 @@
 
 #define ip6_addr_isipv4mappedipv6(ip6addr) (((ip6addr)->addr[0] == 0) && ((ip6addr)->addr[1] == 0) && (((ip6addr)->addr[2]) == PP_HTONL(0x0000FFFFUL)))
 
+#define ip6_addr_isipv4compat(ip6addr) (((ip6addr)->addr[0] == 0UL) && \
+                                        ((ip6addr)->addr[1] == 0UL) && \
+                                        ((ip6addr)->addr[2] == 0UL) && \
+                                        (htonl((ip6addr)->addr[3]) > 1))
+
 #define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL))
 #define ip6_addr_multicast_transient_flag(ip6addr)  ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL))
 #define ip6_addr_multicast_prefix_flag(ip6addr)     ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL))
@@ -274,7 +293,8 @@
                 (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id)); \
                 ip6_addr_clear_zone(ip6addr); }while(0)
 
-#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
+#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) ip6_addr_solicitednode_eq(ip6addr, sn_addr)
+#define ip6_addr_solicitednode_eq(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
                                     ((ip6addr)->addr[1] == 0) && \
                                     ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
                                     ((ip6addr)->addr[3] == (PP_HTONL(0xff000000UL) | (sn_addr)->addr[3])))
diff --git a/src/include/lwip/ip6_zone.h b/src/include/lwip/ip6_zone.h
index 525790e..834c32f 100644
--- a/src/include/lwip/ip6_zone.h
+++ b/src/include/lwip/ip6_zone.h
@@ -123,9 +123,11 @@
 /** Is the zone field of the given IPv6 address equal to the given zone index? (0/1) */
 #define ip6_addr_equals_zone(ip6addr, zone_idx) ((ip6addr)->zone == (zone_idx))
 
+/** @deprecated Renamed to @ref ip6_addr_zone_eq */
+#define ip6_addr_cmp_zone(addr1, addr2) ip6_addr_zone_eq(ip6addr1, ip6addr2)
 /** Are the zone fields of the given IPv6 addresses equal? (0/1)
  * This macro must only be used on IPv6 addresses of the same scope. */
-#define ip6_addr_cmp_zone(ip6addr1, ip6addr2) ((ip6addr1)->zone == (ip6addr2)->zone)
+#define ip6_addr_zone_eq(ip6addr1, ip6addr2) ((ip6addr1)->zone == (ip6addr2)->zone)
 
 /** Symbolic constants for the 'type' parameters in some of the macros.
  * These exist for efficiency only, allowing the macros to avoid certain tests
@@ -265,7 +267,7 @@
 #define ip6_addr_clear_zone(ip6addr)
 #define ip6_addr_copy_zone(ip6addr1, ip6addr2)
 #define ip6_addr_equals_zone(ip6addr, zone_idx) (1)
-#define ip6_addr_cmp_zone(ip6addr1, ip6addr2) (1)
+#define ip6_addr_zone_eq(ip6addr1, ip6addr2) (1)
 #define IPV6_CUSTOM_SCOPES 0
 #define ip6_addr_has_scope(ip6addr, type) (0)
 #define ip6_addr_assign_zone(ip6addr, type, netif)
diff --git a/src/include/lwip/ip_addr.h b/src/include/lwip/ip_addr.h
index 2f97770..b0b5509 100644
--- a/src/include/lwip/ip_addr.h
+++ b/src/include/lwip/ip_addr.h
@@ -164,10 +164,10 @@
 /** @ingroup ipaddr */
 #define ip_addr_set_zero(ipaddr)     do{ \
   ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0)
-/** @ingroup ip5addr */
+/** @ingroup ipaddr */
 #define ip_addr_set_zero_ip4(ipaddr)     do{ \
   ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }while(0)
-/** @ingroup ip6addr */
+/** @ingroup ipaddr */
 #define ip_addr_set_zero_ip6(ipaddr)     do{ \
   ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }while(0)
 /** @ingroup ipaddr */
@@ -194,39 +194,63 @@
 #define ip_addr_get_network(target, host, netmask) do{if(IP_IS_V6(host)){ \
   ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \
   ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); IP_SET_TYPE(target, IPADDR_TYPE_V4); }}while(0)
-/** @ingroup ipaddr */
-#define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \
+/**
+ * @ingroup ipaddr
+ * @deprecated Renamed to @ref ip_addr_net_eq
+ */
+#define ip_addr_netcmp(addr1, addr2, mask) ip_addr_net_eq((addr1), (addr2), (mask))
+/** @ingroup ipaddr
+ *  Check if two ip addresses are share the same network, for a specific netmask. */
+#define ip_addr_net_eq(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \
   0 : \
-  ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))
-/** @ingroup ipaddr */
-#define ip_addr_cmp(addr1, addr2)    ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
-  ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
-  ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))
-/** @ingroup ipaddr */
-#define ip_addr_cmp_zoneless(addr1, addr2)    ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
-  ip6_addr_cmp_zoneless(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
-  ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))
-/** @ingroup ipaddr */
+  ip4_addr_net_eq(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))
+/**
+ * @ingroup ipaddr
+ * @deprecated Renamed to @ref ip_addr_eq
+ */
+#define ip_addr_cmp(addr1, addr2) ip_addr_eq((addr1), (addr2))
+/** @ingroup ipaddr
+ *  Check if two ip addresses are equal. */
+#define ip_addr_eq(addr1, addr2)    ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
+  ip6_addr_eq(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
+  ip4_addr_eq(ip_2_ip4(addr1), ip_2_ip4(addr2))))
+/**
+ * @ingroup ipaddr
+ * @deprecated Renamed to @ref ip_addr_zoneless_eq
+ */
+#define ip_addr_cmp_zoneless(addr1, addr2) ip_addr_zoneless_eq((addr1), (addr2))
+/** @ingroup ipaddr
+ *  Check if two ip addresses are equal, ignoring the zone. */
+#define ip_addr_zoneless_eq(addr1, addr2)    ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
+  ip6_addr_zoneless_eq(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
+  ip4_addr_eq(ip_2_ip4(addr1), ip_2_ip4(addr2))))
+/** @ingroup ipaddr
+ *  Check if an ip address is the 'any' address. */
 #define ip_addr_isany(ipaddr)        (((ipaddr) == NULL) ? 1 : ((IP_IS_V6(ipaddr)) ? \
   ip6_addr_isany(ip_2_ip6(ipaddr)) : \
   ip4_addr_isany(ip_2_ip4(ipaddr))))
-/** @ingroup ipaddr */
+/** @ingroup ipaddr
+ *  Check if an ip address is the 'any' address, by value. */
 #define ip_addr_isany_val(ipaddr)        ((IP_IS_V6_VAL(ipaddr)) ? \
   ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \
   ip4_addr_isany_val(*ip_2_ip4(&(ipaddr))))
-/** @ingroup ipaddr */
+/** @ingroup ipaddr
+ *  Check if an ip address is a broadcast address. */
 #define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \
   0 : \
   ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif))
-/** @ingroup ipaddr */
+/** @ingroup ipaddr
+ *  Check inf an ip address is a multicast address. */
 #define ip_addr_ismulticast(ipaddr)  ((IP_IS_V6(ipaddr)) ? \
   ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \
   ip4_addr_ismulticast(ip_2_ip4(ipaddr)))
-/** @ingroup ipaddr */
+/** @ingroup ipaddr
+ *  Check inf an ip address is a loopback address. */
 #define ip_addr_isloopback(ipaddr)  ((IP_IS_V6(ipaddr)) ? \
   ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \
   ip4_addr_isloopback(ip_2_ip4(ipaddr)))
-/** @ingroup ipaddr */
+/** @ingroup ipaddr
+ *  Check inf an ip address is a link-local address. */
 #define ip_addr_islinklocal(ipaddr)  ((IP_IS_V6(ipaddr)) ? \
   ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \
   ip4_addr_islinklocal(ip_2_ip4(ipaddr)))
@@ -295,8 +319,10 @@
 #define ip_addr_set_loopback(is_ipv6, ipaddr)   ip4_addr_set_loopback(ipaddr)
 #define ip_addr_set_hton(dest, src)             ip4_addr_set_hton(dest, src)
 #define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask)
-#define ip_addr_netcmp(addr1, addr2, mask)      ip4_addr_netcmp(addr1, addr2, mask)
-#define ip_addr_cmp(addr1, addr2)               ip4_addr_cmp(addr1, addr2)
+#define ip_addr_netcmp(addr1, addr2, mask)      ip4_addr_net_eq(addr1, addr2, mask)
+#define ip_addr_net_eq(addr1, addr2, mask)      ip4_addr_net_eq(addr1, addr2, mask)
+#define ip_addr_cmp(addr1, addr2)               ip4_addr_eq(addr1, addr2)
+#define ip_addr_eq(addr1, addr2)                ip4_addr_eq(addr1, addr2)
 #define ip_addr_isany(ipaddr)                   ip4_addr_isany(ipaddr)
 #define ip_addr_isany_val(ipaddr)               ip4_addr_isany_val(ipaddr)
 #define ip_addr_isloopback(ipaddr)              ip4_addr_isloopback(ipaddr)
@@ -343,8 +369,11 @@
 #define ip_addr_set_hton(dest, src)             ip6_addr_set_hton(dest, src)
 #define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target)
 #define ip_addr_netcmp(addr1, addr2, mask)      0
-#define ip_addr_cmp(addr1, addr2)               ip6_addr_cmp(addr1, addr2)
-#define ip_addr_cmp_zoneless(addr1, addr2)      ip6_addr_cmp_zoneless(addr1, addr2)
+#define ip_addr_net_eq(addr1, addr2, mask)      0
+#define ip_addr_cmp(addr1, addr2)               ip6_addr_eq(addr1, addr2)
+#define ip_addr_eq(addr1, addr2)                ip6_addr_eq(addr1, addr2)
+#define ip_addr_cmp_zoneless(addr1, addr2)      ip6_addr_zoneless_eq(addr1, addr2)
+#define ip_addr_zoneless_eq(addr1, addr2)       ip6_addr_zoneless_eq(addr1, addr2)
 #define ip_addr_isany(ipaddr)                   ip6_addr_isany(ipaddr)
 #define ip_addr_isany_val(ipaddr)               ip6_addr_isany_val(ipaddr)
 #define ip_addr_isloopback(ipaddr)              ip6_addr_isloopback(ipaddr)
@@ -404,7 +433,7 @@
 
 extern const ip_addr_t ip6_addr_any;
 
-/** 
+/**
  * @ingroup ip6addr
  * IP6_ADDR_ANY can be used as a fixed ip_addr_t
  * for the IPv6 wildcard address
@@ -424,8 +453,9 @@
 
 #endif
 
+/** @ingroup ipaddr
+ *  Macro representing the 'any' address. */
 #if LWIP_IPV4 && LWIP_IPV6
-/** @ingroup ipaddr */
 #define IP_ANY_TYPE    (&ip_addr_any_type)
 #else
 #define IP_ANY_TYPE    IP_ADDR_ANY
diff --git a/src/include/lwip/mld6.h b/src/include/lwip/mld6.h
index 7fa0797..2764fdd 100644
--- a/src/include/lwip/mld6.h
+++ b/src/include/lwip/mld6.h
@@ -84,7 +84,7 @@
 
 /** @ingroup mld6
  * Get list head of MLD6 groups for netif.
- * Note: The allnodes group IP is NOT in the list, since it must always 
+ * Note: The allnodes group IP is NOT in the list, since it must always
  * be received for correct IPv6 operation.
  * @see @ref netif_set_mld_mac_filter()
  */
diff --git a/src/include/lwip/netif.h b/src/include/lwip/netif.h
index 9a16ded..0cde2c2 100644
--- a/src/include/lwip/netif.h
+++ b/src/include/lwip/netif.h
@@ -119,6 +119,9 @@
 #if LWIP_AUTOIP
    LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP,
 #endif
+#if LWIP_ACD
+   LWIP_NETIF_CLIENT_DATA_INDEX_ACD,
+#endif
 #if LWIP_IGMP
    LWIP_NETIF_CLIENT_DATA_INDEX_IGMP,
 #endif
@@ -245,14 +248,20 @@
 #define NETIF_ADDR_IDX_MAX 0x7F
 #endif
 
+#if LWIP_NETIF_HWADDRHINT || LWIP_VLAN_PCP
+ #define LWIP_NETIF_USE_HINTS              1
+ struct netif_hint {
 #if LWIP_NETIF_HWADDRHINT
-#define LWIP_NETIF_USE_HINTS              1
-struct netif_hint {
-  netif_addr_idx_t addr_hint;
-};
-#else /* LWIP_NETIF_HWADDRHINT */
-#define LWIP_NETIF_USE_HINTS              0
-#endif /* LWIP_NETIF_HWADDRHINT */
+   u8_t addr_hint;
+#endif
+#if LWIP_VLAN_PCP
+  /** VLAN hader is set if this is >= 0 (but must be <= 0xFFFF) */
+  s32_t tci;
+#endif
+ };
+#else /* LWIP_NETIF_HWADDRHINT || LWIP_VLAN_PCP */
+ #define LWIP_NETIF_USE_HINTS              0
+#endif /* LWIP_NETIF_HWADDRHINT || LWIP_VLAN_PCP*/
 
 /** Generic data structure used for all lwIP network interfaces.
  *  The following fields should be filled in by the initialization
@@ -345,7 +354,7 @@
   u8_t flags;
   /** descriptive abbreviation */
   char name[2];
-  /** number of this interface. Used for @ref if_api and @ref netifapi_netif, 
+  /** number of this interface. Used for @ref if_api and @ref netifapi_netif,
    * as well as for IPv6 zones */
   u8_t num;
 #if LWIP_IPV6_AUTOCONFIG
@@ -376,6 +385,9 @@
       filter table of the ethernet MAC. */
   netif_mld_mac_filter_fn mld_mac_filter;
 #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
+#if LWIP_ACD
+  struct acd *acd_list;
+#endif /* LWIP_ACD */
 #if LWIP_NETIF_USE_HINTS
   struct netif_hint *hints;
 #endif /* LWIP_NETIF_USE_HINTS */
@@ -396,8 +408,10 @@
 #if LWIP_CHECKSUM_CTRL_PER_NETIF
 #define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags) do { \
   (netif)->chksum_flags = chksumflags; } while(0)
-#define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) if (((netif) == NULL) || (((netif)->chksum_flags & (chksumflag)) != 0))
+#define NETIF_CHECKSUM_ENABLED(netif, chksumflag) (((netif) == NULL) || (((netif)->chksum_flags & (chksumflag)) != 0))
+#define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) if NETIF_CHECKSUM_ENABLED(netif, chksumflag)
 #else /* LWIP_CHECKSUM_CTRL_PER_NETIF */
+#define NETIF_CHECKSUM_ENABLED(netif, chksumflag) 0
 #define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags)
 #define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag)
 #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
@@ -488,14 +502,18 @@
 #endif /* LWIP_NETIF_HOSTNAME */
 
 #if LWIP_IGMP
-/** @ingroup netif */
+/** @ingroup netif
+ * Set igmp mac filter function for a netif. */
 #define netif_set_igmp_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->igmp_mac_filter = function; }}while(0)
+/** Get the igmp mac filter function for a netif. */
 #define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL)
 #endif /* LWIP_IGMP */
 
 #if LWIP_IPV6 && LWIP_IPV6_MLD
-/** @ingroup netif */
+/** @ingroup netif
+ * Set mld mac filter function for a netif. */
 #define netif_set_mld_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->mld_mac_filter = function; }}while(0)
+/** Get the mld mac filter function for a netif. */
 #define netif_get_mld_mac_filter(netif) (((netif) != NULL) ? ((netif)->mld_mac_filter) : NULL)
 #define netif_mld_mac_filter(netif, addr, action) do { if((netif) && (netif)->mld_mac_filter) { (netif)->mld_mac_filter((netif), (addr), (action)); }}while(0)
 #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
@@ -575,8 +593,8 @@
 #define LWIP_NSC_NETIF_REMOVED            0x0002
 /** link changed */
 #define LWIP_NSC_LINK_CHANGED             0x0004
-/** netif administrative status changed.\n
-  * up is called AFTER netif is set up.\n
+/** netif administrative status changed.<br>
+  * up is called AFTER netif is set up.<br>
   * down is called BEFORE the netif is actually set down. */
 #define LWIP_NSC_STATUS_CHANGED           0x0008
 /** IPv4 address has changed */
@@ -591,6 +609,8 @@
 #define LWIP_NSC_IPV6_SET                 0x0100
 /** IPv6 address state has changed */
 #define LWIP_NSC_IPV6_ADDR_STATE_CHANGED  0x0200
+/** IPv4 settings: valid address set, application may start to communicate */
+#define LWIP_NSC_IPV4_ADDR_VALID          0x0400
 
 /** @ingroup netif
  * Argument supplied to netif_ext_callback_fn.
@@ -666,6 +686,11 @@
 #define netif_invoke_ext_callback(netif, reason, args)
 #endif
 
+#if LWIP_TESTMODE && LWIP_HAVE_LOOPIF
+struct netif* netif_get_loopif(void);
+#endif
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/netifapi.h b/src/include/lwip/netifapi.h
index e063179..1730872 100644
--- a/src/include/lwip/netifapi.h
+++ b/src/include/lwip/netifapi.h
@@ -56,6 +56,11 @@
   /* Other entry types can be added here */
 };
 
+/**
+ * @defgroup netifapi_arp ARP
+ * @ingroup netifapi
+ */
+
 /** @ingroup netifapi_arp */
 err_t netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type);
 /** @ingroup netifapi_arp */
diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h
index d8c82d1..c27dd03 100644
--- a/src/include/lwip/opt.h
+++ b/src/include/lwip/opt.h
@@ -227,14 +227,7 @@
 #define LWIP_ASSERT_CORE_LOCKED()
 #endif
 
-/**
- * Called as first thing in the lwIP TCPIP thread. Can be used in conjunction
- * with @ref LWIP_ASSERT_CORE_LOCKED to check core locking.
- * @see @ref multithreading
- */
-#if !defined LWIP_MARK_TCPIP_THREAD || defined __DOXYGEN__
-#define LWIP_MARK_TCPIP_THREAD()
-#endif
+
 /**
  * @}
  */
@@ -505,7 +498,7 @@
  * The number of sys timeouts used by the core stack (not apps)
  * The default number of timeouts is calculated here for all enabled modules.
  */
-#define LWIP_NUM_SYS_TIMEOUT_INTERNAL   (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_NUM_TIMEOUTS + (LWIP_IPV6 * (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD)))
+#define LWIP_NUM_SYS_TIMEOUT_INTERNAL   (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_ACD + LWIP_IGMP + LWIP_DNS + PPP_NUM_TIMEOUTS + (LWIP_IPV6 * (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD + LWIP_IPV6_DHCP6)))
 
 /**
  * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts.
@@ -677,6 +670,20 @@
 #define ETHARP_SUPPORT_VLAN             0
 #endif
 
+/**
+ * LWIP_VLAN_PCP==1: Enable outgoing VLAN taggning of frames on a per-PCB basis
+ * for QoS purposes. With this feature enabled, each PCB has a new variable:
+ * "netif_hints.tci" (Tag Control Identifier).
+ * The TCI contains three fields: VID, CFI and PCP.
+ * - VID is the VLAN ID, which should be set to zero.
+ * - The "CFI" bit is used to enable or disable VLAN tags for the PCB.
+ * - PCP (Priority Code Point) is a 3 bit field used for Ethernet level QoS.
+ * See pcb_tci_*() functions to get/set/clear this.
+ */
+#ifndef LWIP_VLAN_PCP
+#define LWIP_VLAN_PCP                   0
+#endif
+
 /** LWIP_ETHERNET==1: enable ethernet support even though ARP might be disabled
  */
 #if !defined LWIP_ETHERNET || defined __DOXYGEN__
@@ -924,10 +931,10 @@
 #endif /* !LWIP_IPV4 */
 
 /**
- * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address.
+ * LWIP_DHCP_DOES_ACD_CHECK==1: Perform address conflict detection on the dhcp address.
  */
-#if !defined DHCP_DOES_ARP_CHECK || defined __DOXYGEN__
-#define DHCP_DOES_ARP_CHECK             (LWIP_DHCP && LWIP_ARP)
+#if !defined LWIP_DHCP_DOES_ACD_CHECK || defined __DOXYGEN__
+#define LWIP_DHCP_DOES_ACD_CHECK        LWIP_DHCP
 #endif
 
 /**
@@ -961,6 +968,14 @@
 #if !defined LWIP_DHCP_MAX_DNS_SERVERS || defined __DOXYGEN__
 #define LWIP_DHCP_MAX_DNS_SERVERS       DNS_MAX_SERVERS
 #endif
+
+/** LWIP_DHCP_DISCOVER_ADD_HOSTNAME: Set to 1 to include hostname opt in discover packets.
+ * If the hostname is not set in the DISCOVER packet, then some servers might issue an OFFER with hostname
+ * configured and consequently reject the REQUEST with any other hostname.
+ */
+#if !defined LWIP_DHCP_DISCOVER_ADD_HOSTNAME || defined __DOXYGEN__
+#define LWIP_DHCP_DISCOVER_ADD_HOSTNAME 0
+#endif /* LWIP_DHCP_DISCOVER_ADD_HOSTNAME */
 /**
  * @}
  */
@@ -1010,6 +1025,31 @@
  */
 
 /*
+   ------------------------------------
+   ----------- ACD options ------------
+   ------------------------------------
+*/
+/**
+ * @defgroup lwip_opts_acd ACD
+ * @ingroup lwip_opts_ipv4
+ * @{
+ */
+ /**
+  * LWIP_ACD==1: Enable ACD module. ACD module is needed when using AUTOIP.
+  */
+#if !defined LWIP_ACD || defined __DOXYGEN__
+#define LWIP_ACD                     (LWIP_AUTOIP || LWIP_DHCP_DOES_ACD_CHECK)
+#endif
+#if !LWIP_IPV4
+/* disable ACD when IPv4 is disabled */
+#undef LWIP_ACD
+#define LWIP_ACD                     0
+#endif /* !LWIP_IPV4 */
+/**
+ * @}
+ */
+
+/*
    ----------------------------------
    ----- SNMP MIB2 support      -----
    ----------------------------------
@@ -1141,7 +1181,9 @@
  *                                    DNS_LOCAL_HOSTLIST_ELEM("host_ip6", IPADDR6_INIT_HOST(123, 234, 345, 456)}
  *
  *  Instead, you can also use an external function:
- *  \#define DNS_LOOKUP_LOCAL_EXTERN(x) extern err_t my_lookup_function(const char *name, ip_addr_t *addr, u8_t dns_addrtype)
+ *  \#define DNS_LOOKUP_LOCAL_EXTERN(name, namelen, addr, dns_addrtype) my_lookup_function(name, namelen, addr, dns_addrtype)
+ *  with function signature:
+ *  extern err_t my_lookup_function(const char *name, size_t namelen, ip_addr_t *addr, u8_t dns_addrtype)
  *  that looks up the IP address and returns ERR_OK if found (LWIP_DNS_ADDRTYPE_xxx is passed in dns_addrtype).
  */
 #if !defined DNS_LOCAL_HOSTLIST || defined __DOXYGEN__
@@ -1305,6 +1347,15 @@
 #define TCP_CALCULATE_EFF_SEND_MSS      1
 #endif
 
+/**
+ * LWIP_TCP_RTO_TIME: Initial TCP retransmission timeout (ms).
+ * This defaults to 3 seconds as traditionally defined in the TCP protocol.
+ * For improving timely recovery on faster networks, this value could
+ * be lowered down to 1 second (RFC 6298)
+ */
+#if !defined LWIP_TCP_RTO_TIME || defined __DOXYGEN__
+#define LWIP_TCP_RTO_TIME               3000
+#endif
 
 /**
  * TCP_SND_BUF: TCP sender buffer space (bytes).
@@ -1523,13 +1574,13 @@
  * link level header. The default is 14, the standard value for
  * Ethernet.
  */
-#if !defined PBUF_LINK_HLEN || defined __DOXYGEN__
-#if defined LWIP_HOOK_VLAN_SET && !defined __DOXYGEN__
-#define PBUF_LINK_HLEN                  (18 + ETH_PAD_SIZE)
-#else /* LWIP_HOOK_VLAN_SET */
-#define PBUF_LINK_HLEN                  (14 + ETH_PAD_SIZE)
-#endif /* LWIP_HOOK_VLAN_SET */
-#endif
+ #if !defined PBUF_LINK_HLEN || defined __DOXYGEN__
+#if (defined LWIP_HOOK_VLAN_SET || LWIP_VLAN_PCP) && !defined __DOXYGEN__
+ #define PBUF_LINK_HLEN                  (18 + ETH_PAD_SIZE)
+#else /* LWIP_HOOK_VLAN_SET || LWIP_VLAN_PCP */
+ #define PBUF_LINK_HLEN                  (14 + ETH_PAD_SIZE)
+#endif /* LWIP_HOOK_VLAN_SET || LWIP_VLAN_PCP */
+ #endif
 
 /**
  * PBUF_LINK_ENCAPSULATION_HLEN: the number of bytes that should be allocated
@@ -1609,7 +1660,7 @@
 #endif
 
 /**
- * LWIP_NETIF_EXT_STATUS_CALLBACK==1: Support an extended callback function 
+ * LWIP_NETIF_EXT_STATUS_CALLBACK==1: Support an extended callback function
  * for several netif related event that supports multiple subscribers.
  * @see netif_ext_status_callback
  */
@@ -1978,6 +2029,17 @@
 #endif
 
 /**
+ * LWIP_SOCKET_EXTERNAL_HEADERS==1: Use external headers instead of sockets.h
+ * and inet.h. In this case, user must provide its own headers by setting the
+ * values for LWIP_SOCKET_EXTERNAL_HEADER_SOCKETS_H and
+ * LWIP_SOCKET_EXTERNAL_HEADER_INET_H to appropriate include file names and the
+ * whole content of the default sockets.h and inet.h is skipped.
+ */
+#if !defined LWIP_SOCKET_EXTERNAL_HEADERS || defined __DOXYGEN__
+#define LWIP_SOCKET_EXTERNAL_HEADERS    0
+#endif
+
+/**
  * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT
  * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set
  * in seconds. (does not require sockets.c, and will affect tcp.c)
@@ -2394,7 +2456,7 @@
  * All addresses that have a scope according to the default policy (link-local
  * unicast addresses, interface-local and link-local multicast addresses) should
  * now have a zone set on them before being passed to the core API, although
- * lwIP will currently attempt to select a zone on the caller's behalf when 
+ * lwIP will currently attempt to select a zone on the caller's behalf when
  * necessary. Applications that directly assign IPv6 addresses to interfaces
  * (which is NOT recommended) must now ensure that link-local addresses carry
  * the netif's zone. See the new ip6_zone.h header file for more information and
@@ -2756,16 +2818,16 @@
  * the standardized ISN generation algorithm from RFC 6528 (see contrib/adons/tcp_isn),
  * or any other desired algorithm as a replacement.
  * Called from tcp_connect() and tcp_listen_input() when an ISN is needed for
- * a new TCP connection, if TCP support (@ref LWIP_TCP) is enabled.\n
+ * a new TCP connection, if TCP support (@ref LWIP_TCP) is enabled.<br>
  * Signature:\code{.c}
  * u32_t my_hook_tcp_isn(const ip_addr_t* local_ip, u16_t local_port, const ip_addr_t* remote_ip, u16_t remote_port);
  * \endcode
- * - it may be necessary to use "struct ip_addr" (ip4_addr, ip6_addr) instead of "ip_addr_t" in function declarations\n
+ * - it may be necessary to use "struct ip_addr" (ip4_addr, ip6_addr) instead of "ip_addr_t" in function declarations<br>
  * Arguments:
  * - local_ip: pointer to the local IP address of the connection
  * - local_port: local port number of the connection (host-byte order)
  * - remote_ip: pointer to the remote IP address of the connection
- * - remote_port: remote port number of the connection (host-byte order)\n
+ * - remote_port: remote port number of the connection (host-byte order)<br>
  * Return value:
  * - the 32-bit Initial Sequence Number to use for the new TCP connection.
  */
@@ -2791,7 +2853,7 @@
  *         the first 'opt1len' bytes and the rest starts at 'opt2'. opt2len can
  *         be simply calculated: 'opt2len = optlen - opt1len;'
  * - p: input packet, p->payload points to application data (that's why tcp hdr
- *      and options are passed in seperately)
+ *      and options are passed in separately)
  * Return value:
  * - ERR_OK: continue input of this packet as normal
  * - != ERR_OK: drop this packet for input (don't continue input processing)
@@ -3024,18 +3086,18 @@
  * LWIP_HOOK_VLAN_SET:
  * Hook can be used to set prio_vid field of vlan_hdr. If you need to store data
  * on per-netif basis to implement this callback, see @ref netif_cd.
- * Called from ethernet_output() if VLAN support (@ref ETHARP_SUPPORT_VLAN) is enabled.\n
+ * Called from ethernet_output() if VLAN support (@ref ETHARP_SUPPORT_VLAN) is enabled.<br>
  * Signature:\code{.c}
- *   s32_t my_hook_vlan_set(struct netif* netif, struct pbuf* pbuf, const struct eth_addr* src, const struct eth_addr* dst, u16_t eth_type);\n
+ *   s32_t my_hook_vlan_set(struct netif* netif, struct pbuf* pbuf, const struct eth_addr* src, const struct eth_addr* dst, u16_t eth_type);
  * \endcode
  * Arguments:
  * - netif: struct netif that the packet will be sent through
  * - p: struct pbuf packet to be sent
  * - src: source eth address
  * - dst: destination eth address
- * - eth_type: ethernet type to packet to be sent\n
- * 
- * 
+ * - eth_type: ethernet type to packet to be sent<br>
+ *
+ *
  * Return values:
  * - &lt;0: Packet shall not contain VLAN header.
  * - 0 &lt;= return value &lt;= 0xFFFF: Packet shall contain VLAN header. Return value is prio_vid in host byte order.
@@ -3472,6 +3534,13 @@
 #endif
 
 /**
+ * ACD_DEBUG: Enable debugging in acd.c.
+ */
+#if !defined ACD_DEBUG || defined __DOXYGEN__
+#define ACD_DEBUG                       LWIP_DBG_OFF
+#endif
+
+/**
  * DNS_DEBUG: Enable debugging for DNS.
  */
 #if !defined DNS_DEBUG || defined __DOXYGEN__
diff --git a/src/include/lwip/pbuf.h b/src/include/lwip/pbuf.h
index e5daf96..5a4fc88 100644
--- a/src/include/lwip/pbuf.h
+++ b/src/include/lwip/pbuf.h
@@ -55,7 +55,7 @@
 #define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG))
 #endif
 
-/** @ingroup pbuf 
+/** @ingroup pbuf
  * PBUF_NEEDS_COPY(p): return a boolean value indicating whether the given
  * pbuf needs to be copied in order to be kept around beyond the current call
  * stack without risking being corrupted. The default setting provides safety:
diff --git a/src/include/lwip/priv/altcp_priv.h b/src/include/lwip/priv/altcp_priv.h
index d1de9b1..50e6b97 100644
--- a/src/include/lwip/priv/altcp_priv.h
+++ b/src/include/lwip/priv/altcp_priv.h
@@ -1,6 +1,6 @@
 /**
  * @file
- * Application layered TCP connection API (to be used from TCPIP thread)\n
+ * Application layered TCP connection API (to be used from TCPIP thread)<br>
  * This interface mimics the tcp callback API to the application while preventing
  * direct linking (much like virtual functions).
  * This way, an application can make use of other application layer protocols
diff --git a/src/include/lwip/priv/nd6_priv.h b/src/include/lwip/priv/nd6_priv.h
index cc3007d..75d5f02 100644
--- a/src/include/lwip/priv/nd6_priv.h
+++ b/src/include/lwip/priv/nd6_priv.h
@@ -94,6 +94,7 @@
   ip6_addr_t destination_addr;
   ip6_addr_t next_hop_addr;
   u16_t pmtu;
+  u8_t cached_neighbor_idx;
   u32_t age;
 };
 
diff --git a/src/include/lwip/priv/sockets_priv.h b/src/include/lwip/priv/sockets_priv.h
index d8f9904..c604734 100644
--- a/src/include/lwip/priv/sockets_priv.h
+++ b/src/include/lwip/priv/sockets_priv.h
@@ -99,7 +99,7 @@
 /** Maximum optlen used by setsockopt/getsockopt */
 #define LWIP_SETGETSOCKOPT_MAXOPTLEN LWIP_MAX(16, sizeof(struct ifreq))
 
-/** This struct is used to pass data to the set/getsockopt_internal
+/** This struct is used to pass data to the set/getsockopt_impl
  * functions running in tcpip_thread context (only a void* is allowed) */
 struct lwip_setgetsockopt_data {
   /** socket index for which to change options */
diff --git a/src/include/lwip/priv/tcp_priv.h b/src/include/lwip/priv/tcp_priv.h
index 72f9126..a8e87e5 100644
--- a/src/include/lwip/priv/tcp_priv.h
+++ b/src/include/lwip/priv/tcp_priv.h
@@ -106,14 +106,11 @@
 #define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK)
 
 
-#define TCP_SEQ_LT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0)
-#define TCP_SEQ_LEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0)
-#define TCP_SEQ_GT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0)
-#define TCP_SEQ_GEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0)
+#define TCP_SEQ_LT(a,b)     (((u32_t)((u32_t)(a) - (u32_t)(b)) & 0x80000000u) != 0)
+#define TCP_SEQ_LEQ(a,b)    (!(TCP_SEQ_LT(b,a)))
+#define TCP_SEQ_GT(a,b)     TCP_SEQ_LT(b,a)
+#define TCP_SEQ_GEQ(a,b)    TCP_SEQ_LEQ(b,a)
 /* is b<=a<=c? */
-#if 0 /* see bug #10548 */
-#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b))
-#endif
 #define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c))
 
 #ifndef TCP_TMR_INTERVAL
@@ -361,7 +358,7 @@
                             for (tcp_tmp_pcb = *(pcbs); \
           tcp_tmp_pcb != NULL; \
         tcp_tmp_pcb = tcp_tmp_pcb->next) { \
-                                LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != (npcb)); \
+                                LWIP_ASSERT("TCP_REG: already registered", tcp_tmp_pcb != (npcb)); \
                             } \
                             LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", ((pcbs) == &tcp_bound_pcbs) || ((npcb)->state != CLOSED)); \
                             (npcb)->next = *(pcbs); \
@@ -467,6 +464,9 @@
 void tcp_rst(const struct tcp_pcb* pcb, u32_t seqno, u32_t ackno,
        const ip_addr_t *local_ip, const ip_addr_t *remote_ip,
        u16_t local_port, u16_t remote_port);
+void tcp_rst_netif(struct netif *netif, u32_t seqno, u32_t ackno,
+                   const ip_addr_t *local_ip, const ip_addr_t *remote_ip,
+                   u16_t local_port, u16_t remote_port);
 
 u32_t tcp_next_iss(struct tcp_pcb *pcb);
 
diff --git a/src/include/lwip/priv/tcpip_priv.h b/src/include/lwip/priv/tcpip_priv.h
index 74be634..bfa88ff 100644
--- a/src/include/lwip/priv/tcpip_priv.h
+++ b/src/include/lwip/priv/tcpip_priv.h
@@ -123,7 +123,8 @@
   TCPIP_MSG_UNTIMEOUT,
 #endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */
   TCPIP_MSG_CALLBACK,
-  TCPIP_MSG_CALLBACK_STATIC
+  TCPIP_MSG_CALLBACK_STATIC,
+  TCPIP_MSG_CALLBACK_STATIC_WAIT
 };
 
 struct tcpip_msg {
@@ -139,6 +140,11 @@
       struct tcpip_api_call_data *arg;
       sys_sem_t *sem;
     } api_call;
+    struct {
+      tcpip_callback_fn function;
+      void *ctx;
+      sys_sem_t *sem;
+    } cb_wait;
 #endif /* LWIP_TCPIP_CORE_LOCKING */
 #if !LWIP_TCPIP_CORE_LOCKING_INPUT
     struct {
diff --git a/src/include/lwip/prot/acd.h b/src/include/lwip/prot/acd.h
new file mode 100644
index 0000000..860cae5
--- /dev/null
+++ b/src/include/lwip/prot/acd.h
@@ -0,0 +1,91 @@
+/**
+ * @file
+ * ACD protocol definitions
+ */
+
+/*
+ *
+ * Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>
+ * Copyright (c) 2018 Jasper Verschueren <jasper.verschueren@apart-audio.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.
+ *
+ * Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
+ * Author: Dominik Spies <kontakt@dspies.de>
+ */
+
+#ifndef LWIP_HDR_PROT_ACD_H
+#define LWIP_HDR_PROT_ACD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RFC 5227 and RFC 3927 Constants */
+#define PROBE_WAIT           1   /* second  (initial random delay)                    */
+#define PROBE_MIN            1   /* second  (minimum delay till repeated probe)       */
+#define PROBE_MAX            2   /* seconds (maximum delay till repeated probe)       */
+#define PROBE_NUM            3   /*         (number of probe packets)                 */
+#define ANNOUNCE_NUM         2   /*         (number of announcement packets)          */
+#define ANNOUNCE_INTERVAL    2   /* seconds (time between announcement packets)       */
+#define ANNOUNCE_WAIT        2   /* seconds (delay before announcing)                 */
+#define MAX_CONFLICTS        10  /*         (max conflicts before rate limiting)      */
+#define RATE_LIMIT_INTERVAL  60  /* seconds (delay between successive attempts)       */
+#define DEFEND_INTERVAL      10  /* seconds (minimum interval between defensive ARPs) */
+
+/* ACD states */
+typedef enum {
+  /* ACD is module is off */
+  ACD_STATE_OFF,
+  /* Waiting before probing can be started */
+  ACD_STATE_PROBE_WAIT,
+  /* Probing the ipaddr */
+  ACD_STATE_PROBING,
+  /* Waiting before announcing the probed ipaddr */
+  ACD_STATE_ANNOUNCE_WAIT,
+  /* Announcing the new ipaddr */
+  ACD_STATE_ANNOUNCING,
+  /* Performing ongoing conflict detection with one defend within defend inferval */
+  ACD_STATE_ONGOING,
+  /* Performing ongoing conflict detection but immediately back off and Release
+   * the address when a conflict occurs. This state is used for LL addresses
+   * that stay active even if the netif has a routable address selected.
+   * In such a case, we cannot defend our address */
+  ACD_STATE_PASSIVE_ONGOING,
+  /* To many conflicts occurred, we need to wait before restarting the selection
+   * process */
+  ACD_STATE_RATE_LIMIT
+} acd_state_enum_t;
+
+typedef enum {
+  ACD_IP_OK,            /* IP address is good, no conflicts found in checking state */
+  ACD_RESTART_CLIENT,   /* Conflict found -> the client should try again */
+  ACD_DECLINE           /* Decline the received IP address (rate limiting)*/
+} acd_callback_enum_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_PROT_ACD_H */
diff --git a/src/include/lwip/prot/autoip.h b/src/include/lwip/prot/autoip.h
index fd3af8a..adbb166 100644
--- a/src/include/lwip/prot/autoip.h
+++ b/src/include/lwip/prot/autoip.h
@@ -51,24 +51,11 @@
 /* 169.254.254.255 */
 #define AUTOIP_RANGE_END        (AUTOIP_NET | 0xFEFF)
 
-/* RFC 3927 Constants */
-#define PROBE_WAIT              1   /* second   (initial random delay)                 */
-#define PROBE_MIN               1   /* second   (minimum delay till repeated probe)    */
-#define PROBE_MAX               2   /* seconds  (maximum delay till repeated probe)    */
-#define PROBE_NUM               3   /*          (number of probe packets)              */
-#define ANNOUNCE_NUM            2   /*          (number of announcement packets)       */
-#define ANNOUNCE_INTERVAL       2   /* seconds  (time between announcement packets)    */
-#define ANNOUNCE_WAIT           2   /* seconds  (delay before announcing)              */
-#define MAX_CONFLICTS           10  /*          (max conflicts before rate limiting)   */
-#define RATE_LIMIT_INTERVAL     60  /* seconds  (delay between successive attempts)    */
-#define DEFEND_INTERVAL         10  /* seconds  (min. wait between defensive ARPs)     */
-
 /* AutoIP client states */
 typedef enum {
-  AUTOIP_STATE_OFF        = 0,
-  AUTOIP_STATE_PROBING    = 1,
-  AUTOIP_STATE_ANNOUNCING = 2,
-  AUTOIP_STATE_BOUND      = 3
+  AUTOIP_STATE_OFF,
+  AUTOIP_STATE_CHECKING,
+  AUTOIP_STATE_BOUND
 } autoip_state_enum_t;
 
 #ifdef __cplusplus
diff --git a/src/include/lwip/prot/ethernet.h b/src/include/lwip/prot/ethernet.h
index 309e574..d16b604 100644
--- a/src/include/lwip/prot/ethernet.h
+++ b/src/include/lwip/prot/ethernet.h
@@ -116,7 +116,9 @@
 #define LL_IP6_MULTICAST_ADDR_0 0x33
 #define LL_IP6_MULTICAST_ADDR_1 0x33
 
-#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETH_HWADDR_LEN) == 0)
+/* eth_addr_cmp is deprecated, use eth_addr_eq */
+#define eth_addr_cmp(addr1, addr2) eth_addr_eq((addr1), (addr2))
+#define eth_addr_eq(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETH_HWADDR_LEN) == 0)
 
 #ifdef __cplusplus
 }
diff --git a/src/include/lwip/prot/icmp.h b/src/include/lwip/prot/icmp.h
index 7d19385..1fe12d9 100644
--- a/src/include/lwip/prot/icmp.h
+++ b/src/include/lwip/prot/icmp.h
@@ -60,10 +60,30 @@
 #ifdef PACK_STRUCT_USE_INCLUDES
 #  include "arch/bpstruct.h"
 #endif
+/** The standard ICMP header (unspecified 32 bit data) */
+PACK_STRUCT_BEGIN
+struct icmp_hdr {
+  PACK_STRUCT_FLD_8(u8_t type);
+  PACK_STRUCT_FLD_8(u8_t code);
+  PACK_STRUCT_FIELD(u16_t chksum);
+  PACK_STRUCT_FIELD(u32_t data);
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/epstruct.h"
+#endif
+
+/* Compatibility defines, old versions used to combine type and code to an u16_t */
+#define ICMPH_TYPE(hdr) ((hdr)->type)
+#define ICMPH_CODE(hdr) ((hdr)->code)
+#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t))
+#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c))
+
+#ifdef PACK_STRUCT_USE_INCLUDES
+#  include "arch/bpstruct.h"
+#endif
 /** This is the standard ICMP header only that the u32_t data
  *  is split to two u16_t like ICMP echo needs it.
- *  This header is also used for other ICMP types that do not
- *  use the data part.
  */
 PACK_STRUCT_BEGIN
 struct icmp_echo_hdr {
@@ -78,12 +98,6 @@
 #  include "arch/epstruct.h"
 #endif
 
-/* Compatibility defines, old versions used to combine type and code to an u16_t */
-#define ICMPH_TYPE(hdr) ((hdr)->type)
-#define ICMPH_CODE(hdr) ((hdr)->code)
-#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t))
-#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c))
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/include/lwip/prot/ieee.h b/src/include/lwip/prot/ieee.h
index abbb9e3..cd4d2de 100644
--- a/src/include/lwip/prot/ieee.h
+++ b/src/include/lwip/prot/ieee.h
@@ -53,7 +53,7 @@
   /** Internet protocol v4 */
   ETHTYPE_IP        = 0x0800U,
   /** Address resolution protocol */
-  ETHTYPE_ARP       = 0x0806U, 
+  ETHTYPE_ARP       = 0x0806U,
   /** Wake on lan */
   ETHTYPE_WOL       = 0x0842U,
   /** RARP */
diff --git a/src/include/lwip/raw.h b/src/include/lwip/raw.h
index b129bd3..f916ff6 100644
--- a/src/include/lwip/raw.h
+++ b/src/include/lwip/raw.h
@@ -1,6 +1,6 @@
 /**
  * @file
- * raw API (to be used from TCPIP thread)\n
+ * raw API (to be used from TCPIP thread)<br>
  * See also @ref raw_raw
  */
 
diff --git a/src/include/lwip/sio.h b/src/include/lwip/sio.h
index 7643e19..12d2a7e 100644
--- a/src/include/lwip/sio.h
+++ b/src/include/lwip/sio.h
@@ -123,7 +123,7 @@
  *
  * @note This function will block until all data can be sent.
  */
-u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len);
+u32_t sio_write(sio_fd_t fd, const u8_t *data, u32_t len);
 #endif
 
 #ifndef sio_read_abort
diff --git a/src/include/lwip/sockets.h b/src/include/lwip/sockets.h
index d70d36c..b6f3d52 100644
--- a/src/include/lwip/sockets.h
+++ b/src/include/lwip/sockets.h
@@ -43,6 +43,10 @@
 
 #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
 
+#if LWIP_SOCKET_EXTERNAL_HEADERS
+#include LWIP_SOCKET_EXTERNAL_HEADER_SOCKETS_H
+#else /* LWIP_SOCKET_EXTERNAL_HEADERS */
+
 #include "lwip/ip_addr.h"
 #include "lwip/netif.h"
 #include "lwip/err.h"
@@ -55,6 +59,9 @@
 extern "C" {
 #endif
 
+/* sockaddr and pals include length fields */
+#define LWIP_SOCKET_HAVE_SA_LEN  1
+
 /* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED
    to prevent this code from redefining it. */
 #if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)
@@ -124,11 +131,13 @@
 };
 #endif
 
+typedef int msg_iovlen_t;
+
 struct msghdr {
   void         *msg_name;
   socklen_t     msg_namelen;
   struct iovec *msg_iov;
-  int           msg_iovlen;
+  msg_iovlen_t  msg_iovlen;
   void         *msg_control;
   socklen_t     msg_controllen;
   int           msg_flags;
@@ -400,7 +409,7 @@
  * we restrict parameters to at most 128 bytes.
  */
 #if !defined(FIONREAD) || !defined(FIONBIO)
-#define IOCPARM_MASK    0x7fU           /* parameters must be < 128 bytes */
+#define IOCPARM_MASK    0x7fUL          /* parameters must be < 128 bytes */
 #define IOC_VOID        0x20000000UL    /* no parameters */
 #define IOC_OUT         0x40000000UL    /* copy out parameters */
 #define IOC_IN          0x80000000UL    /* copy in parameters */
@@ -525,6 +534,16 @@
 };
 #endif /* LWIP_TIMEVAL_PRIVATE */
 
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_SOCKET_EXTERNAL_HEADERS */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #define lwip_socket_init() /* Compatibility define, no init needed. */
 void lwip_socket_thread_init(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */
 void lwip_socket_thread_cleanup(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */
diff --git a/src/include/lwip/sys.h b/src/include/lwip/sys.h
index 168e465..4bfdb13 100644
--- a/src/include/lwip/sys.h
+++ b/src/include/lwip/sys.h
@@ -130,7 +130,7 @@
  * If the mutex has been created, ERR_OK should be returned. Returning any
  * other error will provide a hint what went wrong, but except for assertions,
  * no real error handling is implemented.
- * 
+ *
  * @param mutex pointer to the mutex to create
  * @return ERR_OK if successful, another err_t otherwise
  */
@@ -205,13 +205,13 @@
  * "timeout" argument is non-zero, the thread should only be blocked for the
  * specified time (measured in milliseconds). If the "timeout" argument is zero,
  * the thread should be blocked until the semaphore is signalled.
- * 
+ *
  * The return value is SYS_ARCH_TIMEOUT if the semaphore wasn't signaled within
  * the specified time or any other value if it was signaled (with or without
  * waiting).
  * Notice that lwIP implements a function with a similar name,
  * sys_sem_wait(), that uses the sys_arch_sem_wait() function.
- * 
+ *
  * @param sem the semaphore to wait for
  * @param timeout timeout in milliseconds to wait (0 = wait forever)
  * @return SYS_ARCH_TIMEOUT on timeout, any other value on success
@@ -277,7 +277,7 @@
  * If the mailbox has been created, ERR_OK should be returned. Returning any
  * other error will provide a hint what went wrong, but except for assertions,
  * no real error handling is implemented.
- * 
+ *
  * @param mbox pointer to the mbox to create
  * @param size (minimum) number of messages in this mbox
  * @return ERR_OK if successful, another err_t otherwise
@@ -287,7 +287,7 @@
  * @ingroup sys_mbox
  * Post a message to an mbox - may not fail
  * -> blocks if full, only to be used from tasks NOT from ISR!
- * 
+ *
  * @param mbox mbox to posts the message
  * @param msg message to post (ATTENTION: can be NULL)
  */
@@ -297,7 +297,7 @@
  * Try to post a message to an mbox - may fail if full.
  * Can be used from ISR (if the sys arch layer allows this).
  * Returns ERR_MEM if it is full, else, ERR_OK if the "msg" is posted.
- * 
+ *
  * @param mbox mbox to posts the message
  * @param msg message to post (ATTENTION: can be NULL)
  */
@@ -307,7 +307,7 @@
  * Try to post a message to an mbox - may fail if full.
  * To be be used from ISR.
  * Returns ERR_MEM if it is full, else, ERR_OK if the "msg" is posted.
- * 
+ *
  * @param mbox mbox to posts the message
  * @param msg message to post (ATTENTION: can be NULL)
  */
@@ -324,10 +324,10 @@
  * The return values are the same as for the sys_arch_sem_wait() function:
  * SYS_ARCH_TIMEOUT if there was a timeout, any other value if a messages
  * is received.
- * 
+ *
  * Note that a function with a similar name, sys_mbox_fetch(), is
- * implemented by lwIP. 
- * 
+ * implemented by lwIP.
+ *
  * @param mbox mbox to get a message from
  * @param msg pointer where the message is stored
  * @param timeout maximum time (in milliseconds) to wait for a message (0 = wait forever)
@@ -346,7 +346,7 @@
  * example, a naive implementation could be:
  * \#define sys_arch_mbox_tryfetch(mbox,msg) sys_arch_mbox_fetch(mbox,msg,1)
  * although this would introduce unnecessary delays.
- * 
+ *
  * @param mbox mbox to get a message from
  * @param msg pointer where the message is stored
  * @return 0 (milliseconds) if a message has been received
@@ -363,7 +363,7 @@
  * Deallocates a mailbox. If there are messages still present in the
  * mailbox when the mailbox is deallocated, it is an indication of a
  * programming error in lwIP and the developer should be notified.
- * 
+ *
  * @param mbox mbox to delete
  */
 void sys_mbox_free(sys_mbox_t *mbox);
@@ -411,7 +411,7 @@
  * the "stacksize" parameter. The id of the new thread is returned. Both the id
  * and the priority are system dependent.
  * ATTENTION: although this function returns a value, it MUST NOT FAIL (ports have to assert this!)
- * 
+ *
  * @param name human-readable name for the thread (used for debugging purposes)
  * @param thread thread-function
  * @param arg parameter passed to 'thread'
@@ -422,6 +422,16 @@
 #endif /* NO_SYS */
 
 /**
+ * @ingroup lwip_opts_lock
+ * Called as first thing in the lwIP TCPIP thread. Can be used in conjunction
+ * with @ref LWIP_ASSERT_CORE_LOCKED to check core locking.
+ * @see @ref multithreading
+ */
+#if !defined LWIP_MARK_TCPIP_THREAD || defined __DOXYGEN__
+#define LWIP_MARK_TCPIP_THREAD()
+#endif
+
+/**
  * @ingroup sys_misc
  * sys_init() must be called before anything else.
  * Initialize the sys_arch layer.
@@ -435,6 +445,11 @@
 u32_t sys_jiffies(void);
 #endif
 
+#ifdef LWIP_FUZZ_SYS_NOW
+/* This offset should be added to the time 'sys_now()' returns */
+extern u32_t sys_now_offset;
+#endif
+
 /**
  * @ingroup sys_time
  * Returns the current time in milliseconds,
diff --git a/src/include/lwip/tcp.h b/src/include/lwip/tcp.h
index daf7599..3991fd6 100644
--- a/src/include/lwip/tcp.h
+++ b/src/include/lwip/tcp.h
@@ -1,6 +1,6 @@
 /**
  * @file
- * TCP API (to be used from TCPIP thread)\n
+ * TCP API (to be used from TCPIP thread)<br>
  * See also @ref tcp_raw
  */
 
@@ -486,9 +486,9 @@
 
 #if LWIP_TCP_PCB_NUM_EXT_ARGS
 u8_t tcp_ext_arg_alloc_id(void);
-void tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, uint8_t id, const struct tcp_ext_arg_callbacks * const callbacks);
-void tcp_ext_arg_set(struct tcp_pcb *pcb, uint8_t id, void *arg);
-void *tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id);
+void tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, u8_t id, const struct tcp_ext_arg_callbacks * const callbacks);
+void tcp_ext_arg_set(struct tcp_pcb *pcb, u8_t id, void *arg);
+void *tcp_ext_arg_get(const struct tcp_pcb *pcb, u8_t id);
 #endif
 
 #ifdef __cplusplus
diff --git a/src/include/lwip/tcpbase.h b/src/include/lwip/tcpbase.h
index 0023074..018790f 100644
--- a/src/include/lwip/tcpbase.h
+++ b/src/include/lwip/tcpbase.h
@@ -1,6 +1,6 @@
 /**
  * @file
- * Base TCP API definitions shared by TCP and ALTCP\n
+ * Base TCP API definitions shared by TCP and ALTCP<br>
  * See also @ref tcp_raw
  */
 
diff --git a/src/include/lwip/tcpip.h b/src/include/lwip/tcpip.h
index 0b8880a..30ce4fe 100644
--- a/src/include/lwip/tcpip.h
+++ b/src/include/lwip/tcpip.h
@@ -81,6 +81,7 @@
 
 err_t  tcpip_try_callback(tcpip_callback_fn function, void *ctx);
 err_t  tcpip_callback(tcpip_callback_fn function, void *ctx);
+err_t  tcpip_callback_wait(tcpip_callback_fn function, void *ctx);
 /**  @ingroup lwip_os
  * @deprecated use tcpip_try_callback() or tcpip_callback() instead
  */
diff --git a/src/include/lwip/udp.h b/src/include/lwip/udp.h
index b1c78e5..f1deae3 100644
--- a/src/include/lwip/udp.h
+++ b/src/include/lwip/udp.h
@@ -1,6 +1,6 @@
 /**
  * @file
- * UDP API (to be used from TCPIP thread)\n
+ * UDP API (to be used from TCPIP thread)<br>
  * See also @ref udp_raw
  */
 
diff --git a/src/include/netif/lowpan6_ble.h b/src/include/netif/lowpan6_ble.h
index 01896a7..ff35fcd 100644
--- a/src/include/netif/lowpan6_ble.h
+++ b/src/include/netif/lowpan6_ble.h
@@ -6,7 +6,7 @@
 /*
  * Copyright (c) 2017 Benjamin Aigner
  * Copyright (c) 2015 Inico Technologies Ltd. , Author: Ivan Delamer <delamer@inicotech.com>
- * 
+ *
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without modification,
@@ -32,10 +32,10 @@
  * OF SUCH DAMAGE.
  *
  * Author: Benjamin Aigner <aignerb@technikum-wien.at>
- * 
+ *
  * Based on the original 6lowpan implementation of lwIP ( @see 6lowpan.c)
  */
- 
+
 #ifndef LWIP_HDR_LOWPAN6_BLE_H
 #define LWIP_HDR_LOWPAN6_BLE_H
 
@@ -66,8 +66,8 @@
 err_t tcpip_rfc7668_input(struct pbuf *p, struct netif *inp);
 #endif
 
-void ble_addr_to_eui64(uint8_t *dst, const uint8_t *src, int public_addr);
-void eui64_to_ble_addr(uint8_t *dst, const uint8_t *src);
+void ble_addr_to_eui64(u8_t *dst, const u8_t *src, int public_addr);
+void eui64_to_ble_addr(u8_t *dst, const u8_t *src);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/netif/lowpan6_opts.h b/src/include/netif/lowpan6_opts.h
index 17d46cd..32e5c5e 100644
--- a/src/include/netif/lowpan6_opts.h
+++ b/src/include/netif/lowpan6_opts.h
@@ -109,7 +109,7 @@
 #define LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG    LWIP_DBG_OFF
 #endif
 
-/** LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS: 
+/** LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS:
  * Currently, the linux kernel driver for 6lowpan sets/clears a bit in
  * the address, depending on the BD address (either public or not).
  * Might not be RFC7668 conform, so you may select to do that (=1) or
diff --git a/src/include/netif/ppp/eap.h b/src/include/netif/ppp/eap.h
index 3ee9aaf..32434ed 100644
--- a/src/include/netif/ppp/eap.h
+++ b/src/include/netif/ppp/eap.h
@@ -13,7 +13,7 @@
  *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * Original version by James Carlson
  *
diff --git a/src/include/netif/ppp/magic.h b/src/include/netif/ppp/magic.h
index a165e18..12a002c 100644
--- a/src/include/netif/ppp/magic.h
+++ b/src/include/netif/ppp/magic.h
@@ -94,7 +94,7 @@
 void magic_init(void);
 
 /*
- * Randomize our random seed value.  To be called for truely random events
+ * Randomize our random seed value.  To be called for truly random events
  * such as user operations and network traffic.
  */
 void magic_randomize(void);
diff --git a/src/include/netif/ppp/ppp.h b/src/include/netif/ppp/ppp.h
index 3d73c36..f93747f 100644
--- a/src/include/netif/ppp/ppp.h
+++ b/src/include/netif/ppp/ppp.h
@@ -266,9 +266,9 @@
 #endif /* PAP_SUPPPORT */
 
 #if CHAP_SUPPORT
+#if PPP_SERVER
   u8_t  chap_timeout_time;       /* Timeout (seconds) for retransmitting req */
   u8_t  chap_max_transmits;      /* max # times to send challenge */
-#if PPP_SERVER
   u8_t  chap_rechallenge_time;   /* Time to wait for auth-req from peer */
 #endif /* PPP_SERVER */
 #endif /* CHAP_SUPPPORT */
diff --git a/src/include/netif/ppp/ppp_impl.h b/src/include/netif/ppp/ppp_impl.h
index 40843d5..2282831 100644
--- a/src/include/netif/ppp/ppp_impl.h
+++ b/src/include/netif/ppp/ppp_impl.h
@@ -60,16 +60,10 @@
 /*
  * Memory used for control packets.
  *
- * PPP_CTRL_PBUF_MAX_SIZE is the amount of memory we allocate when we
+ * PPP_CTRL_PBUF_UNKNOWN_SIZE is the amount of memory we allocate when we
  * cannot figure out how much we are going to use before filling the buffer.
  */
-#if PPP_USE_PBUF_RAM
-#define PPP_CTRL_PBUF_TYPE       PBUF_RAM
-#define PPP_CTRL_PBUF_MAX_SIZE   512
-#else /* PPP_USE_PBUF_RAM */
-#define PPP_CTRL_PBUF_TYPE       PBUF_POOL
-#define PPP_CTRL_PBUF_MAX_SIZE   PBUF_POOL_BUFSIZE
-#endif /* PPP_USE_PBUF_RAM */
+#define PPP_CTRL_PBUF_UNKNOWN_SIZE   512
 
 /*
  * The basic PPP frame.
@@ -88,9 +82,17 @@
 #define	PPP_TRANS	0x20	/* Asynchronous transparency modifier */
 
 /*
+ * PPP_DEFMRU: MRU value used prior negotiation and unless negotiated later.
+ * Must be 1500.
+ */
+#define PPP_DEFMRU      1500
+
+/*
  * Protocol field values.
  */
+#if PPP_IPV4_SUPPORT
 #define PPP_IP		0x21	/* Internet Protocol */
+#endif /* PPP_IPV4_SUPPORT */
 #if 0 /* UNUSED */
 #define PPP_AT		0x29	/* AppleTalk Protocol */
 #define PPP_IPX		0x2b	/* IPX protocol */
@@ -265,7 +267,7 @@
 #define PPP_OCTETS_DIRECTION_IN         1
 #define PPP_OCTETS_DIRECTION_OUT        2
 #define PPP_OCTETS_DIRECTION_MAXOVERAL  3
-/* same as previos, but little different on RADIUS side */
+/* same as previous, but little different on RADIUS side */
 #define PPP_OCTETS_DIRECTION_MAXSESSION 4
 #endif
 
@@ -456,8 +458,8 @@
 int sifnpmode(ppp_pcb *pcb, int proto, enum NPmode mode);
 #endif /* DEMAND_SUPPORt */
 
-void netif_set_mtu(ppp_pcb *pcb, int mtu);
-int netif_get_mtu(ppp_pcb *pcb);
+void ppp_netif_set_mtu(ppp_pcb *pcb, int mtu);
+int ppp_netif_get_mtu(ppp_pcb *pcb);
 
 #if CCP_SUPPORT
 #if 0 /* unused */
@@ -539,7 +541,7 @@
 #define BZERO(s, n)		memset(s, 0, n)
 #define	BCMP(s1, s2, l)		memcmp(s1, s2, l)
 
-#define PRINTMSG(m, l)		{ ppp_info("Remote message: %0.*v", l, m); }
+#define PRINTMSG(m, l)		{ ppp_info(("Remote message: %0.*v", l, m)); }
 
 /*
  * MAKEHEADER - Add Header fields to a packet.
@@ -559,7 +561,7 @@
 void continue_networks(ppp_pcb *pcb); /* start network [ip, etc] control protos */
 #if PPP_AUTH_SUPPORT
 #if PPP_SERVER
-int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen);
+int auth_check_passwd(ppp_pcb *pcb, char *auser, unsigned int userlen, char *apasswd, unsigned int passwdlen, const char **msg, int *msglen);
                                 /* check the user name and passwd against configuration */
 void auth_peer_fail(ppp_pcb *pcb, int protocol);
 				/* peer failed to authenticate itself */
@@ -614,12 +616,19 @@
 int ppp_vslprintf(char *buf, int buflen, const char *fmt, va_list args);  /* vsprintf++ */
 size_t ppp_strlcpy(char *dest, const char *src, size_t len);        /* safe strcpy */
 size_t ppp_strlcat(char *dest, const char *src, size_t len);        /* safe strncpy */
-void ppp_dbglog(const char *fmt, ...);    /* log a debug message */
-void ppp_info(const char *fmt, ...);      /* log an informational message */
-void ppp_notice(const char *fmt, ...);    /* log a notice-level message */
-void ppp_warn(const char *fmt, ...);      /* log a warning message */
-void ppp_error(const char *fmt, ...);     /* log an error message */
-void ppp_fatal(const char *fmt, ...);     /* log an error message and die(1) */
+void ppp_dbglog_impl(const char *fmt, ...);    /* log a debug message */
+void ppp_info_impl(const char *fmt, ...);      /* log an informational message */
+void ppp_notice_impl(const char *fmt, ...);    /* log a notice-level message */
+void ppp_warn_impl(const char *fmt, ...);      /* log a warning message */
+void ppp_error_impl(const char *fmt, ...);     /* log an error message */
+void ppp_fatal_impl(const char *fmt, ...);     /* log an error message and die(1) */
+/* wrap all the above functions so they will only be linked when enabled */
+#define ppp_dbglog(x) do { if (LWIP_DEBUG_ENABLED(LOG_DEBUG)) { ppp_dbglog_impl x; }} while(0)
+#define ppp_info(x)   do { if (LWIP_DEBUG_ENABLED(LOG_INFO)) { ppp_info_impl x; }} while(0)
+#define ppp_notice(x) do { if (LWIP_DEBUG_ENABLED(LOG_NOTICE)) { ppp_notice_impl x; }} while(0)
+#define ppp_warn(x)   do { if (LWIP_DEBUG_ENABLED(LOG_WARNING)) { ppp_warn_impl x; }} while(0)
+#define ppp_error(x)  do { if (LWIP_DEBUG_ENABLED(LOG_ERR)) { ppp_error_impl x; }} while(0)
+#define ppp_fatal(x)  do { if (LWIP_DEBUG_ENABLED(LOG_CRITICAL)) { ppp_fatal_impl x; }} while(0)
 #if PRINTPKT_SUPPORT
 void ppp_dump_packet(ppp_pcb *pcb, const char *tag, unsigned char *p, int len);
                                 /* dump packet to debug log if interesting */
@@ -665,11 +674,10 @@
  *    |.    .    .
  *     |    .    .
  * PPP_PHASE_AUTHENTICATE
- *     |    .    .
  *     ||   .    .
  * PPP_PHASE_NETWORK
- *     | || .    .
- *     |   |||   .
+ *     |||| .    .
+ *     ||  |||   .
  * PPP_PHASE_RUNNING
  *     |    .|||||
  *     |    . ||||
@@ -685,33 +693,39 @@
  *  1
  *
  * If authentication is enabled one timer is necessary during authentication.
+ * This timer might still be running up to network phase for any necessary
+ * rechallenge, mostly for PPP server support.
  *  1 + PPP_AUTH_SUPPORT
  *
  * If ECP is enabled one timer is necessary before IPCP and/or IP6CP, one more
  * is necessary if CCP is enabled (only with MPPE support but we don't care much
  * up to this detail level).
- *  1 + ECP_SUPPORT + CCP_SUPPORT
+ *  1 + PPP_AUTH_SUPPORT + ECP_SUPPORT + CCP_SUPPORT
  *
  * If CCP is enabled it might consume a timer during IPCP or IP6CP, thus
- * we might use IPCP, IP6CP and CCP timers simultaneously.
- *  1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT
+ * we might use AUTH, IPCP, IP6CP and CCP timers simultaneously.
+ *  1 + PPP_AUTH_SUPPORT + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT
  *
  * When entering running phase, IPCP or IP6CP is still running. If idle time limit
  * is enabled one more timer is necessary. Same for max connect time and max
  * octets features. Furthermore CCP RACK might be used past this point.
  *  1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS + CCP_SUPPORT
  *
- * IPv4 or IPv6 must be enabled, therefore we don't need to take care the authentication
- * and the CCP + ECP case, thus reducing overall complexity.
- * 1 + LWIP_MAX(PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT, PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS + CCP_SUPPORT)
+ * Then the maximum number of simultaneously running timers is given by:
+ *  1 + MAX(PPP_AUTH_SUPPORT + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT,
+ *          PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS + CCP_SUPPORT)
  *
- * We don't support PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS features
- * and adding those defines to ppp_opts.h just for having the value always
- * defined to 0 isn't worth it.
- * 1 + LWIP_MAX(PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT, PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + CCP_SUPPORT)
+ * We don't support ECP_SUPPORT + PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS features
+ * and adding those defines to ppp_opts.h just for having the value always defined to 0
+ * is not worth it, thus reducing the overall complexity.
+ *  1 + MAX(PPP_AUTH_SUPPORT + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT,
+ *          PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + CCP_SUPPORT)
  *
- * Thus, the following is enough for now.
- * 1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT
+ * PPP_AUTH_SUPPORT is not available in ppp_opts.h because it is defined later in ppp.h,
+ * but we do not need to be that picky about the real number of simultaneously running
+ * timers so we just set the base number of timeouts to 2, thus the following is enough
+ * for now.
+ *  2 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT
  */
 
 #ifdef __cplusplus
diff --git a/src/include/netif/ppp/ppp_opts.h b/src/include/netif/ppp/ppp_opts.h
index 479a006..be22c4c 100644
--- a/src/include/netif/ppp/ppp_opts.h
+++ b/src/include/netif/ppp/ppp_opts.h
@@ -95,7 +95,7 @@
  * timers analysis.
  */
 #ifndef PPP_NUM_TIMEOUTS_PER_PCB
-#define PPP_NUM_TIMEOUTS_PER_PCB        (1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT)
+#define PPP_NUM_TIMEOUTS_PER_PCB        (2 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT)
 #endif
 
 /* The number of sys_timeouts required for the PPP module */
@@ -185,20 +185,6 @@
 #endif
 
 /**
- * pbuf_type PPP is using for LCP, PAP, CHAP, EAP, CCP, IPCP and IP6CP packets.
- *
- * Memory allocated must be single buffered for PPP to works, it requires pbuf
- * that are not going to be chained when allocated. This requires setting
- * PBUF_POOL_BUFSIZE to at least 512 bytes, which is quite huge for small systems.
- *
- * Setting PPP_USE_PBUF_RAM to 1 makes PPP use memory from heap where continuous
- * buffers are required, allowing you to use a smaller PBUF_POOL_BUFSIZE.
- */
-#ifndef PPP_USE_PBUF_RAM
-#define PPP_USE_PBUF_RAM                0
-#endif
-
-/**
  * PPP_FCS_TABLE: Keep a 256*2 byte table to speed up FCS calculation for PPPoS
  */
 #ifndef PPP_FCS_TABLE
@@ -311,9 +297,11 @@
 
 /**
  * VJ_SUPPORT==1: Support VJ header compression.
+ *
+ * BEWARE: It is known to be broken when built with some compiler optimizations enabled.
  */
 #ifndef VJ_SUPPORT
-#define VJ_SUPPORT                      1
+#define VJ_SUPPORT                      0
 #endif
 /* VJ compression is only supported for TCP over IPv4 over PPPoS. */
 #if !PPPOS_SUPPORT || !PPP_IPV4_SUPPORT || !LWIP_TCP
@@ -507,28 +495,33 @@
  */
 
 /**
- * PPP_MRU: Default MRU
+ * PPP_MRU: MRU value we want to negotiate (peer MTU)
+ *
+ * It only affects PPPoS because PPPoE value is derived from the
+ * Ethernet interface MTU and PPPoL2TP have a separate setting.
  */
 #ifndef PPP_MRU
 #define PPP_MRU                         1500
 #endif
 
 /**
- * PPP_DEFMRU: Default MRU to try
- */
-#ifndef PPP_DEFMRU
-#define PPP_DEFMRU                      1500
-#endif
-
-/**
- * PPP_MAXMRU: Normally limit MRU to this (pppd default = 16384)
+ * PPP_MAXMRU: Normally limit peer MRU to this
+ *
+ * This is the upper limit value to which we set our interface MTU.
+ * If the peer sends a larger number, we will just ignore it as we
+ * are not required to maximize the use of the peer capacity.
+ *
+ * It only affects PPPoS because PPPoE value is derived from the
+ * Ethernet interface MTU and PPPoL2TP have a separate setting.
  */
 #ifndef PPP_MAXMRU
 #define PPP_MAXMRU                      1500
 #endif
 
 /**
- * PPP_MINMRU: No MRUs below this
+ * PPP_MINMRU: No peer MRUs below this
+ *
+ * Peer must be able to receive at least our minimum MTU.
  */
 #ifndef PPP_MINMRU
 #define PPP_MINMRU                      128
diff --git a/src/include/netif/ppp/pppos.h b/src/include/netif/ppp/pppos.h
index 380a965..f587498 100644
--- a/src/include/netif/ppp/pppos.h
+++ b/src/include/netif/ppp/pppos.h
@@ -50,7 +50,6 @@
  * completed. */
 enum {
   PDIDLE = 0,  /* Idle state - waiting. */
-  PDSTART,     /* Process start flag. */
   PDADDRESS,   /* Process address field. */
   PDCONTROL,   /* Process control field. */
   PDPROTOCOL1, /* Process protocol field 1. */
@@ -59,7 +58,7 @@
 };
 
 /* PPPoS serial output callback function prototype */
-typedef u32_t (*pppos_output_cb_fn)(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx);
+typedef u32_t (*pppos_output_cb_fn)(ppp_pcb *pcb, const void *data, u32_t len, void *ctx);
 
 /*
  * Extended asyncmap - allows any character to be escaped.
@@ -103,11 +102,11 @@
 
 #if !NO_SYS && !PPP_INPROC_IRQ_SAFE
 /* Pass received raw characters to PPPoS to be decoded through lwIP TCPIP thread. */
-err_t pppos_input_tcpip(ppp_pcb *ppp, u8_t *s, int l);
+err_t pppos_input_tcpip(ppp_pcb *ppp, const void *s, int l);
 #endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */
 
 /* PPP over Serial: this is the input function to be called for received data. */
-void pppos_input(ppp_pcb *ppp, u8_t* data, int len);
+void pppos_input(ppp_pcb *ppp, const void* data, int len);
 
 
 /*
diff --git a/src/include/netif/ppp/vj.h b/src/include/netif/ppp/vj.h
index 77d9976..4e6601c 100644
--- a/src/include/netif/ppp/vj.h
+++ b/src/include/netif/ppp/vj.h
@@ -16,7 +16,7 @@
  * from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:
  * - Initial distribution.
diff --git a/src/include/netif/slipif.h b/src/include/netif/slipif.h
index 65ba31f..46d2010 100644
--- a/src/include/netif/slipif.h
+++ b/src/include/netif/slipif.h
@@ -84,4 +84,3 @@
 #endif
 
 #endif /* LWIP_HDR_NETIF_SLIPIF_H */
-
diff --git a/src/netif/bridgeif.c b/src/netif/bridgeif.c
index 8a97bce..2dc88fc 100644
--- a/src/netif/bridgeif.c
+++ b/src/netif/bridgeif.c
@@ -120,7 +120,7 @@
 } bridgeif_private_t;
 
 /* netif data index to get the bridge on input */
-u8_t bridgeif_netif_client_id = 0xff;
+static u8_t bridgeif_netif_client_id = 0xff;
 
 /**
  * @ingroup bridgeif
@@ -421,7 +421,7 @@
   LWIP_ASSERT("bridgeif needs an input callback", (netif->input != NULL));
 #if !BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT
   if (netif->input == tcpip_input) {
-    LWIP_DEBUGF(BRIDGEIF_DEBUG | LWIP_DBG_ON, ("bridgeif does not need tcpip_input, use netif_input/ethernet_input instead"));
+    LWIP_DEBUGF(BRIDGEIF_DEBUG | LWIP_DBG_ON, ("bridgeif does not need tcpip_input, use netif_input/ethernet_input instead\n"));
   }
 #endif
 
diff --git a/src/netif/bridgeif_fdb.c b/src/netif/bridgeif_fdb.c
index 6739fc2..2f052ec 100644
--- a/src/netif/bridgeif_fdb.c
+++ b/src/netif/bridgeif_fdb.c
@@ -69,7 +69,7 @@
  * remembers known src mac addresses to know which port to send frames destined for that
  * mac address.
  *
- * ATTENTION: This is meant as an example only, in real-world use, you should 
+ * ATTENTION: This is meant as an example only, in real-world use, you should
  * provide a better implementation :-)
  */
 void
@@ -120,9 +120,9 @@
   /* not found, no free entry -> flood */
 }
 
-/** 
+/**
  * @ingroup bridgeif_fdb
- * Walk our list of auto-learnt fdb entries and return a port to forward or BR_FLOOD if unknown 
+ * Walk our list of auto-learnt fdb entries and return a port to forward or BR_FLOOD if unknown
  */
 bridgeif_portmask_t
 bridgeif_fdb_get_dst_ports(void *fdb_ptr, struct eth_addr *dst_addr)
diff --git a/src/netif/ethernet.c b/src/netif/ethernet.c
index dd171e2..db5c514 100644
--- a/src/netif/ethernet.c
+++ b/src/netif/ethernet.c
@@ -67,7 +67,7 @@
  * @ingroup lwip_nosys
  * Process received ethernet frames. Using this function instead of directly
  * calling ip_input and passing ARP frames through etharp in ethernetif_input,
- * the ARP cache is protected from concurrent access.\n
+ * the ARP cache is protected from concurrent access.<br>
  * Don't call directly, pass to netif_add() and call netif->input().
  *
  * @param p the received packet, p->payload pointing to the ethernet header
@@ -96,10 +96,6 @@
     goto free_and_return;
   }
 
-  if (p->if_idx == NETIF_NO_INDEX) {
-    p->if_idx = netif_get_index(netif);
-  }
-
   /* points to packet payload, which starts with an Ethernet header */
   ethhdr = (struct eth_hdr *)p->payload;
   LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE,
@@ -143,6 +139,10 @@
   netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, lwip_htons(type));
 #endif /* LWIP_ARP_FILTER_NETIF*/
 
+  if (p->if_idx == NETIF_NO_INDEX) {
+    p->if_idx = netif_get_index(netif);
+  }
+
   if (ethhdr->dest.addr[0] & 1) {
     /* this might be a multicast or broadcast packet */
     if (ethhdr->dest.addr[0] == LL_IP4_MULTICAST_ADDR_0) {
@@ -179,7 +179,7 @@
         LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
                     ("ethernet_input: IPv4 packet dropped, too short (%"U16_F"/%"U16_F")\n",
                      p->tot_len, next_hdr_offset));
-        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("Can't move over header in packet"));
+        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("Can't move over header in packet\n"));
         goto free_and_return;
       } else {
         /* pass to IP layer */
@@ -196,7 +196,7 @@
         LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
                     ("ethernet_input: ARP response packet dropped, too short (%"U16_F"/%"U16_F")\n",
                      p->tot_len, next_hdr_offset));
-        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("Can't move over header in packet"));
+        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("Can't move over header in packet\n"));
         ETHARP_STATS_INC(etharp.lenerr);
         ETHARP_STATS_INC(etharp.drop);
         goto free_and_return;
@@ -273,8 +273,16 @@
   struct eth_hdr *ethhdr;
   u16_t eth_type_be = lwip_htons(eth_type);
 
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-  s32_t vlan_prio_vid = LWIP_HOOK_VLAN_SET(netif, p, src, dst, eth_type);
+#if ETHARP_SUPPORT_VLAN && (defined(LWIP_HOOK_VLAN_SET) || LWIP_VLAN_PCP)
+  s32_t vlan_prio_vid;
+#ifdef LWIP_HOOK_VLAN_SET
+  vlan_prio_vid = LWIP_HOOK_VLAN_SET(netif, p, src, dst, eth_type);
+#elif LWIP_VLAN_PCP
+  vlan_prio_vid = -1;
+  if (netif->hints && (netif->hints->tci >= 0)) {
+    vlan_prio_vid = (u16_t)netif->hints->tci;
+  }
+#endif
   if (vlan_prio_vid >= 0) {
     struct eth_vlan_hdr *vlanhdr;
 
@@ -289,7 +297,7 @@
 
     eth_type_be = PP_HTONS(ETHTYPE_VLAN);
   } else
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
+#endif /* ETHARP_SUPPORT_VLAN && (defined(LWIP_HOOK_VLAN_SET) || LWIP_VLAN_PCP) */
   {
     if (pbuf_add_header(p, SIZEOF_ETH_HDR) != 0) {
       goto pbuf_header_failed;
diff --git a/src/netif/lowpan6.c b/src/netif/lowpan6.c
index 5e6f009..8eb751c 100644
--- a/src/netif/lowpan6.c
+++ b/src/netif/lowpan6.c
@@ -383,6 +383,7 @@
 #else /* LWIP_6LOWPAN_IPHC */
   /* Send uncompressed IPv6 header with appropriate dispatch byte. */
   lowpan6_header_len = 1;
+  hidden_header_len = 0;
   buffer[ieee_header_len] = 0x41; /* IPv6 dispatch */
 #endif /* LWIP_6LOWPAN_IPHC */
 
@@ -604,12 +605,12 @@
 
 #if LWIP_6LOWPAN_INFER_SHORT_ADDRESS
   if (src.addr_len == 2) {
-    /* If source address was compressable to short_mac_addr, and dest has same subnet and
-     * is also compressable to 2-bytes, assume we can infer dest as a short address too. */
+    /* If source address was compressible to short_mac_addr, and dest has same subnet and
+     * is also compressible to 2-bytes, assume we can infer dest as a short address too. */
     dest.addr_len = 2;
     dest.addr[0] = ((u8_t *)q->payload)[38];
     dest.addr[1] = ((u8_t *)q->payload)[39];
-    if ((src.addr_len == 2) && (ip6_addr_netcmp_zoneless(&ip6_hdr->src, &ip6_hdr->dest)) &&
+    if ((src.addr_len == 2) && (ip6_addr_net_zoneless_eq(&ip6_hdr->src, &ip6_hdr->dest)) &&
         (lowpan6_get_address_mode(ip6addr, &dest) == 3)) {
       MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);
       return lowpan6_frag(netif, q, &src, &dest);
@@ -679,7 +680,7 @@
     /* check for duplicate */
     lrh = lowpan6_data.reass_list;
     while (lrh != NULL) {
-      uint8_t discard = 0;
+      u8_t discard = 0;
       lrh_next = lrh->next_packet;
       if ((lrh->sender_addr.addr_len == src.addr_len) &&
           (memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0)) {
diff --git a/src/netif/lowpan6_ble.c b/src/netif/lowpan6_ble.c
index 6de0ae3..cca8bb1 100644
--- a/src/netif/lowpan6_ble.c
+++ b/src/netif/lowpan6_ble.c
@@ -6,7 +6,7 @@
 /*
  * Copyright (c) 2017 Benjamin Aigner
  * Copyright (c) 2015 Inico Technologies Ltd. , Author: Ivan Delamer <delamer@inicotech.com>
- * 
+ *
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without modification,
@@ -32,7 +32,7 @@
  * OF SUCH DAMAGE.
  *
  * Author: Benjamin Aigner <aignerb@technikum-wien.at>
- * 
+ *
  * Based on the original 6lowpan implementation of lwIP ( @see 6lowpan.c)
  */
 
@@ -95,19 +95,19 @@
 /**
  * @ingroup rfc7668if
  *  convert BT address to EUI64 addr
- * 
+ *
  * This method converts a Bluetooth MAC address to an EUI64 address,
  * which is used within IPv6 communication
- * 
+ *
  * @param dst IPv6 destination space
  * @param src BLE MAC address source
  * @param public_addr If the LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS
  * option is set, bit 0x02 will be set if param=0 (no public addr); cleared otherwise
- * 
+ *
  * @see LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS
  */
 void
-ble_addr_to_eui64(uint8_t *dst, const uint8_t *src, int public_addr)
+ble_addr_to_eui64(u8_t *dst, const u8_t *src, int public_addr)
 {
   /* according to RFC7668 ch 3.2.2. */
   memcpy(dst, src, 3);
@@ -128,15 +128,15 @@
 /**
  * @ingroup rfc7668if
  *  convert EUI64 address to Bluetooth MAC addr
- * 
+ *
  * This method converts an EUI64 address to a Bluetooth MAC address,
- * 
+ *
  * @param dst BLE MAC address destination
  * @param src IPv6 source
- * 
+ *
  */
 void
-eui64_to_ble_addr(uint8_t *dst, const uint8_t *src)
+eui64_to_ble_addr(u8_t *dst, const u8_t *src)
 {
   /* according to RFC7668 ch 3.2.2. */
   memcpy(dst,src,3);
@@ -214,16 +214,16 @@
 }
 
 /** Encapsulate IPv6 frames for BLE transmission
- * 
+ *
  * This method implements the IPv6 header compression:
  *  *) According to RFC6282
  *  *) See Figure 2, contains base format of bit positions
  *  *) Fragmentation not necessary (done at L2CAP layer of BLE)
  * @note Currently the pbuf allocation uses 256 bytes. If longer packets are used (possible due to MTU=1480Bytes), increase it here!
- * 
+ *
  * @param p Pbuf struct, containing the payload data
  * @param netif Output network interface. Should be of RFC7668 type
- * 
+ *
  * @return Same as netif->output.
  */
 static err_t
@@ -340,7 +340,7 @@
  * @param p the received packet, p->payload pointing to the
  *        IPv6 header (maybe compressed)
  * @param netif the network interface on which the packet was received
- * 
+ *
  * @return ERR_OK if everything was fine
  */
 err_t
@@ -352,7 +352,7 @@
 
   /* Load first header byte */
   puc = (u8_t*)p->payload;
-  
+
   /* no IP header compression */
   if (*puc == 0x41) {
     LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Completed packet, removing dispatch: 0x%2x \n", *puc));
@@ -386,7 +386,7 @@
       if ((i%4)==0) {
         LWIP_DEBUGF(LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG, ("\n"));
       }
-      LWIP_DEBUGF(LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG, ("%2X ", *((uint8_t *)p->payload+i)));
+      LWIP_DEBUGF(LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG, ("%2X ", *((u8_t *)p->payload+i)));
     }
     LWIP_DEBUGF(LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG, ("\np->len: %d\n", p->len));
   }
@@ -398,12 +398,12 @@
 /**
  * @ingroup rfc7668if
  * Initialize the netif
- * 
+ *
  * No flags are used (broadcast not possible, not ethernet, ...)
  * The shortname for this netif is "BT"
  *
  * @param netif the network interface to be initialized as RFC7668 netif
- * 
+ *
  * @return ERR_OK if everything went fine
  */
 err_t
@@ -433,7 +433,7 @@
  * @param p the received packet, p->payload pointing to the
  *          IEEE 802.15.4 header.
  * @param inp the network interface on which the packet was received
- * 
+ *
  * @return see @ref tcpip_inpkt, same return values
  */
 err_t
diff --git a/src/netif/lowpan6_common.c b/src/netif/lowpan6_common.c
index 4db1ebb..9f50658 100644
--- a/src/netif/lowpan6_common.c
+++ b/src/netif/lowpan6_common.c
@@ -117,7 +117,7 @@
   s8_t i;
 
   for (i = 0; i < LWIP_6LOWPAN_NUM_CONTEXTS; i++) {
-    if (ip6_addr_netcmp(&lowpan6_contexts[i], ip6addr)) {
+    if (ip6_addr_net_eq(&lowpan6_contexts[i], ip6addr)) {
       return i;
     }
   }
@@ -424,13 +424,13 @@
       }
       LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("%2X ", lowpan6_buffer[j]));
     }
-    LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("\np->len: %d", lowpan6_bufsize));
+    LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("\np->len: %d\n", lowpan6_bufsize));
   }
 #endif
 
   /* offset for inline IP headers (RFC 6282 ch3)*/
   lowpan6_offset = 2;
-  /* if CID is set (context identifier), the context byte 
+  /* if CID is set (context identifier), the context byte
    * follows immediately after the header, so other IPHC fields are @+3 */
   if (lowpan6_buffer[1] & 0x80) {
     lowpan6_offset++;
@@ -523,7 +523,7 @@
       lowpan6_offset += 2;
     } else if ((lowpan6_buffer[1] & 0x30) == 0x30) {
       LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 11, src compression, 0bits inline, using other headers\n"));
-      /* no information avalaible, using other layers, see RFC6282 ch 3.2.2 */
+      /* no information available, using other layers, see RFC6282 ch 3.2.2 */
       ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);
       ip6hdr->src.addr[1] = 0;
       if (src->addr_len == 2) {
@@ -667,7 +667,7 @@
 
     /* M=0, DAC=0, determining destination address length via DAM=xx */
     if ((lowpan6_buffer[1] & 0x03) == 0x00) {
-      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 00, no dst compression, fetching 128bits inline"));
+      LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 00, no dst compression, fetching 128bits inline\n"));
       /* DAM=00, copy full address */
       MEMCPY(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16);
       lowpan6_offset += 16;
diff --git a/src/netif/ppp/auth.c b/src/netif/ppp/auth.c
index c8673ad..3e17418 100644
--- a/src/netif/ppp/auth.c
+++ b/src/netif/ppp/auth.c
@@ -591,9 +591,9 @@
      * incoming events (reply, timeout, etc.).
      */
     if (ifunit >= 0)
-	ppp_notice("Connect: %s <--> %s", ifname, ppp_devnam);
+	ppp_notice(("Connect: %s <--> %s", ifname, ppp_devnam));
     else
-	ppp_notice("Starting negotiation on %s", ppp_devnam);
+	ppp_notice(("Starting negotiation on %s", ppp_devnam));
     add_fd(fd_ppp);
 
     new_phase(pcb, PPP_PHASE_ESTABLISH);
@@ -634,12 +634,12 @@
 #endif /* UNUSED */
 
     if (!doing_multilink) {
-	ppp_notice("Connection terminated.");
+	ppp_notice(("Connection terminated."));
 #if PPP_STATS_SUPPORT
 	print_link_stats();
 #endif /* PPP_STATS_SUPPORT */
     } else
-	ppp_notice("Link terminated.");
+	ppp_notice(("Link terminated."));
 
     lcp_lowerdown(pcb);
 
@@ -791,7 +791,7 @@
 	    || !wo->neg_upap
 #endif /* PAP_SUPPORT */
 	    ) {
-	    ppp_warn("peer refused to authenticate: terminating link");
+	    ppp_warn(("peer refused to authenticate: terminating link"));
 #if 0 /* UNUSED */
 	    status = EXIT_PEER_AUTH_FAILED;
 #endif /* UNUSED */
@@ -868,7 +868,7 @@
 #if 0 /* UNUSED */
     /* Log calling number. */
     if (*remote_number)
-	ppp_notice("peer from calling number %q authorized", remote_number);
+	ppp_notice(("peer from calling number %q authorized", remote_number));
 #endif /* UNUSED */
 
 #if PPP_NOTIFY
@@ -1003,13 +1003,13 @@
  *      1: Authentication succeeded.
  * In either case, msg points to an appropriate message and msglen to the message len.
  */
-int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen) {
-  int secretuserlen;
-  int secretpasswdlen;
+int auth_check_passwd(ppp_pcb *pcb, char *auser, unsigned int userlen, char *apasswd, unsigned int passwdlen, const char **msg, int *msglen) {
+  size_t secretuserlen;
+  size_t secretpasswdlen;
 
   if (pcb->settings.user && pcb->settings.passwd) {
-    secretuserlen = (int)strlen(pcb->settings.user);
-    secretpasswdlen = (int)strlen(pcb->settings.passwd);
+    secretuserlen = strlen(pcb->settings.user);
+    secretpasswdlen = strlen(pcb->settings.passwd);
     if (secretuserlen == userlen
         && secretpasswdlen == passwdlen
         && !memcmp(auser, pcb->settings.user, userlen)
@@ -1049,6 +1049,7 @@
     LWIP_UNUSED_ARG(name);
     LWIP_UNUSED_ARG(namelen);
 #endif /* HAVE_MULTILINK */
+    LWIP_UNUSED_ARG(prot_flavor); /* if CHAP_SUPPORT is disabled */
 
     switch (protocol) {
 #if CHAP_SUPPORT
@@ -1082,7 +1083,7 @@
 	break;
 #endif /* EAP_SUPPORT */
     default:
-	ppp_warn("auth_peer_success: unknown protocol %x", protocol);
+	ppp_warn(("auth_peer_success: unknown protocol %x", protocol));
 	return;
     }
 
@@ -1136,6 +1137,7 @@
 void auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor) {
     int bit;
     const char *prot = "";
+    LWIP_UNUSED_ARG(prot_flavor); /* if CHAP_SUPPORT is disabled */
 
     switch (protocol) {
 #if CHAP_SUPPORT
@@ -1172,12 +1174,12 @@
 	break;
 #endif /* EAP_SUPPORT */
     default:
-	ppp_warn("auth_withpeer_success: unknown protocol %x", protocol);
+	ppp_warn(("auth_withpeer_success: unknown protocol %x", protocol));
 	bit = 0;
 	/* no break */
     }
 
-    ppp_notice("%s authentication succeeded", prot);
+    ppp_notice(("%s authentication succeeded", prot));
 
     /* Save the authentication method for later. */
     pcb->auth_done |= bit;
@@ -1300,7 +1302,7 @@
 	    break;
     }
     if (used > maxoctets) {
-	ppp_notice("Traffic limit reached. Limit: %u Used: %u", maxoctets, used);
+	ppp_notice(("Traffic limit reached. Limit: %u Used: %u", maxoctets, used));
 	status = EXIT_TRAFFIC_LIMIT;
 	lcp_close(pcb, "Traffic limit");
 #if 0 /* UNUSED */
@@ -1338,7 +1340,7 @@
 #endif /* UNUSED */
     if (tlim <= 0) {
 	/* link is idle: shut it down. */
-	ppp_notice("Terminating connection due to lack of activity.");
+	ppp_notice(("Terminating connection due to lack of activity."));
 	pcb->err_code = PPPERR_IDLETIMEOUT;
 	lcp_close(pcb, "Link inactive");
 #if 0 /* UNUSED */
@@ -1356,7 +1358,7 @@
  */
 static void connect_time_expired(void *arg) {
     ppp_pcb *pcb = (ppp_pcb*)arg;
-    ppp_info("Connect time expired");
+    ppp_info(("Connect time expired"));
     pcb->err_code = PPPERR_CONNECTTIME;
     lcp_close(pcb, "Connect time expired");	/* Close connection */
 }
@@ -1495,7 +1497,7 @@
      * Early check for remote number authorization.
      */
     if (!auth_number()) {
-	ppp_warn("calling number %q is not authorized", remote_number);
+	ppp_warn(("calling number %q is not authorized", remote_number));
 	exit(EXIT_CNID_AUTH_FAILED);
     }
 }
@@ -1609,12 +1611,12 @@
     ret = UPAP_AUTHNAK;
     f = fopen(filename, "r");
     if (f == NULL) {
-	ppp_error("Can't open PAP password file %s: %m", filename);
+	ppp_error(("Can't open PAP password file %s: %m", filename));
 
     } else {
 	check_access(f, filename);
 	if (scan_authfile(f, ppp_settings.user, our_name, secret, &addrs, &opts, filename, 0) < 0) {
-	    ppp_warn("no PAP secret found for %s", user);
+	    ppp_warn(("no PAP secret found for %s", user));
 	} else {
 	    /*
 	     * If the secret is "@login", it means to check
@@ -1629,7 +1631,7 @@
 		}
 	    } else if (session_mgmt) {
 		if (session_check(ppp_settings.user, NULL, devnam, NULL) == 0) {
-		    ppp_warn("Peer %q failed PAP Session verification", user);
+		    ppp_warn(("Peer %q failed PAP Session verification", user));
 		    ret = UPAP_AUTHNAK;
 		}
 	    }
@@ -1653,7 +1655,7 @@
 	 * On 10'th, drop the connection.
 	 */
 	if (attempts++ >= 10) {
-	    ppp_warn("%d LOGIN FAILURES ON %s, %s", attempts, devnam, user);
+	    ppp_warn(("%d LOGIN FAILURES ON %s, %s", attempts, devnam, user));
 	    lcp_close(pcb, "login failed");
 	}
 	if (attempts > 3)
@@ -1902,7 +1904,7 @@
  * (We could be either client or server).
  */
 int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server) {
-  int len;
+  size_t len;
   LWIP_UNUSED_ARG(server);
   LWIP_UNUSED_ARG(am_server);
 
@@ -1910,9 +1912,9 @@
     return 0;
   }
 
-  len = (int)strlen(pcb->settings.passwd);
+  len = strlen(pcb->settings.passwd);
   if (len > MAXSECRETLEN) {
-    ppp_error("Secret for %s on %s is too long", client, server);
+    ppp_error(("Secret for %s on %s is too long", client, server));
     len = MAXSECRETLEN;
   }
 
@@ -1922,7 +1924,8 @@
 
 #if 0 /* UNUSED */
     FILE *f;
-    int ret, len;
+    int ret;
+    size_t len;
     char *filename;
     struct wordlist *addrs, *opts;
     char secbuf[MAXWORDLEN];
@@ -1933,8 +1936,8 @@
 	strlcpy(secbuf, ppp_settings.passwd, sizeof(secbuf));
     } else if (!am_server && chap_passwd_hook) {
 	if ( (*chap_passwd_hook)(client, secbuf) < 0) {
-	    ppp_error("Unable to obtain CHAP password for %s on %s from plugin",
-		  client, server);
+	    ppp_error(("Unable to obtain CHAP password for %s on %s from plugin",
+		  client, server));
 	    return 0;
 	}
     } else {
@@ -1944,7 +1947,7 @@
 
 	f = fopen(filename, "r");
 	if (f == NULL) {
-	    ppp_error("Can't open chap secret file %s: %m", filename);
+	    ppp_error(("Can't open chap secret file %s: %m", filename));
 	    return 0;
 	}
 	check_access(f, filename);
@@ -1964,7 +1967,7 @@
 
     len = strlen(secbuf);
     if (len > MAXSECRETLEN) {
-	ppp_error("Secret for %s on %s is too long", client, server);
+	ppp_error(("Secret for %s on %s is too long", client, server));
 	len = MAXSECRETLEN;
     }
     MEMCPY(secret, secbuf, len);
@@ -2004,7 +2007,7 @@
 
 	fp = fopen(filename, "r");
 	if (fp == NULL) {
-	    ppp_error("Can't open srp secret file %s: %m", filename);
+	    ppp_error(("Can't open srp secret file %s: %m", filename));
 	    return 0;
 	}
 	check_access(fp, filename);
@@ -2098,8 +2101,8 @@
 
 	    bit_count = (int) strtol (ptr_mask+1, &endp, 10);
 	    if (bit_count <= 0 || bit_count > 32) {
-		ppp_warn("invalid address length %v in auth. address list",
-		     ptr_mask+1);
+		ppp_warn(("invalid address length %v in auth. address list",
+		     ptr_mask+1));
 		continue;
 	    }
 	    bit_count = 32 - bit_count;	/* # bits in host part */
@@ -2108,7 +2111,7 @@
 		++endp;
 	    }
 	    if (*endp != 0) {
-		ppp_warn("invalid address length syntax: %v", ptr_mask+1);
+		ppp_warn(("invalid address length syntax: %v", ptr_mask+1));
 		continue;
 	    }
 	    *ptr_mask = '\0';
@@ -2141,13 +2144,13 @@
 	    *ptr_mask = '/';
 
 	if (a == (u32_t)-1L) {
-	    ppp_warn("unknown host %s in auth. address list", ap->word);
+	    ppp_warn(("unknown host %s in auth. address list", ap->word));
 	    continue;
 	}
 	if (offset != 0) {
 	    if (offset >= ~mask) {
-		ppp_warn("interface unit %d too large for subnet %v",
-		     ifunit, ptr_word);
+		ppp_warn(("interface unit %d too large for subnet %v",
+		     ifunit, ptr_word));
 		continue;
 	    }
 	    a = lwip_htonl((lwip_ntohl(a) & mask) + offset);
@@ -2295,10 +2298,10 @@
     struct stat sbuf;
 
     if (fstat(fileno(f), &sbuf) < 0) {
-	ppp_warn("cannot stat secret file %s: %m", filename);
+	ppp_warn(("cannot stat secret file %s: %m", filename));
     } else if ((sbuf.st_mode & (S_IRWXG | S_IRWXO)) != 0) {
-	ppp_warn("Warning - secret file %s has world and/or group access",
-	     filename);
+	ppp_warn(("Warning - secret file %s has world and/or group access",
+	     filename));
     }
 }
 
@@ -2408,12 +2411,12 @@
 	    if (word[0] == '@' && word[1] == '/') {
 		strlcpy(atfile, word+1, sizeof(atfile));
 		if ((sf = fopen(atfile, "r")) == NULL) {
-		    ppp_warn("can't open indirect secret file %s", atfile);
+		    ppp_warn(("can't open indirect secret file %s", atfile));
 		    continue;
 		}
 		check_access(sf, atfile);
 		if (!getword(sf, word, &xxx, atfile)) {
-		    ppp_warn("no secret in indirect secret file %s", atfile);
+		    ppp_warn(("no secret in indirect secret file %s", atfile));
 		    fclose(sf);
 		    continue;
 		}
diff --git a/src/netif/ppp/ccp.c b/src/netif/ppp/ccp.c
index f8519eb..86ecb9f 100644
--- a/src/netif/ppp/ccp.c
+++ b/src/netif/ppp/ccp.c
@@ -463,10 +463,10 @@
     oldstate = f->state;
     fsm_input(f, p, len);
     if (oldstate == PPP_FSM_OPENED && p[0] == TERMREQ && f->state != PPP_FSM_OPENED) {
-	ppp_notice("Compression disabled by peer.");
+	ppp_notice(("Compression disabled by peer."));
 #if MPPE_SUPPORT
 	if (go->mppe) {
-	    ppp_error("MPPE disabled, closing LCP");
+	    ppp_error(("MPPE disabled, closing LCP"));
 	    lcp_close(pcb, "MPPE disabled by peer");
 	}
 #endif /* MPPE_SUPPORT */
@@ -528,7 +528,7 @@
 
 #if MPPE_SUPPORT
     if (go->mppe) {
-	ppp_error("MPPE required but peer negotiation failed");
+	ppp_error(("MPPE required but peer negotiation failed"));
 	lcp_close(pcb, "MPPE required but peer negotiation failed");
     }
 #endif /* MPPE_SUPPORT */
@@ -589,20 +589,20 @@
 	    auth_mschap_bits >>= 1;
 	} while (auth_mschap_bits);
 	if (numbits > 1) {
-	    ppp_error("MPPE required, but auth done in both directions.");
+	    ppp_error(("MPPE required, but auth done in both directions."));
 	    lcp_close(pcb, "MPPE required but not available");
 	    return;
 	}
 	if (!numbits) {
-	    ppp_error("MPPE required, but MS-CHAP[v2] auth not performed.");
+	    ppp_error(("MPPE required, but MS-CHAP[v2] auth not performed."));
 	    lcp_close(pcb, "MPPE required but not available");
 	    return;
 	}
 
 	/* A plugin (eg radius) may not have obtained key material. */
 	if (!pcb->mppe_keys_set) {
-	    ppp_error("MPPE required, but keys are not available.  "
-		  "Possible plugin problem?");
+	    ppp_error(("MPPE required, but keys are not available.  "
+		  "Possible plugin problem?"));
 	    lcp_close(pcb, "MPPE required but not available");
 	    return;
 	}
@@ -611,7 +611,7 @@
 	if (pcb->auth_done & (CHAP_MS_WITHPEER | CHAP_MS_PEER)) {
 	    /* This might be noise */
 	    if (go->mppe & MPPE_OPT_40) {
-		ppp_notice("Disabling 40-bit MPPE; MS-CHAP LM not supported");
+		ppp_notice(("Disabling 40-bit MPPE; MS-CHAP LM not supported"));
 		go->mppe &= ~MPPE_OPT_40;
 		wo->mppe &= ~MPPE_OPT_40;
 	    }
@@ -620,7 +620,7 @@
 	/* Last check: can we actually negotiate something? */
 	if (!(go->mppe & (MPPE_OPT_40 | MPPE_OPT_128))) {
 	    /* Could be misconfig, could be 40-bit disabled above. */
-	    ppp_error("MPPE required, but both 40-bit and 128-bit disabled.");
+	    ppp_error(("MPPE required, but both 40-bit and 128-bit disabled."));
 	    lcp_close(pcb, "MPPE required but not available");
 	    return;
 	}
@@ -949,7 +949,7 @@
 	 */
 	MPPE_CI_TO_OPTS(&p[2], try_.mppe);
 	if ((try_.mppe & MPPE_OPT_STATEFUL) && pcb->settings.refuse_mppe_stateful) {
-	    ppp_error("Refusing MPPE stateful mode offered by peer");
+	    ppp_error(("Refusing MPPE stateful mode offered by peer"));
 	    try_.mppe = 0;
 	} else if (((go->mppe | MPPE_OPT_STATEFUL) & try_.mppe) != try_.mppe) {
 	    /* Peer must have set options we didn't request (suggest) */
@@ -957,7 +957,7 @@
 	}
 
 	if (!try_.mppe) {
-	    ppp_error("MPPE required but peer negotiation failed");
+	    ppp_error(("MPPE required but peer negotiation failed"));
 	    lcp_close(pcb, "MPPE required but peer negotiation failed");
 	}
     }
@@ -1035,7 +1035,7 @@
 #if MPPE_SUPPORT
     if (go->mppe && len >= CILEN_MPPE
 	&& p[0] == CI_MPPE && p[1] == CILEN_MPPE) {
-	ppp_error("MPPE required but peer refused");
+	ppp_error(("MPPE required but peer refused"));
 	lcp_close(pcb, "MPPE required but peer refused");
 	p += CILEN_MPPE;
 	len -= CILEN_MPPE;
@@ -1164,7 +1164,7 @@
 		     * the Internet -- which is where we expect MPPE.
 		     */
 		   if (pcb->settings.refuse_mppe_stateful) {
-			ppp_error("Refusing MPPE stateful mode offered by peer");
+			ppp_error(("Refusing MPPE stateful mode offered by peer"));
 			newret = CONFREJ;
 			break;
 		    }
@@ -1213,9 +1213,9 @@
 		     * because MPPE frames **grow**.  The kernel [must]
 		     * allocate MPPE_PAD extra bytes in xmit buffers.
 		     */
-		    mtu = netif_get_mtu(pcb);
+		    mtu = ppp_netif_get_mtu(pcb);
 		    if (mtu)
-			netif_set_mtu(pcb, mtu - MPPE_PAD);
+			ppp_netif_set_mtu(pcb, mtu - MPPE_PAD);
 		    else
 			newret = CONFREJ;
 		}
@@ -1375,7 +1375,7 @@
     }
 #if MPPE_SUPPORT
     if (ret == CONFREJ && ao->mppe && rej_for_ci_mppe) {
-	ppp_error("MPPE required but peer negotiation failed");
+	ppp_error(("MPPE required but peer negotiation failed"));
 	lcp_close(pcb, "MPPE required but peer negotiation failed");
     }
 #endif /* MPPE_SUPPORT */
@@ -1466,16 +1466,16 @@
     if (ccp_anycompress(go)) {
 	if (ccp_anycompress(ho)) {
 	    if (go->method == ho->method) {
-		ppp_notice("%s compression enabled", method_name(go, ho));
+		ppp_notice(("%s compression enabled", method_name(go, ho)));
 	    } else {
 		ppp_strlcpy(method1, method_name(go, NULL), sizeof(method1));
-		ppp_notice("%s / %s compression enabled",
-		       method1, method_name(ho, NULL));
+		ppp_notice(("%s / %s compression enabled",
+		       method1, method_name(ho, NULL)));
 	    }
 	} else
-	    ppp_notice("%s receive compression enabled", method_name(go, NULL));
+	    ppp_notice(("%s receive compression enabled", method_name(go, NULL)));
     } else if (ccp_anycompress(ho))
-	ppp_notice("%s transmit compression enabled", method_name(ho, NULL));
+	ppp_notice(("%s transmit compression enabled", method_name(ho, NULL)));
 #if MPPE_SUPPORT
     if (go->mppe) {
 	continue_networks(pcb);		/* Bring up IP et al */
@@ -1501,7 +1501,7 @@
 	go->mppe = 0;
 	if (pcb->lcp_fsm.state == PPP_FSM_OPENED) {
 	    /* If LCP is not already going down, make sure it does. */
-	    ppp_error("MPPE disabled");
+	    ppp_error(("MPPE disabled"));
 	    lcp_close(pcb, "MPPE disabled");
 	}
     }
@@ -1671,14 +1671,14 @@
 	    /*
 	     * Disable compression by taking CCP down.
 	     */
-	    ppp_error("Lost compression sync: disabling compression");
+	    ppp_error(("Lost compression sync: disabling compression"));
 	    ccp_close(pcb, "Lost compression sync");
 #if MPPE_SUPPORT
 	    /*
 	     * If we were doing MPPE, we must also take the link down.
 	     */
 	    if (go->mppe) {
-		ppp_error("Too many MPPE errors, closing LCP");
+		ppp_error(("Too many MPPE errors, closing LCP"));
 		lcp_close(pcb, "Too many MPPE errors");
 	    }
 #endif /* MPPE_SUPPORT */
diff --git a/src/netif/ppp/chap-new.c b/src/netif/ppp/chap-new.c
index 485122d..da12430 100644
--- a/src/netif/ppp/chap-new.c
+++ b/src/netif/ppp/chap-new.c
@@ -166,15 +166,15 @@
 	int i;
 
 	if (pcb->chap_server.flags & AUTH_STARTED) {
-		ppp_error("CHAP: peer authentication already started!");
+		ppp_error(("CHAP: peer authentication already started!"));
 		return;
 	}
 	for (i = 0; (dp = chap_digests[i]) != NULL; ++i)
 		if (dp->code == digest_code)
 			break;
 	if (dp == NULL)
-		ppp_fatal("CHAP digest 0x%x requested but not available",
-		      digest_code);
+		ppp_fatal(("CHAP digest 0x%x requested but not available",
+		      digest_code));
 
 	pcb->chap_server.digest = dp;
 	pcb->chap_server.name = our_name;
@@ -198,7 +198,7 @@
 		return;
 
 	if (pcb->chap_client.flags & AUTH_STARTED) {
-		ppp_error("CHAP: authentication with peer already started!");
+		ppp_error(("CHAP: authentication with peer already started!"));
 		return;
 	}
 	for (i = 0; (dp = chap_digests[i]) != NULL; ++i)
@@ -206,8 +206,8 @@
 			break;
 
 	if (dp == NULL)
-		ppp_fatal("CHAP digest 0x%x requested but not available",
-		      digest_code);
+		ppp_fatal(("CHAP digest 0x%x requested but not available",
+		      digest_code));
 
 	pcb->chap_client.digest = dp;
 	pcb->chap_client.name = our_name;
@@ -236,7 +236,7 @@
 		return;
 	}
 
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(pcb->chap_server.challenge_pktlen), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(pcb->chap_server.challenge_pktlen), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -337,7 +337,7 @@
 #endif /* UNUSED */
 		if (!ok) {
 			pcb->chap_server.flags |= AUTH_FAILED;
-			ppp_warn("Peer %q failed CHAP authentication", name);
+			ppp_warn(("Peer %q failed CHAP authentication", name));
 		}
 	} else if ((pcb->chap_server.flags & AUTH_DONE) == 0)
 		return;
@@ -345,7 +345,7 @@
 	/* send the response */
 	mlen = strlen(message);
 	len = CHAP_HDRLEN + mlen;
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +len), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +len), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -381,7 +381,7 @@
 		    if (session_mgmt &&
 			session_check(name, NULL, devnam, NULL) == 0) {
 			pcb->chap_server.flags |= AUTH_FAILED;
-			ppp_warn("Peer %q failed CHAP Session verification", name);
+			ppp_warn(("Peer %q failed CHAP Session verification", name));
 		    }
 #endif /* UNUSED */
 
@@ -418,7 +418,7 @@
 
 	/* Get the secret that the peer is supposed to know */
 	if (!get_secret(pcb, name, ourname, (char *)secret, &secret_len, 1)) {
-		ppp_error("No CHAP secret found for authenticating %q", name);
+		ppp_error(("No CHAP secret found for authenticating %q", name));
 		return 0;
 	}
 	ok = digest->verify_response(pcb, id, name, secret, secret_len, challenge,
@@ -441,7 +441,7 @@
 	char rname[MAXNAMELEN+1];
 	char secret[MAXSECRETLEN+1];
 
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(RESP_MAX_PKTLEN), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(RESP_MAX_PKTLEN), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -468,7 +468,7 @@
 	/* get secret for authenticating ourselves with the specified host */
 	if (!get_secret(pcb, pcb->chap_client.name, rname, secret, &secret_len, 0)) {
 		secret_len = 0;	/* assume null secret if can't find one */
-		ppp_warn("No CHAP secret found for authenticating us to %q", rname);
+		ppp_warn(("No CHAP secret found for authenticating us to %q", rname));
 	}
 
 	outp = (u_char*)p->payload;
@@ -519,15 +519,15 @@
 	}
 	if (msg) {
 		if (len > 0)
-			ppp_info("%s: %.*v", msg, len, pkt);
+			ppp_info(("%s: %.*v", msg, len, pkt));
 		else
-			ppp_info("%s", msg);
+			ppp_info(("%s", msg));
 	}
 	if (code == CHAP_SUCCESS)
 		auth_withpeer_success(pcb, PPP_CHAP, pcb->chap_client.digest->code);
 	else {
 		pcb->chap_client.flags |= AUTH_FAILED;
-		ppp_error("CHAP authentication failed");
+		ppp_error(("CHAP authentication failed"));
 		auth_withpeer_fail(pcb, PPP_CHAP);
 	}
 }
@@ -577,7 +577,7 @@
 #endif /* PPP_SERVER */
 	if ((pcb->chap_client.flags & (AUTH_STARTED|AUTH_DONE)) == AUTH_STARTED) {
 		pcb->chap_client.flags &= ~AUTH_STARTED;
-		ppp_error("CHAP authentication failed due to protocol-reject");
+		ppp_error(("CHAP authentication failed due to protocol-reject"));
 		auth_withpeer_fail(pcb, PPP_CHAP);
 	}
 }
diff --git a/src/netif/ppp/chap_ms.c b/src/netif/ppp/chap_ms.c
index 5a989c9..0639e7d 100644
--- a/src/netif/ppp/chap_ms.c
+++ b/src/netif/ppp/chap_ms.c
@@ -33,7 +33,7 @@
  *
  *   Implemented LANManager type password response to MS-CHAP challenges.
  *   Now pppd provides both NT style and LANMan style blocks, and the
- *   prefered is set by option "ms-lanman". Default is to use NT.
+ *   preferred is set by option "ms-lanman". Default is to use NT.
  *   The hash text (StdText) was taken from Win95 RASAPI32.DLL.
  *
  *   You should also use DOMAIN\\USERNAME as described in README.MSCHAP80
@@ -264,7 +264,7 @@
 #ifndef MSLANMAN
 	if (!response[MS_CHAP_USENT]) {
 		/* Should really propagate this into the error packet. */
-		ppp_notice("Peer request for LANMAN auth not supported");
+		ppp_notice(("Peer request for LANMAN auth not supported"));
 		goto bad;
 	}
 #endif
@@ -404,7 +404,7 @@
 	if ((len < MS_AUTH_RESPONSE_LENGTH + 2) ||
 	    strncmp((char *)msg, "S=", 2) != 0) {
 		/* Packet does not start with "S=" */
-		ppp_error("MS-CHAPv2 Success packet is badly formed.");
+		ppp_error(("MS-CHAPv2 Success packet is badly formed."));
 		return 0;
 	}
 	msg += 2;
@@ -412,7 +412,7 @@
 	if (len < MS_AUTH_RESPONSE_LENGTH
 	    || memcmp(msg, private_, MS_AUTH_RESPONSE_LENGTH)) {
 		/* Authenticator Response did not match expected. */
-		ppp_error("MS-CHAPv2 mutual authentication failed.");
+		ppp_error(("MS-CHAPv2 mutual authentication failed."));
 		return 0;
 	}
 	/* Authenticator Response matches. */
@@ -422,7 +422,7 @@
 		msg += 3; /* Eat the delimiter */
 	} else if (len) {
 		/* Packet has extra text which does not begin " M=" */
-		ppp_error("MS-CHAPv2 Success packet is badly formed.");
+		ppp_error(("MS-CHAPv2 Success packet is badly formed."));
 		return 0;
 	}
 	return 1;
@@ -483,14 +483,14 @@
 			break;
 
 		default:
-			ppp_error("Unknown MS-CHAP authentication failure: %.*v",
-			      len, inp);
+			ppp_error(("Unknown MS-CHAP authentication failure: %.*v",
+			      len, inp));
 			return;
 		}
 	}
 print_msg:
 	if (p != NULL)
-		ppp_error("MS-CHAP authentication failed: %v", p);
+		ppp_error(("MS-CHAP authentication failed: %v", p));
 }
 
 static void ChallengeResponse(const u_char *challenge,
diff --git a/src/netif/ppp/demand.c b/src/netif/ppp/demand.c
index 26c6c30..709e5ea 100644
--- a/src/netif/ppp/demand.c
+++ b/src/netif/ppp/demand.c
@@ -86,8 +86,8 @@
     const struct protent *protp;
 
 /*    framemax = lcp_allowoptions[0].mru;
-    if (framemax < PPP_MRU) */
-	framemax = PPP_MRU;
+    if (framemax < PPP_DEFMRU) */
+	framemax = PPP_DEFMRU;
     framemax += PPP_HDRLEN + PPP_FCSLEN;
     frame = malloc(framemax);
     if (frame == NULL)
@@ -98,9 +98,9 @@
     flush_flag = 0;
     fcs = PPP_INITFCS;
 
-    netif_set_mtu(pcb, LWIP_MIN(lcp_allowoptions[0].mru, PPP_MRU));
-    if (ppp_send_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0
-	|| ppp_recv_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0)
+    ppp_netif_set_mtu(pcb, LWIP_MIN(lcp_allowoptions[0].mru, PPP_DEFMRU));
+    if (ppp_send_config(pcb, PPP_DEFMRU, (u32_t) 0, 0, 0) < 0
+	|| ppp_recv_config(pcb, PPP_DEFMRU, (u32_t) 0, 0, 0) < 0)
 	    fatal("Couldn't set up demand-dialled PPP interface: %m");
 
 #ifdef PPP_FILTER
diff --git a/src/netif/ppp/eap.c b/src/netif/ppp/eap.c
index 8fb5636..ea684bf 100644
--- a/src/netif/ppp/eap.c
+++ b/src/netif/ppp/eap.c
@@ -13,7 +13,7 @@
  *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * Original version by James Carlson
  *
@@ -211,7 +211,7 @@
 	if (!eap_client_active(pcb))
 		return;
 
-	ppp_error("EAP: timeout waiting for Request from peer");
+	ppp_error(("EAP: timeout waiting for Request from peer"));
 	auth_withpeer_fail(pcb, PPP_EAP);
 	pcb->eap.es_client.ea_state = eapBadAuth;
 }
@@ -251,7 +251,7 @@
 	struct pbuf *p;
 	u_char *outp;
 
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + EAP_HEADERLEN), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + EAP_HEADERLEN), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -282,7 +282,7 @@
 	struct pbuf *p;
 	u_char *outp;
 
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + EAP_HEADERLEN), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + EAP_HEADERLEN), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -471,8 +471,8 @@
 				toffs -= 86400;
 				/* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */
 				if (!DesDecrypt(secbuf, clear)) {
-					ppp_dbglog("no DES here; cannot decode "
-					    "pseudonym");
+					ppp_dbglog(("no DES here; cannot decode "
+					    "pseudonym"));
 					return;
 				}
 				id = *(unsigned char *)clear;
@@ -502,11 +502,11 @@
 				}
 				pcb->eap.es_server.ea_peer[
 					pcb->eap.es_server.ea_peerlen] = '\0';
-				ppp_dbglog("decoded pseudonym to \"%.*q\"",
+				ppp_dbglog(("decoded pseudonym to \"%.*q\"",
 				    pcb->eap.es_server.ea_peerlen,
-				    pcb->eap.es_server.ea_peer);
+				    pcb->eap.es_server.ea_peer));
 			} else {
-				ppp_dbglog("failed to decode real name");
+				ppp_dbglog(("failed to decode real name"));
 				/* Stay in eapIdentfy state; requery */
 				break;
 			}
@@ -676,14 +676,14 @@
 	if (pcb->settings.eap_max_transmits > 0 &&
 	    pcb->eap.es_server.ea_requests >= pcb->settings.eap_max_transmits) {
 		if (pcb->eap.es_server.ea_responses > 0)
-			ppp_error("EAP: too many Requests sent");
+			ppp_error(("EAP: too many Requests sent"));
 		else
-			ppp_error("EAP: no response to Requests");
+			ppp_error(("EAP: no response to Requests"));
 		eap_send_failure(pcb);
 		return;
 	}
 
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_CTRL_PBUF_MAX_SIZE), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_CTRL_PBUF_UNKNOWN_SIZE), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -786,7 +786,7 @@
 			cp += j;
 			/* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */
 			if (!DesEncrypt(clear, cipher)) {
-				ppp_dbglog("no DES here; not generating pseudonym");
+				ppp_dbglog(("no DES here; not generating pseudonym"));
 				break;
 			}
 			BZERO(&b64, sizeof (b64));
@@ -997,12 +997,12 @@
 static void eap_protrej(ppp_pcb *pcb) {
 
 	if (eap_client_active(pcb)) {
-		ppp_error("EAP authentication failed due to Protocol-Reject");
+		ppp_error(("EAP authentication failed due to Protocol-Reject"));
 		auth_withpeer_fail(pcb, PPP_EAP);
 	}
 #if PPP_SERVER
 	if (eap_server_active(pcb)) {
-		ppp_error("EAP authentication of peer failed on Protocol-Reject");
+		ppp_error(("EAP authentication of peer failed on Protocol-Reject"));
 		auth_peer_fail(pcb, PPP_EAP);
 	}
 #endif /* PPP_SERVER */
@@ -1018,7 +1018,7 @@
 	int msglen;
 
 	msglen = EAP_HEADERLEN + sizeof (u_char) + lenstr;
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -1052,7 +1052,7 @@
 
 	msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + MD5_SIGNATURE_SIZE +
 	    namelen;
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -1097,7 +1097,7 @@
 	int msglen;
 
 	msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + lenstr;
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -1139,7 +1139,7 @@
 
 	msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + sizeof (u32_t) +
 	    SHA_DIGESTSIZE;
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -1170,7 +1170,7 @@
 	int msglen;
 
 	msglen = EAP_HEADERLEN + 2 * sizeof (u_char);
-	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
+	p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PBUF_RAM);
 	if(NULL == p)
 		return;
 	if(p->tot_len != p->len) {
@@ -1213,7 +1213,7 @@
 		return (NULL);
 	(void) slprintf(path, pl, "%s/%s", user, file);
 	if (!pnlogged) {
-		ppp_dbglog("pseudonym file: %s", path);
+		ppp_dbglog(("pseudonym file: %s", path));
 		pnlogged = 1;
 	}
 	return (path);
@@ -1284,22 +1284,22 @@
 
 	/* Now check that the result is sane */
 	if (olen <= 0 || *inp + 1 > olen) {
-		ppp_dbglog("EAP: decoded pseudonym is unusable <%.*B>", olen, inp);
+		ppp_dbglog(("EAP: decoded pseudonym is unusable <%.*B>", olen, inp));
 		return;
 	}
 
 	/* Save it away */
 	fd = open_pn_file(O_WRONLY | O_CREAT | O_TRUNC);
 	if (fd < 0) {
-		ppp_dbglog("EAP: error saving pseudonym: %m");
+		ppp_dbglog(("EAP: error saving pseudonym: %m"));
 		return;
 	}
 	len = write(fd, inp + 1, *inp);
 	if (close(fd) != -1 && len == *inp) {
-		ppp_dbglog("EAP: saved pseudonym");
+		ppp_dbglog(("EAP: saved pseudonym"));
 		pcb->eap.es_usedpseudo = 0;
 	} else {
-		ppp_dbglog("EAP: failed to save pseudonym");
+		ppp_dbglog(("EAP: failed to save pseudonym"));
 		remove_pn_file();
 	}
 }
@@ -1326,6 +1326,12 @@
 #endif /* USE_SRP */
 
 	/*
+	 * Ignore requests if we're not open
+	 */
+	if (pcb->eap.es_client.ea_state <= eapClosed)
+		return;
+
+	/*
 	 * Note: we update es_client.ea_id *only if* a Response
 	 * message is being generated.  Otherwise, we leave it the
 	 * same for duplicate detection purposes.
@@ -1334,7 +1340,7 @@
 	pcb->eap.es_client.ea_requests++;
 	if (pcb->settings.eap_allow_req != 0 &&
 	    pcb->eap.es_client.ea_requests > pcb->settings.eap_allow_req) {
-		ppp_info("EAP: received too many Request messages");
+		ppp_info(("EAP: received too many Request messages"));
 		if (pcb->settings.eap_req_time > 0) {
 			UNTIMEOUT(eap_client_timeout, pcb);
 		}
@@ -1343,7 +1349,7 @@
 	}
 
 	if (len <= 0) {
-		ppp_error("EAP: empty Request message discarded");
+		ppp_error(("EAP: empty Request message discarded"));
 		return;
 	}
 
@@ -1353,7 +1359,7 @@
 	switch (typenum) {
 	case EAPT_IDENTITY:
 		if (len > 0)
-			ppp_info("EAP: Identity prompt \"%.*q\"", len, inp);
+			ppp_info(("EAP: Identity prompt \"%.*q\"", len, inp));
 #ifdef USE_SRP
 		if (pcb->eap.es_usepseudo &&
 		    (pcb->eap.es_usedpseudo == 0 ||
@@ -1387,7 +1393,7 @@
 
 	case EAPT_NOTIFICATION:
 		if (len > 0)
-			ppp_info("EAP: Notification \"%.*q\"", len, inp);
+			ppp_info(("EAP: Notification \"%.*q\"", len, inp));
 		eap_send_response(pcb, id, typenum, NULL, 0);
 		break;
 
@@ -1396,29 +1402,29 @@
 		 * Avoid the temptation to send Response Nak in reply
 		 * to Request Nak here.  It can only lead to trouble.
 		 */
-		ppp_warn("EAP: unexpected Nak in Request; ignored");
+		ppp_warn(("EAP: unexpected Nak in Request; ignored"));
 		/* Return because we're waiting for something real. */
 		return;
 
 	case EAPT_MD5CHAP:
 		if (len < 1) {
-			ppp_error("EAP: received MD5-Challenge with no data");
+			ppp_error(("EAP: received MD5-Challenge with no data"));
 			/* Bogus request; wait for something real. */
 			return;
 		}
 		GETCHAR(vallen, inp);
 		len--;
 		if (vallen < 8 || vallen > len) {
-			ppp_error("EAP: MD5-Challenge with bad length %d (8..%d)",
-			    vallen, len);
+			ppp_error(("EAP: MD5-Challenge with bad length %d (8..%d)",
+			    vallen, len));
 			/* Try something better. */
 			eap_send_nak(pcb, id, EAPT_SRP);
 			break;
 		}
 
 		/* Not so likely to happen. */
-		if (vallen >= len + sizeof (rhostname)) {
-			ppp_dbglog("EAP: trimming really long peer name down");
+		if (len - vallen >= (int)sizeof (rhostname)) {
+			ppp_dbglog(("EAP: trimming really long peer name down"));
 			MEMCPY(rhostname, inp + vallen, sizeof (rhostname) - 1);
 			rhostname[sizeof (rhostname) - 1] = '\0';
 		} else {
@@ -1439,7 +1445,7 @@
 		 */
 		if (!get_secret(pcb, pcb->eap.es_client.ea_name,
 		    rhostname, secret, &secret_len, 0)) {
-			ppp_dbglog("EAP: no MD5 secret for auth to %q", rhostname);
+			ppp_dbglog(("EAP: no MD5 secret for auth to %q", rhostname));
 			eap_send_nak(pcb, id, EAPT_SRP);
 			break;
 		}
@@ -1459,7 +1465,7 @@
 #ifdef USE_SRP
 	case EAPT_SRP:
 		if (len < 1) {
-			ppp_error("EAP: received empty SRP Request");
+			ppp_error(("EAP: received empty SRP Request"));
 			/* Bogus request; wait for something real. */
 			return;
 		}
@@ -1492,8 +1498,8 @@
 				GETCHAR(vallen, inp);
 				len--;
 				if (vallen >= len) {
-					ppp_error("EAP: badly-formed SRP Challenge"
-					    " (name)");
+					ppp_error(("EAP: badly-formed SRP Challenge"
+					    " (name)"));
 					/* Ignore badly-formed messages */
 					return;
 				}
@@ -1523,8 +1529,8 @@
 				GETCHAR(vallen, inp);
 				len--;
 				if (vallen >= len) {
-					ppp_error("EAP: badly-formed SRP Challenge"
-					    " (s)");
+					ppp_error(("EAP: badly-formed SRP Challenge"
+					    " (s)"));
 					/* Ignore badly-formed messages */
 					return;
 				}
@@ -1536,8 +1542,8 @@
 				GETCHAR(vallen, inp);
 				len--;
 				if (vallen > len) {
-					ppp_error("EAP: badly-formed SRP Challenge"
-					    " (g)");
+					ppp_error(("EAP: badly-formed SRP Challenge"
+					    " (g)"));
 					/* Ignore badly-formed messages */
 					return;
 				}
@@ -1584,7 +1590,7 @@
 		case EAPSRP_SKEY:
 			tc = (struct t_client *)pcb->eap.es_client.ea_session;
 			if (tc == NULL) {
-				ppp_warn("EAP: peer sent Subtype 2 without 1");
+				ppp_warn(("EAP: peer sent Subtype 2 without 1"));
 				eap_send_nak(pcb, id, EAPT_MD5CHAP);
 				break;
 			}
@@ -1594,9 +1600,9 @@
 				 * if it does (but otherwise ignore).
 				 */
 				if (id != pcb->eap.es_client.ea_id) {
-					ppp_warn("EAP: ID changed from %d to %d "
+					ppp_warn(("EAP: ID changed from %d to %d "
 					    "in SRP Subtype 2 rexmit",
-					    pcb->eap.es_client.ea_id, id);
+					    pcb->eap.es_client.ea_id, id));
 				}
 			} else {
 				if (get_srp_secret(pcb->eap.es_unit,
@@ -1618,7 +1624,7 @@
 				    t_clientgetkey(tc, &Bval);
 				if (pcb->eap.es_client.ea_skey == NULL) {
 					/* Server is rogue; stop now */
-					ppp_error("EAP: SRP server is rogue");
+					ppp_error(("EAP: SRP server is rogue"));
 					goto client_failure;
 				}
 			}
@@ -1629,7 +1635,7 @@
 		case EAPSRP_SVALIDATOR:
 			tc = (struct t_client *)pcb->eap.es_client.ea_session;
 			if (tc == NULL || pcb->eap.es_client.ea_skey == NULL) {
-				ppp_warn("EAP: peer sent Subtype 3 without 1/2");
+				ppp_warn(("EAP: peer sent Subtype 3 without 1/2"));
 				eap_send_nak(pcb, id, EAPT_MD5CHAP);
 				break;
 			}
@@ -1640,16 +1646,16 @@
 			 */
 			if (pcb->eap.es_client.ea_state == eapOpen) {
 				if (id != pcb->eap.es_client.ea_id) {
-					ppp_warn("EAP: ID changed from %d to %d "
+					ppp_warn(("EAP: ID changed from %d to %d "
 					    "in SRP Subtype 3 rexmit",
-					    pcb->eap.es_client.ea_id, id);
+					    pcb->eap.es_client.ea_id, id));
 				}
 			} else {
 				len -= sizeof (u32_t) + SHA_DIGESTSIZE;
 				if (len < 0 || t_clientverify(tc, inp +
 					sizeof (u32_t)) != 0) {
-					ppp_error("EAP: SRP server verification "
-					    "failed");
+					ppp_error(("EAP: SRP server verification "
+					    "failed"));
 					goto client_failure;
 				}
 				GETLONG(pcb->eap.es_client.ea_keyflags, inp);
@@ -1669,7 +1675,7 @@
 
 		case EAPSRP_LWRECHALLENGE:
 			if (len < 4) {
-				ppp_warn("EAP: malformed Lightweight rechallenge");
+				ppp_warn(("EAP: malformed Lightweight rechallenge"));
 				return;
 			}
 			SHA1Init(&ctxt);
@@ -1686,7 +1692,7 @@
 			break;
 
 		default:
-			ppp_error("EAP: unknown SRP Subtype %d", vallen);
+			ppp_error(("EAP: unknown SRP Subtype %d", vallen));
 			eap_send_nak(pcb, id, EAPT_MD5CHAP);
 			break;
 		}
@@ -1694,7 +1700,7 @@
 #endif /* USE_SRP */
 
 	default:
-		ppp_info("EAP: unknown authentication type %d; Naking", typenum);
+		ppp_info(("EAP: unknown authentication type %d; Naking", typenum));
 		eap_send_nak(pcb, id, EAPT_SRP);
 		break;
 	}
@@ -1737,16 +1743,22 @@
 	u_char dig[SHA_DIGESTSIZE];
 #endif /* USE_SRP */
 
+	/*
+	 * Ignore responses if we're not open
+	 */
+	if (pcb->eap.es_server.ea_state <= eapClosed)
+		return;
+
 	if (pcb->eap.es_server.ea_id != id) {
-		ppp_dbglog("EAP: discarding Response %d; expected ID %d", id,
-		    pcb->eap.es_server.ea_id);
+		ppp_dbglog(("EAP: discarding Response %d; expected ID %d", id,
+		    pcb->eap.es_server.ea_id));
 		return;
 	}
 
 	pcb->eap.es_server.ea_responses++;
 
 	if (len <= 0) {
-		ppp_error("EAP: empty Response message discarded");
+		ppp_error(("EAP: empty Response message discarded"));
 		return;
 	}
 
@@ -1756,11 +1768,11 @@
 	switch (typenum) {
 	case EAPT_IDENTITY:
 		if (pcb->eap.es_server.ea_state != eapIdentify) {
-			ppp_dbglog("EAP discarding unwanted Identify \"%.q\"", len,
-			    inp);
+			ppp_dbglog(("EAP discarding unwanted Identify \"%.q\"", len,
+			    inp));
 			break;
 		}
-		ppp_info("EAP: unauthenticated peer name \"%.*q\"", len, inp);
+		ppp_info(("EAP: unauthenticated peer name \"%.*q\"", len, inp));
 		if (len > MAXNAMELEN) {
 		  len = MAXNAMELEN;
 		}
@@ -1771,12 +1783,12 @@
 		break;
 
 	case EAPT_NOTIFICATION:
-		ppp_dbglog("EAP unexpected Notification; response discarded");
+		ppp_dbglog(("EAP unexpected Notification; response discarded"));
 		break;
 
 	case EAPT_NAK:
 		if (len < 1) {
-			ppp_info("EAP: Nak Response with no suggested protocol");
+			ppp_info(("EAP: Nak Response with no suggested protocol"));
 			eap_figure_next_state(pcb, 1);
 			break;
 		}
@@ -1806,7 +1818,7 @@
 			break;
 
 		default:
-			ppp_dbglog("EAP: peer requesting unknown Type %d", vallen);
+			ppp_dbglog(("EAP: peer requesting unknown Type %d", vallen));
 			switch (pcb->eap.es_server.ea_state) {
 			case eapSRP1:
 			case eapSRP2:
@@ -1827,26 +1839,26 @@
 
 	case EAPT_MD5CHAP:
 		if (pcb->eap.es_server.ea_state != eapMD5Chall) {
-			ppp_error("EAP: unexpected MD5-Response");
+			ppp_error(("EAP: unexpected MD5-Response"));
 			eap_figure_next_state(pcb, 1);
 			break;
 		}
 		if (len < 1) {
-			ppp_error("EAP: received MD5-Response with no data");
+			ppp_error(("EAP: received MD5-Response with no data"));
 			eap_figure_next_state(pcb, 1);
 			break;
 		}
 		GETCHAR(vallen, inp);
 		len--;
 		if (vallen != 16 || vallen > len) {
-			ppp_error("EAP: MD5-Response with bad length %d", vallen);
+			ppp_error(("EAP: MD5-Response with bad length %d", vallen));
 			eap_figure_next_state(pcb, 1);
 			break;
 		}
 
 		/* Not so likely to happen. */
-		if (vallen >= len + sizeof (rhostname)) {
-			ppp_dbglog("EAP: trimming really long peer name down");
+		if (len - vallen >= (int)sizeof (rhostname)) {
+			ppp_dbglog(("EAP: trimming really long peer name down"));
 			MEMCPY(rhostname, inp + vallen, sizeof (rhostname) - 1);
 			rhostname[sizeof (rhostname) - 1] = '\0';
 		} else {
@@ -1867,7 +1879,7 @@
 		 */
 		if (!get_secret(pcb, rhostname,
 		    pcb->eap.es_server.ea_name, secret, &secret_len, 1)) {
-			ppp_dbglog("EAP: no MD5 secret for auth of %q", rhostname);
+			ppp_dbglog(("EAP: no MD5 secret for auth of %q", rhostname));
 			eap_send_failure(pcb);
 			break;
 		}
@@ -1893,7 +1905,7 @@
 #ifdef USE_SRP
 	case EAPT_SRP:
 		if (len < 1) {
-			ppp_error("EAP: empty SRP Response");
+			ppp_error(("EAP: empty SRP Response"));
 			eap_figure_next_state(pcb, 1);
 			break;
 		}
@@ -1902,7 +1914,7 @@
 		switch (typenum) {
 		case EAPSRP_CKEY:
 			if (pcb->eap.es_server.ea_state != eapSRP1) {
-				ppp_error("EAP: unexpected SRP Subtype 1 Response");
+				ppp_error(("EAP: unexpected SRP Subtype 1 Response"));
 				eap_figure_next_state(pcb, 1);
 				break;
 			}
@@ -1913,7 +1925,7 @@
 			pcb->eap.es_server.ea_skey = t_servergetkey(ts, &A);
 			if (pcb->eap.es_server.ea_skey == NULL) {
 				/* Client's A value is bogus; terminate now */
-				ppp_error("EAP: bogus A value from client");
+				ppp_error(("EAP: bogus A value from client"));
 				eap_send_failure(pcb);
 			} else {
 				eap_figure_next_state(pcb, 0);
@@ -1922,13 +1934,13 @@
 
 		case EAPSRP_CVALIDATOR:
 			if (pcb->eap.es_server.ea_state != eapSRP2) {
-				ppp_error("EAP: unexpected SRP Subtype 2 Response");
+				ppp_error(("EAP: unexpected SRP Subtype 2 Response"));
 				eap_figure_next_state(pcb, 1);
 				break;
 			}
 			if (len < sizeof (u32_t) + SHA_DIGESTSIZE) {
-				ppp_error("EAP: M1 length %d < %d", len,
-				    sizeof (u32_t) + SHA_DIGESTSIZE);
+				ppp_error(("EAP: M1 length %d < %d", len,
+				    sizeof (u32_t) + SHA_DIGESTSIZE));
 				eap_figure_next_state(pcb, 1);
 				break;
 			}
@@ -1936,7 +1948,7 @@
 			ts = (struct t_server *)pcb->eap.es_server.ea_session;
 			assert(ts != NULL);
 			if (t_serververify(ts, inp)) {
-				ppp_info("EAP: unable to validate client identity");
+				ppp_info(("EAP: unable to validate client identity"));
 				eap_send_failure(pcb);
 				break;
 			}
@@ -1945,7 +1957,7 @@
 
 		case EAPSRP_ACK:
 			if (pcb->eap.es_server.ea_state != eapSRP3) {
-				ppp_error("EAP: unexpected SRP Subtype 3 Response");
+				ppp_error(("EAP: unexpected SRP Subtype 3 Response"));
 				eap_send_failure(esp);
 				break;
 			}
@@ -1962,12 +1974,12 @@
 
 		case EAPSRP_LWRECHALLENGE:
 			if (pcb->eap.es_server.ea_state != eapSRP4) {
-				ppp_info("EAP: unexpected SRP Subtype 4 Response");
+				ppp_info(("EAP: unexpected SRP Subtype 4 Response"));
 				return;
 			}
 			if (len != SHA_DIGESTSIZE) {
-				ppp_error("EAP: bad Lightweight rechallenge "
-				    "response");
+				ppp_error(("EAP: bad Lightweight rechallenge "
+				    "response"));
 				return;
 			}
 			SHA1Init(&ctxt);
@@ -1980,7 +1992,7 @@
 			    pcb->eap.es_server.ea_peerlen);
 			SHA1Final(dig, &ctxt);
 			if (BCMP(dig, inp, SHA_DIGESTSIZE) != 0) {
-				ppp_error("EAP: failed Lightweight rechallenge");
+				ppp_error(("EAP: failed Lightweight rechallenge"));
 				eap_send_failure(pcb);
 				break;
 			}
@@ -1995,7 +2007,7 @@
 
 	default:
 		/* This can't happen. */
-		ppp_error("EAP: unknown Response type %d; ignored", typenum);
+		ppp_error(("EAP: unknown Response type %d; ignored", typenum));
 		return;
 	}
 
@@ -2018,9 +2030,9 @@
 	LWIP_UNUSED_ARG(id);
 
 	if (pcb->eap.es_client.ea_state != eapOpen && !eap_client_active(pcb)) {
-		ppp_dbglog("EAP unexpected success message in state %s (%d)",
+		ppp_dbglog(("EAP unexpected success message in state %s (%d)",
 		    eap_state_name(pcb->eap.es_client.ea_state),
-		    pcb->eap.es_client.ea_state);
+		    pcb->eap.es_client.ea_state));
 		return;
 	}
 
@@ -2043,10 +2055,16 @@
 static void eap_failure(ppp_pcb *pcb, u_char *inp, int id, int len) {
 	LWIP_UNUSED_ARG(id);
 
+	/*
+	 * Ignore failure messages if we're not open
+	 */
+	if (pcb->eap.es_client.ea_state <= eapClosed)
+		return;
+
 	if (!eap_client_active(pcb)) {
-		ppp_dbglog("EAP unexpected failure message in state %s (%d)",
+		ppp_dbglog(("EAP unexpected failure message in state %s (%d)",
 		    eap_state_name(pcb->eap.es_client.ea_state),
-		    pcb->eap.es_client.ea_state);
+		    pcb->eap.es_client.ea_state));
 	}
 
 	if (pcb->settings.eap_req_time > 0) {
@@ -2060,7 +2078,7 @@
 
 	pcb->eap.es_client.ea_state = eapBadAuth;
 
-	ppp_error("EAP: peer reports authentication failure");
+	ppp_error(("EAP: peer reports authentication failure"));
 	auth_withpeer_fail(pcb, PPP_EAP);
 }
 
@@ -2076,15 +2094,15 @@
 	 * drop it.
 	 */
 	if (inlen < EAP_HEADERLEN) {
-		ppp_error("EAP: packet too short: %d < %d", inlen, EAP_HEADERLEN);
+		ppp_error(("EAP: packet too short: %d < %d", inlen, EAP_HEADERLEN));
 		return;
 	}
 	GETCHAR(code, inp);
 	GETCHAR(id, inp);
 	GETSHORT(len, inp);
 	if (len < EAP_HEADERLEN || len > inlen) {
-		ppp_error("EAP: packet has illegal length field %d (%d..%d)", len,
-		    EAP_HEADERLEN, inlen);
+		ppp_error(("EAP: packet has illegal length field %d (%d..%d)", len,
+		    EAP_HEADERLEN, inlen));
 		return;
 	}
 	len -= EAP_HEADERLEN;
@@ -2111,7 +2129,7 @@
 
 	default:				/* XXX Need code reject */
 		/* Note: it's not legal to send EAP Nak here. */
-		ppp_warn("EAP: unknown code %d received", code);
+		ppp_warn(("EAP: unknown code %d received", code));
 		break;
 	}
 }
diff --git a/src/netif/ppp/fsm.c b/src/netif/ppp/fsm.c
index b1f08af..2ba1207 100644
--- a/src/netif/ppp/fsm.c
+++ b/src/netif/ppp/fsm.c
@@ -290,7 +290,7 @@
     case PPP_FSM_ACKRCVD:
     case PPP_FSM_ACKSENT:
 	if (f->retransmits <= 0) {
-	    ppp_warn("%s: timeout sending Config-Requests", PROTO_NAME(f));
+	    ppp_warn(("%s: timeout sending Config-Requests", PROTO_NAME(f)));
 	    f->state = PPP_FSM_STOPPED;
 	    if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished )
 		(*f->callbacks->finished)(f);
@@ -464,7 +464,7 @@
     if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):
 	  (len == 0)) ){
 	/* Ack is bad - ignore it */
-	ppp_error("Received bad configure-ack: %P", inp, len);
+	ppp_error(("Received bad configure-ack: %P", inp, len));
 	return;
     }
     f->seen_ack = 1;
@@ -524,14 +524,14 @@
 	treat_as_reject = (f->rnakloops >= f->maxnakloops);
 	if (f->callbacks->nakci == NULL
 	    || !(ret = f->callbacks->nakci(f, inp, len, treat_as_reject))) {
-	    ppp_error("Received bad configure-nak: %P", inp, len);
+	    ppp_error(("Received bad configure-nak: %P", inp, len));
 	    return;
 	}
     } else {
 	f->rnakloops = 0;
 	if (f->callbacks->rejci == NULL
 	    || !(ret = f->callbacks->rejci(f, inp, len))) {
-	    ppp_error("Received bad configure-rej: %P", inp, len);
+	    ppp_error(("Received bad configure-rej: %P", inp, len));
 	    return;
 	}
     }
@@ -588,9 +588,9 @@
 
     case PPP_FSM_OPENED:
 	if (len > 0) {
-	    ppp_info("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p);
+	    ppp_info(("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p));
 	} else
-	    ppp_info("%s terminated by peer", PROTO_NAME(f));
+	    ppp_info(("%s terminated by peer", PROTO_NAME(f)));
 	f->retransmits = 0;
 	f->state = PPP_FSM_STOPPING;
 	if (f->callbacks->down)
@@ -651,7 +651,7 @@
     }
     GETCHAR(code, inp);
     GETCHAR(id, inp);
-    ppp_warn("%s: Rcvd Code-Reject for code %d, id %d", PROTO_NAME(f), code, id);
+    ppp_warn(("%s: Rcvd Code-Reject for code %d, id %d", PROTO_NAME(f), code, id));
 
     if( f->state == PPP_FSM_ACKRCVD )
 	f->state = PPP_FSM_REQSENT;
@@ -735,7 +735,7 @@
     } else
 	cilen = 0;
 
-    p = pbuf_alloc(PBUF_RAW, (u16_t)(cilen + HEADERLEN + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);
+    p = pbuf_alloc(PBUF_RAW, (u16_t)(cilen + HEADERLEN + PPP_HDRLEN), PBUF_RAM);
     if(NULL == p)
         return;
     if(p->tot_len != p->len) {
@@ -778,7 +778,7 @@
 	datalen = pcb->peer_mru - HEADERLEN;
     outlen = datalen + HEADERLEN;
 
-    p = pbuf_alloc(PBUF_RAW, (u16_t)(outlen + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);
+    p = pbuf_alloc(PBUF_RAW, (u16_t)(outlen + PPP_HDRLEN), PBUF_RAM);
     if(NULL == p)
         return;
     if(p->tot_len != p->len) {
diff --git a/src/netif/ppp/ipcp.c b/src/netif/ppp/ipcp.c
index b7c766e..b033cde 100644
--- a/src/netif/ppp/ipcp.c
+++ b/src/netif/ppp/ipcp.c
@@ -1067,7 +1067,7 @@
  * ipcp_nakci - Peer has sent a NAK for some of our CIs.
  * This should not modify any state if the Nak is bad
  * or if IPCP is in the OPENED state.
- * Calback from fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
+ * Callback from fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
  *
  * Returns:
  *	0 - Nak was bad.
@@ -1537,7 +1537,7 @@
     next = inp;
     while (l) {
 	orc = CONFACK;			/* Assume success */
-	cip = p = next;			/* Remember begining of CI */
+	cip = p = next;			/* Remember beginning of CI */
 	if (l < 2 ||			/* Not enough data for CI header or */
 	    p[1] < 2 ||			/*  CI length too small or */
 	    p[1] > l) {			/*  CI length too big? */
@@ -1589,7 +1589,7 @@
 	     * If he doesn't know our address, or if we both have our address
 	     * but disagree about it, then NAK it with our idea.
 	     */
-	    GETLONG(tl, p);		/* Parse desination address (ours) */
+	    GETLONG(tl, p);		/* Parse destination address (ours) */
 	    ciaddr2 = lwip_htonl(tl);
 	    if (ciaddr2 != wo->ouraddr) {
 		if (ciaddr2 == 0 || !wo->accept_local) {
@@ -1739,7 +1739,7 @@
 	}
 endswitch:
 	if (orc == CONFACK &&		/* Good CI */
-	    rc != CONFACK)		/*  but prior CI wasnt? */
+	    rc != CONFACK)		/*  but prior CI wasn't? */
 	    continue;			/* Don't send this one */
 
 	if (orc == CONFNAK) {		/* Nak this CI? */
@@ -1869,9 +1869,9 @@
 	    proxy_arp_set[u] = 1;
 #endif /* UNUSED - PROXY ARP */
 
-    ppp_notice("local  IP address %I", wo->ouraddr);
+    ppp_notice(("local  IP address %I", wo->ouraddr));
     if (wo->hisaddr)
-	ppp_notice("remote IP address %I", wo->hisaddr);
+	ppp_notice(("remote IP address %I", wo->hisaddr));
 
     return 1;
 }
@@ -1899,19 +1899,19 @@
 
     if (!(go->neg_addr || go->old_addrs) && (wo->neg_addr || wo->old_addrs)
 	&& wo->ouraddr != 0) {
-	ppp_error("Peer refused to agree to our IP address");
+	ppp_error(("Peer refused to agree to our IP address"));
 	ipcp_close(f->pcb, "Refused our IP address");
 	return;
     }
     if (go->ouraddr == 0) {
-	ppp_error("Could not determine local IP address");
+	ppp_error(("Could not determine local IP address"));
 	ipcp_close(f->pcb, "Could not determine local IP address");
 	return;
     }
     if (ho->hisaddr == 0 && !pcb->settings.noremoteip) {
 	ho->hisaddr = lwip_htonl(0x0a404040);
-	ppp_warn("Could not determine remote IP address: defaulting to %I",
-	     ho->hisaddr);
+	ppp_warn(("Could not determine remote IP address: defaulting to %I",
+	     ho->hisaddr));
     }
 #if 0 /* UNUSED */
     script_setenv("IPLOCAL", ip_ntoa(go->ouraddr), 0);
@@ -1955,7 +1955,7 @@
 	    || (pcb->settings.auth_required && wo->hisaddr != ho->hisaddr)
 #endif /* PPP_SERVER && PPP_AUTH_SUPPORT */
 	    ) {
-		ppp_error("Peer is not authorized to use remote address %I", ho->hisaddr);
+		ppp_error(("Peer is not authorized to use remote address %I", ho->hisaddr));
 		ipcp_close(pcb, "Unauthorized remote IP address");
 		return;
 	}
@@ -1963,7 +1963,7 @@
 #if 0 /* Unused */
     /* Upstream checking code */
     if (ho->hisaddr != 0 && !auth_ip_addr(f->unit, ho->hisaddr)) {
-	ppp_error("Peer is not authorized to use remote address %I", ho->hisaddr);
+	ppp_error(("Peer is not authorized to use remote address %I", ho->hisaddr));
 	ipcp_close(f->unit, "Unauthorized remote IP address");
 	return;
     }
@@ -1985,13 +1985,13 @@
 	    ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr,
 				      wo->replace_default_route);
 	    if (go->ouraddr != wo->ouraddr) {
-		ppp_warn("Local IP address changed to %I", go->ouraddr);
+		ppp_warn(("Local IP address changed to %I", go->ouraddr));
 		script_setenv("OLDIPLOCAL", ip_ntoa(wo->ouraddr), 0);
 		wo->ouraddr = go->ouraddr;
 	    } else
 		script_unsetenv("OLDIPLOCAL");
 	    if (ho->hisaddr != wo->hisaddr && wo->hisaddr != 0) {
-		ppp_warn("Remote IP address changed to %I", ho->hisaddr);
+		ppp_warn(("Remote IP address changed to %I", ho->hisaddr));
 		script_setenv("OLDIPREMOTE", ip_ntoa(wo->hisaddr), 0);
 		wo->hisaddr = ho->hisaddr;
 	    } else
@@ -2001,7 +2001,7 @@
 	    mask = get_mask(go->ouraddr);
 	    if (!sifaddr(pcb, go->ouraddr, ho->hisaddr, mask)) {
 #if PPP_DEBUG
-		ppp_warn("Interface configuration failed");
+		ppp_warn(("Interface configuration failed"));
 #endif /* PPP_DEBUG */
 		ipcp_close(f->unit, "Interface configuration failed");
 		return;
@@ -2035,7 +2035,7 @@
 #if !(defined(SVR4) && (defined(SNI) || defined(__USLC__)))
 	if (!sifaddr(pcb, go->ouraddr, ho->hisaddr, mask)) {
 #if PPP_DEBUG
-	    ppp_warn("Interface configuration failed");
+	    ppp_warn(("Interface configuration failed"));
 #endif /* PPP_DEBUG */
 	    ipcp_close(f->pcb, "Interface configuration failed");
 	    return;
@@ -2045,7 +2045,7 @@
 	/* bring the interface up for IP */
 	if (!sifup(pcb)) {
 #if PPP_DEBUG
-	    ppp_warn("Interface failed to come up");
+	    ppp_warn(("Interface failed to come up"));
 #endif /* PPP_DEBUG */
 	    ipcp_close(f->pcb, "Interface configuration failed");
 	    return;
@@ -2054,7 +2054,7 @@
 #if (defined(SVR4) && (defined(SNI) || defined(__USLC__)))
 	if (!sifaddr(pcb, go->ouraddr, ho->hisaddr, mask)) {
 #if PPP_DEBUG
-	    ppp_warn("Interface configuration failed");
+	    ppp_warn(("Interface configuration failed"));
 #endif /* PPP_DEBUG */
 	    ipcp_close(f->unit, "Interface configuration failed");
 	    return;
@@ -2081,14 +2081,14 @@
 
 	wo->ouraddr = go->ouraddr;
 
-	ppp_notice("local  IP address %I", go->ouraddr);
+	ppp_notice(("local  IP address %I", go->ouraddr));
 	if (ho->hisaddr != 0)
-	    ppp_notice("remote IP address %I", ho->hisaddr);
+	    ppp_notice(("remote IP address %I", ho->hisaddr));
 #if LWIP_DNS
 	if (go->dnsaddr[0])
-	    ppp_notice("primary   DNS address %I", go->dnsaddr[0]);
+	    ppp_notice(("primary   DNS address %I", go->dnsaddr[0]));
 	if (go->dnsaddr[1])
-	    ppp_notice("secondary DNS address %I", go->dnsaddr[1]);
+	    ppp_notice(("secondary DNS address %I", go->dnsaddr[1]));
 #endif /* LWIP_DNS */
     }
 
diff --git a/src/netif/ppp/ipv6cp.c b/src/netif/ppp/ipv6cp.c
index 11c18df..2035ef9 100644
--- a/src/netif/ppp/ipv6cp.c
+++ b/src/netif/ppp/ipv6cp.c
@@ -67,7 +67,7 @@
     L'Institut d'Informatique et de Mathématiques Appliquées de Grenoble (IMAG)
     est une fédération d'unités mixtes de recherche du CNRS, de l'Institut National
     Polytechnique de Grenoble et de l'Université Joseph Fourier regroupant
-    sept laboratoires dont le laboratoire Logiciels, Systèmes, Réseaux (LSR).
+    sept laboratoires don't le laboratoire Logiciels, Systèmes, Réseaux (LSR).
 
     This work has been done in the context of GIE DYADE (joint R & D venture
     between BULL S.A. and INRIA).
@@ -913,7 +913,7 @@
     next = inp;
     while (l) {
 	orc = CONFACK;			/* Assume success */
-	cip = p = next;			/* Remember begining of CI */
+	cip = p = next;			/* Remember beginning of CI */
 	if (l < 2 ||			/* Not enough data for CI header or */
 	    p[1] < 2 ||			/*  CI length too small or */
 	    p[1] > l) {			/*  CI length too big? */
@@ -1006,7 +1006,7 @@
 	IPV6CPDEBUG((" (%s)\n", CODENAME(orc)));
 
 	if (orc == CONFACK &&		/* Good CI */
-	    rc != CONFACK)		/*  but prior CI wasnt? */
+	    rc != CONFACK)		/*  but prior CI wasn't? */
 	    continue;			/* Don't send this one */
 
 	if (orc == CONFNAK) {		/* Nak this CI? */
@@ -1134,9 +1134,9 @@
     if (!sifnpmode(u, PPP_IPV6, NPMODE_QUEUE))
 	return 0;
 
-    ppp_notice("ipv6_demand_conf");
-    ppp_notice("local  LL address %s", llv6_ntoa(wo->ourid));
-    ppp_notice("remote LL address %s", llv6_ntoa(wo->hisid));
+    ppp_notice(("ipv6_demand_conf"));
+    ppp_notice(("local  LL address %s", llv6_ntoa(wo->ourid)));
+    ppp_notice(("remote LL address %s", llv6_ntoa(wo->hisid)));
 
     return 1;
 }
@@ -1166,17 +1166,17 @@
     if(!no_ifaceid_neg) {
 #endif /* UNUSED */
 	if (eui64_iszero(ho->hisid)) {
-	    ppp_error("Could not determine remote LL address");
+	    ppp_error(("Could not determine remote LL address"));
 	    ipv6cp_close(f->pcb, "Could not determine remote LL address");
 	    return;
 	}
 	if (eui64_iszero(go->ourid)) {
-	    ppp_error("Could not determine local LL address");
+	    ppp_error(("Could not determine local LL address"));
 	    ipv6cp_close(f->pcb, "Could not determine local LL address");
 	    return;
 	}
 	if (eui64_equals(go->ourid, ho->hisid)) {
-	    ppp_error("local and remote LL addresses are equal");
+	    ppp_error(("local and remote LL addresses are equal"));
 	    ipv6cp_close(f->pcb, "local and remote LL addresses are equal");
 	    return;
 	}
@@ -1244,8 +1244,8 @@
 	sifnpmode(f->pcb, PPP_IPV6, NPMODE_PASS);
 #endif /* DEMAND_SUPPORT */
 
-	ppp_notice("local  LL address %s", llv6_ntoa(go->ourid));
-	ppp_notice("remote LL address %s", llv6_ntoa(ho->hisid));
+	ppp_notice(("local  LL address %s", llv6_ntoa(go->ourid)));
+	ppp_notice(("remote LL address %s", llv6_ntoa(ho->hisid)));
     }
 
     np_up(f->pcb, PPP_IPV6);
diff --git a/src/netif/ppp/lcp.c b/src/netif/ppp/lcp.c
index 90ed183..8b51a8f 100644
--- a/src/netif/ppp/lcp.c
+++ b/src/netif/ppp/lcp.c
@@ -373,7 +373,7 @@
 
     BZERO(wo, sizeof(*wo));
     wo->neg_mru = 1;
-    wo->mru = PPP_DEFMRU;
+    wo->mru = PPP_MRU;
     wo->neg_asyncmap = 1;
     wo->neg_magicnumber = 1;
     wo->neg_pcompression = 1;
@@ -462,11 +462,11 @@
      * but accept A/C and protocol compressed packets
      * if we are going to ask for A/C and protocol compression.
      */
-    if (ppp_send_config(pcb, PPP_MRU, 0xffffffff, 0, 0) < 0
-	|| ppp_recv_config(pcb, PPP_MRU, (pcb->settings.lax_recv? 0: 0xffffffff),
+    if (ppp_send_config(pcb, PPP_DEFMRU, 0xffffffff, 0, 0) < 0
+	|| ppp_recv_config(pcb, PPP_DEFMRU, (pcb->settings.lax_recv? 0: 0xffffffff),
 			   wo->neg_pcompression, wo->neg_accompression) < 0)
 	    return;
-    pcb->peer_mru = PPP_MRU;
+    pcb->peer_mru = PPP_DEFMRU;
 
     if (pcb->settings.listen_time != 0) {
 	f->flags |= DELAYED_UP;
@@ -594,22 +594,22 @@
 	if (protp->protocol == prot) {
 #if PPP_PROTOCOLNAME
 	    if (pname != NULL)
-		ppp_dbglog("Protocol-Reject for '%s' (0x%x) received", pname,
-		       prot);
+		ppp_dbglog(("Protocol-Reject for '%s' (0x%x) received", pname,
+		       prot));
 	    else
 #endif /* PPP_PROTOCOLNAME */
-		ppp_dbglog("Protocol-Reject for 0x%x received", prot);
+		ppp_dbglog(("Protocol-Reject for 0x%x received", prot));
 	    (*protp->protrej)(f->pcb);
 	    return;
 	}
 
 #if PPP_PROTOCOLNAME
     if (pname != NULL)
-	ppp_warn("Protocol-Reject for unsupported protocol '%s' (0x%x)", pname,
-	     prot);
+	ppp_warn(("Protocol-Reject for unsupported protocol '%s' (0x%x)", pname,
+	     prot));
     else
 #endif /* #if PPP_PROTOCOLNAME */
-	ppp_warn("Protocol-Reject for unsupported protocol 0x%x", prot);
+	ppp_warn(("Protocol-Reject for unsupported protocol 0x%x", prot));
 }
 
 
@@ -621,7 +621,7 @@
     /*
      * Can't reject LCP!
      */
-    ppp_error("Received Protocol-Reject for LCP!");
+    ppp_error(("Received Protocol-Reject for LCP!"));
     fsm_protreject(&pcb->lcp_fsm);
 }
 
@@ -757,7 +757,7 @@
 #endif /* HAVE_MULTILINK */
     if (pcb->settings.noendpoint)
 	ao->neg_endpoint = 0;
-    pcb->peer_mru = PPP_MRU;
+    pcb->peer_mru = PPP_DEFMRU;
 #if 0 /* UNUSED */
     auth_reset(pcb);
 #endif /* UNUSED */
@@ -931,7 +931,7 @@
 
     if (ucp - start_ucp != *lenp) {
 	/* this should never happen, because peer_mtu should be 1500 */
-	ppp_error("Bug in lcp_addci: wrong length");
+	ppp_error(("Bug in lcp_addci: wrong length"));
     }
 }
 
@@ -1363,7 +1363,7 @@
 	     * well, that's just strange.  Nobody should do that.
 	     */
 	    if (cishort == PPP_EAP && cilen == CILEN_SHORT && go->neg_eap)
-		ppp_dbglog("Unexpected Conf-Nak for EAP");
+		ppp_dbglog(("Unexpected Conf-Nak for EAP"));
 
 	    /*
 	     * We don't recognize what they're suggesting.
@@ -1498,7 +1498,11 @@
 		goto bad;
 	    break;
 	case CI_AUTHTYPE:
-	    if (0
+		/* This is potentially dead code (#if !PPP_AUTH_SUPPORT)
+		 * Thus the double parantheses to mark the code explicitely
+		 * disabled when building with clang
+		 */
+	    if ((0
 #if CHAP_SUPPORT
                 || go->neg_chap || no.neg_chap
 #endif /* CHAP_SUPPORT */
@@ -1508,7 +1512,7 @@
 #if EAP_SUPPORT
 		|| go->neg_eap || no.neg_eap
 #endif /* EAP_SUPPORT */
-		)
+		))
 		goto bad;
 	    break;
 	case CI_MAGICNUMBER:
@@ -1560,7 +1564,7 @@
     if (f->state != PPP_FSM_OPENED) {
 	if (looped_back) {
 	    if (++try_.numloops >= pcb->settings.lcp_loopbackfail) {
-		ppp_notice("Serial line is looped back.");
+		ppp_notice(("Serial line is looped back."));
 		pcb->err_code = PPPERR_LOOPBACK;
 		lcp_close(f->pcb, "Loopback detected");
 	    }
@@ -1843,7 +1847,7 @@
      * Process all his options.
      */
     next = inp;
-    nakp = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_CTRL_PBUF_MAX_SIZE), PPP_CTRL_PBUF_TYPE);
+    nakp = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_CTRL_PBUF_UNKNOWN_SIZE), PBUF_RAM);
     if(NULL == nakp)
         return 0;
     if(nakp->tot_len != nakp->len) {
@@ -1855,7 +1859,7 @@
     rejp = inp;
     while (l) {
 	orc = CONFACK;			/* Assume success */
-	cip = p = next;			/* Remember begining of CI */
+	cip = p = next;			/* Remember beginning of CI */
 	if (l < 2 ||			/* Not enough data for CI header or */
 	    p[1] < 2 ||			/*  CI length too small or */
 	    p[1] > l) {			/*  CI length too big? */
@@ -1935,7 +1939,7 @@
 		/*
 		 * Reject the option if we're not willing to authenticate.
 		 */
-		ppp_dbglog("No auth is possible");
+		ppp_dbglog(("No auth is possible"));
 		orc = CONFREJ;
 		break;
 	    }
@@ -2232,7 +2236,7 @@
 
 endswitch:
 	if (orc == CONFACK &&		/* Good CI */
-	    rc != CONFACK)		/*  but prior CI wasnt? */
+	    rc != CONFACK)		/*  but prior CI wasn't? */
 	    continue;			/* Don't send this one */
 
 	if (orc == CONFNAK) {		/* Nak this CI? */
@@ -2309,12 +2313,12 @@
      * the interface MTU is set to the lowest of that, the
      * MTU we want to use, and our link MRU.
      */
-    mtu = ho->neg_mru? ho->mru: PPP_MRU;
-    mru = go->neg_mru? LWIP_MAX(wo->mru, go->mru): PPP_MRU;
+    mtu = ho->neg_mru? ho->mru: PPP_DEFMRU;
+    mru = go->neg_mru? LWIP_MAX(wo->mru, go->mru): PPP_DEFMRU;
 #ifdef HAVE_MULTILINK
     if (!(multilink && go->neg_mrru && ho->neg_mrru))
 #endif /* HAVE_MULTILINK */
-	netif_set_mtu(pcb, LWIP_MIN(LWIP_MIN(mtu, mru), ao->mru));
+	ppp_netif_set_mtu(pcb, LWIP_MIN(LWIP_MIN(mtu, mru), ao->mru));
     ppp_send_config(pcb, mtu,
 		    (ho->neg_asyncmap? ho->asyncmap: 0xffffffff),
 		    ho->neg_pcompression, ho->neg_accompression);
@@ -2344,11 +2348,11 @@
 
     link_down(pcb);
 
-    ppp_send_config(pcb, PPP_MRU, 0xffffffff, 0, 0);
-    ppp_recv_config(pcb, PPP_MRU,
+    ppp_send_config(pcb, PPP_DEFMRU, 0xffffffff, 0, 0);
+    ppp_recv_config(pcb, PPP_DEFMRU,
 		    (go->neg_asyncmap? go->asyncmap: 0xffffffff),
 		    go->neg_pcompression, go->neg_accompression);
-    pcb->peer_mru = PPP_MRU;
+    pcb->peer_mru = PPP_DEFMRU;
 }
 
 
@@ -2639,8 +2643,8 @@
 static void LcpLinkFailure(fsm *f) {
     ppp_pcb *pcb = f->pcb;
     if (f->state == PPP_FSM_OPENED) {
-	ppp_info("No response to %d echo-requests", pcb->lcp_echos_pending);
-        ppp_notice("Serial link appears to be disconnected.");
+	ppp_info(("No response to %d echo-requests", pcb->lcp_echos_pending));
+        ppp_notice(("Serial link appears to be disconnected."));
 	pcb->err_code = PPPERR_PEERDEAD;
 	lcp_close(pcb, "Peer not responding");
     }
@@ -2661,7 +2665,7 @@
      * Start the timer for the next interval.
      */
     if (pcb->lcp_echo_timer_running)
-	ppp_warn("assertion lcp_echo_timer_running==0 failed");
+	ppp_warn(("assertion lcp_echo_timer_running==0 failed"));
     TIMEOUT (LcpEchoTimeout, f, pcb->settings.lcp_echo_interval);
     pcb->lcp_echo_timer_running = 1;
 }
@@ -2691,13 +2695,13 @@
 
     /* Check the magic number - don't count replies from ourselves. */
     if (len < 4) {
-	ppp_dbglog("lcp: received short Echo-Reply, length %d", len);
+	ppp_dbglog(("lcp: received short Echo-Reply, length %d", len));
 	return;
     }
     GETLONG(magic_val, inp);
     if (go->neg_magicnumber
 	&& magic_val == go->magicnumber) {
-	ppp_warn("appear to have received our own echo-reply!");
+	ppp_warn(("appear to have received our own echo-reply!"));
 	return;
     }
 
diff --git a/src/netif/ppp/magic.c b/src/netif/ppp/magic.c
index d0d87c5..ce21326 100644
--- a/src/netif/ppp/magic.c
+++ b/src/netif/ppp/magic.c
@@ -114,12 +114,12 @@
       u32_t rand;
 #endif /* LWIP_RAND */
     } sys_data;
+    /* Load sys_data fields here. */
     magic_randomseed += sys_jiffies();
     sys_data.jiffies = magic_randomseed;
 #ifdef LWIP_RAND
     sys_data.rand = LWIP_RAND();
 #endif /* LWIP_RAND */
-    /* Load sys_data fields here. */
     lwip_md5_update(&md5_ctx, (u_char *)&sys_data, sizeof(sys_data));
   }
   lwip_md5_finish(&md5_ctx, (u_char *)magic_randpool);
@@ -142,7 +142,7 @@
 }
 
 /*
- * magic_random_bytes - Fill a buffer with random bytes.
+ * Fill a buffer with random bytes.
  *
  * Use the random pool to generate random data.  This degrades to pseudo
  *  random when used faster than randomness is supplied using magic_churnrand().
@@ -180,58 +180,47 @@
 }
 
 /*
- * Return a new random number.
+ * Return a new 32-bit random number.
  */
 u32_t magic(void) {
   u32_t new_rand;
 
   magic_random_bytes((unsigned char *)&new_rand, sizeof(new_rand));
-
   return new_rand;
 }
 
 #else /* PPP_MD5_RANDM */
 
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
 #ifndef LWIP_RAND
-static int  magic_randomized;       /* Set when truely randomized. */
+static int  magic_randomized;       /* Set when truly randomized. */
 #endif /* LWIP_RAND */
 static u32_t magic_randomseed;      /* Seed used for random number generation. */
 
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-
 /*
  * Initialize the random number generator.
  *
  * Here we attempt to compute a random number seed but even if
  * it isn't random, we'll randomize it later.
  *
- * The current method uses the fields from the real time clock,
- * the idle process counter, the millisecond counter, and the
- * hardware timer tick counter.  When this is invoked
- * in startup(), then the idle counter and timer values may
- * repeat after each boot and the real time clock may not be
- * operational.  Thus we call it again on the first random
- * event.
+ * The current method uses the jiffies counter.  When this is
+ * invoked at startup the jiffies counter value may repeat
+ * after each boot.  Thus we call it again on the first
+ * random event.
+ *
+ * If LWIP_RAND if available, we do not call srand() as we are
+ * not going to call rand().
  */
 void magic_init(void) {
   magic_randomseed += sys_jiffies();
 #ifndef LWIP_RAND
-  /* Initialize the Borland random number generator. */
+  /* Initialize the random number generator. */
   srand((unsigned)magic_randomseed);
 #endif /* LWIP_RAND */
 }
 
 /*
- * magic_init - Initialize the magic number generator.
- *
  * Randomize our random seed value.  Here we use the fact that
- * this function is called at *truely random* times by the polling
+ * this function is called at *truly random* times by the polling
  * and network functions.  Here we only get 16 bits of new random
  * value but we use the previous value to randomize the other 16
  * bits.
@@ -242,34 +231,37 @@
     magic_randomized = !0;
     magic_init();
     /* The initialization function also updates the seed. */
-  } else {
-#endif /* LWIP_RAND */
-    magic_randomseed += sys_jiffies();
-#ifndef LWIP_RAND
+    return;
   }
 #endif /* LWIP_RAND */
+  magic_randomseed += sys_jiffies();
 }
 
 /*
- * Return a new random number.
+ * Return a new 32-bit random number.
  *
- * Here we use the Borland rand() function to supply a pseudo random
- * number which we make truely random by combining it with our own
- * seed which is randomized by truely random events.
- * Thus the numbers will be truely random unless there have been no
+ * Here we use the rand() function to supply a pseudo random
+ * number which we make truly random by combining it with our own
+ * seed which is randomized by truly random events.
+ * Thus the numbers will be truly random unless there have been no
  * operator or network events in which case it will be pseudo random
- * seeded by the real time clock.
+ * seeded by srand().
+ *
+ * Alternatively, use LWIP_RAND if available, but we do not assume
+ * it is returning 32 bits of random data because it is probably
+ * going to be defined to directly return the rand() value. For
+ * example, LCP magic numbers are 32-bit random values.
  */
 u32_t magic(void) {
 #ifdef LWIP_RAND
-  return LWIP_RAND() + magic_randomseed;
+  return (LWIP_RAND() << 16) + LWIP_RAND() + magic_randomseed;
 #else /* LWIP_RAND */
   return ((u32_t)rand() << 16) + (u32_t)rand() + magic_randomseed;
 #endif /* LWIP_RAND */
 }
 
 /*
- * magic_random_bytes - Fill a buffer with random bytes.
+ * Fill a buffer with random bytes.
  */
 void magic_random_bytes(unsigned char *buf, u32_t buf_len) {
   u32_t new_rand, n;
diff --git a/src/netif/ppp/multilink.c b/src/netif/ppp/multilink.c
index 62014e8..795d6b5 100644
--- a/src/netif/ppp/multilink.c
+++ b/src/netif/ppp/multilink.c
@@ -142,18 +142,18 @@
 		/* not doing multilink */
 		if (go->neg_mrru)
 			notice("oops, multilink negotiated only for receive");
-		mtu = ho->neg_mru? ho->mru: PPP_MRU;
+		mtu = ho->neg_mru? ho->mru: PPP_DEFMRU;
 		if (mtu > ao->mru)
 			mtu = ao->mru;
 		if (demand) {
 			/* already have a bundle */
 			cfg_bundle(0, 0, 0, 0);
-			netif_set_mtu(pcb, mtu);
+			ppp_netif_set_mtu(pcb, mtu);
 			return 0;
 		}
 		make_new_bundle(0, 0, 0, 0);
 		set_ifunit(1);
-		netif_set_mtu(pcb, mtu);
+		ppp_netif_set_mtu(pcb, mtu);
 		return 0;
 	}
 
@@ -198,7 +198,7 @@
 	mtu = LWIP_MIN(ho->mrru, ao->mru);
 	if (demand) {
 		cfg_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
-		netif_set_mtu(pcb, mtu);
+		ppp_netif_set_mtu(pcb, mtu);
 		script_setenv("BUNDLE", bundle_id + 7, 1);
 		return 0;
 	}
@@ -245,7 +245,7 @@
 	/* we have to make a new bundle */
 	make_new_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
 	set_ifunit(1);
-	netif_set_mtu(pcb, mtu);
+	ppp_netif_set_mtu(pcb, mtu);
 	script_setenv("BUNDLE", bundle_id + 7, 1);
 	make_bundle_links(pcb);
 	unlock_db();
diff --git a/src/netif/ppp/ppp.c b/src/netif/ppp/ppp.c
index be58553..1cd5958 100644
--- a/src/netif/ppp/ppp.c
+++ b/src/netif/ppp/ppp.c
@@ -255,6 +255,7 @@
 
 #if PPP_NOTIFY_PHASE
 void ppp_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb) {
+  LWIP_ASSERT_CORE_LOCKED();
   pcb->notify_phase_cb = notify_phase_cb;
   notify_phase_cb(pcb, pcb->phase, pcb->ctx_cb);
 }
@@ -476,7 +477,6 @@
 #if PPP_IPV6_SUPPORT
   netif->output_ip6 = ppp_netif_output_ip6;
 #endif /* PPP_IPV6_SUPPORT */
-  netif->flags = NETIF_FLAG_UP;
 #if LWIP_NETIF_HOSTNAME
   /* @todo: Initialize interface hostname */
   /* netif_set_hostname(netif, "lwip"); */
@@ -674,9 +674,9 @@
 #endif /* PAP_SUPPORT */
 
 #if CHAP_SUPPORT
+#if PPP_SERVER
   pcb->settings.chap_timeout_time = CHAP_DEFTIMEOUT;
   pcb->settings.chap_max_transmits = CHAP_DEFTRANSMITS;
-#if PPP_SERVER
   pcb->settings.chap_rechallenge_time = CHAP_DEFRECHALLENGETIME;
 #endif /* PPP_SERVER */
 #endif /* CHAP_SUPPPORT */
@@ -710,6 +710,9 @@
     PPPDEBUG(LOG_ERR, ("ppp_new: netif_add failed\n"));
     return NULL;
   }
+  /* FIXME: user application should be responsible to call netif_set_up(),
+   * remove it for next release with allowed behavior break */
+  netif_set_up(pcb->netif);
 
   pcb->link_cb = callbacks;
   pcb->link_ctx_cb = link_ctx_cb;
@@ -776,8 +779,10 @@
 void ppp_input(ppp_pcb *pcb, struct pbuf *pb) {
   u16_t protocol;
 #if PPP_DEBUG && PPP_PROTOCOLNAME
-    const char *pname;
+  const char *pname;
 #endif /* PPP_DEBUG && PPP_PROTOCOLNAME */
+  LWIP_ASSERT("pcb->phase >= PPP_PHASE_ESTABLISH && pcb->phase <= PPP_PHASE_TERMINATE",
+    pcb->phase >= PPP_PHASE_ESTABLISH && pcb->phase <= PPP_PHASE_TERMINATE);
 
   magic_randomize();
 
@@ -801,7 +806,7 @@
    * Toss all non-LCP packets unless LCP is OPEN.
    */
   if (protocol != PPP_LCP && pcb->lcp_fsm.state != PPP_FSM_OPENED) {
-    ppp_dbglog("Discarded non-LCP packet when LCP not open");
+    ppp_dbglog(("Discarded non-LCP packet when LCP not open"));
     goto drop;
   }
 
@@ -824,7 +829,7 @@
    || protocol == PPP_EAP
 #endif /* EAP_SUPPORT */
    )) {
-    ppp_dbglog("discarding proto 0x%x in phase %d", protocol, pcb->phase);
+    ppp_dbglog(("discarding proto 0x%x in phase %d", protocol, pcb->phase));
     goto drop;
   }
 
@@ -875,7 +880,7 @@
   }
 #endif /* CCP_SUPPORT */
 
-  switch(protocol) {
+  switch (protocol) {
 
 #if PPP_IPV4_SUPPORT
     case PPP_IP:            /* Internet Protocol */
@@ -931,6 +936,10 @@
       for (i = 0; (protp = protocols[i]) != NULL; ++i) {
         if (protp->protocol == protocol) {
           pb = pbuf_coalesce(pb, PBUF_RAW);
+          if (pb->next != NULL) {
+            PPPDEBUG(LOG_WARNING, ("ppp_input[%d]: Dropping (pbuf_coalesce failed), len=%d\n", pcb->netif->num, pb->tot_len));
+            goto drop;
+          }
           (*protp->input)(pcb, (u8_t*)pb->payload, pb->len);
           goto out;
         }
@@ -959,18 +968,19 @@
 #if PPP_PROTOCOLNAME
       pname = protocol_name(protocol);
       if (pname != NULL) {
-        ppp_warn("Unsupported protocol '%s' (0x%x) received", pname, protocol);
+        ppp_warn(("Unsupported protocol '%s' (0x%x) received", pname, protocol));
       } else
 #endif /* PPP_PROTOCOLNAME */
-        ppp_warn("Unsupported protocol 0x%x received", protocol);
+        ppp_warn(("Unsupported protocol 0x%x received", protocol));
 #endif /* PPP_DEBUG */
-        if (pbuf_add_header(pb, sizeof(protocol))) {
-          PPPDEBUG(LOG_WARNING, ("ppp_input[%d]: Dropping (pbuf_add_header failed)\n", pcb->netif->num));
-          goto drop;
-        }
-        lcp_sprotrej(pcb, (u8_t*)pb->payload, pb->len);
+
+      if (pbuf_add_header(pb, sizeof(protocol))) {
+        PPPDEBUG(LOG_WARNING, ("ppp_input[%d]: Dropping (pbuf_add_header failed)\n", pcb->netif->num));
+        goto drop;
       }
-      break;
+      lcp_sprotrej(pcb, (u8_t*)pb->payload, pb->len);
+    }
+    break;
   }
 
 drop:
@@ -1027,13 +1037,13 @@
  */
 int ppp_send_config(ppp_pcb *pcb, int mtu, u32_t accm, int pcomp, int accomp) {
   LWIP_UNUSED_ARG(mtu);
-  /* pcb->mtu = mtu; -- set correctly with netif_set_mtu */
+
+  PPPDEBUG(LOG_INFO, ("ppp_send_config[%d]\n", pcb->netif->num));
 
   if (pcb->link_cb->send_config) {
     pcb->link_cb->send_config(pcb, pcb->link_ctx_cb, accm, pcomp, accomp);
   }
 
-  PPPDEBUG(LOG_INFO, ("ppp_send_config[%d]\n", pcb->netif->num) );
   return 0;
 }
 
@@ -1044,11 +1054,12 @@
 int ppp_recv_config(ppp_pcb *pcb, int mru, u32_t accm, int pcomp, int accomp) {
   LWIP_UNUSED_ARG(mru);
 
+  PPPDEBUG(LOG_INFO, ("ppp_recv_config[%d]\n", pcb->netif->num));
+
   if (pcb->link_cb->recv_config) {
     pcb->link_cb->recv_config(pcb, pcb->link_ctx_cb, accm, pcomp, accomp);
   }
 
-  PPPDEBUG(LOG_INFO, ("ppp_recv_config[%d]\n", pcb->netif->num));
   return 0;
 }
 
@@ -1129,12 +1140,12 @@
 
   nsa = dns_getserver(0);
   ip_addr_set_ip4_u32_val(nsb, ns1);
-  if (ip_addr_cmp(nsa, &nsb)) {
+  if (ip_addr_eq(nsa, &nsb)) {
     dns_setserver(0, IP_ADDR_ANY);
   }
   nsa = dns_getserver(1);
   ip_addr_set_ip4_u32_val(nsb, ns2);
-  if (ip_addr_cmp(nsa, &nsb)) {
+  if (ip_addr_eq(nsa, &nsb)) {
     dns_setserver(1, IP_ADDR_ANY);
   }
   return 1;
@@ -1313,18 +1324,21 @@
 #endif /* DEMAND_SUPPORT */
 
 /*
- * netif_set_mtu - set the MTU on the PPP network interface.
+ * ppp_netif_set_mtu - set the MTU on the PPP network interface.
  */
-void netif_set_mtu(ppp_pcb *pcb, int mtu) {
+void ppp_netif_set_mtu(ppp_pcb *pcb, int mtu) {
 
   pcb->netif->mtu = mtu;
-  PPPDEBUG(LOG_INFO, ("netif_set_mtu[%d]: mtu=%d\n", pcb->netif->num, mtu));
+#if PPP_IPV6_SUPPORT && LWIP_ND6_ALLOW_RA_UPDATES
+  pcb->netif->mtu6 = mtu;
+#endif /* PPP_IPV6_SUPPORT && LWIP_ND6_ALLOW_RA_UPDATES */
+  PPPDEBUG(LOG_INFO, ("ppp_netif_set_mtu[%d]: mtu=%d\n", pcb->netif->num, mtu));
 }
 
 /*
- * netif_get_mtu - get PPP interface MTU
+ * ppp_netif_get_mtu - get PPP interface MTU
  */
-int netif_get_mtu(ppp_pcb *pcb) {
+int ppp_netif_get_mtu(ppp_pcb *pcb) {
 
   return pcb->netif->mtu;
 }
diff --git a/src/netif/ppp/pppoe.c b/src/netif/ppp/pppoe.c
index 971b36b..9e4f346 100644
--- a/src/netif/ppp/pppoe.c
+++ b/src/netif/ppp/pppoe.c
@@ -132,7 +132,7 @@
 /* internal timeout handling */
 static void pppoe_timeout(void *);
 
-/* sending actual protocol controll packets */
+/* sending actual protocol control packets */
 static err_t pppoe_send_padi(struct pppoe_softc *);
 static err_t pppoe_send_padr(struct pppoe_softc *);
 #ifdef PPPOE_SERVER
@@ -175,12 +175,29 @@
 {
   ppp_pcb *ppp;
   struct pppoe_softc *sc;
-#if !PPPOE_SCNAME_SUPPORT
+#if PPPOE_SCNAME_SUPPORT
+  size_t l;
+#else /* PPPOE_SCNAME_SUPPORT */
   LWIP_UNUSED_ARG(service_name);
   LWIP_UNUSED_ARG(concentrator_name);
-#endif /* !PPPOE_SCNAME_SUPPORT */
+#endif /* PPPOE_SCNAME_SUPPORT */
   LWIP_ASSERT_CORE_LOCKED();
 
+#if PPPOE_SCNAME_SUPPORT
+  /*
+   * Check that service_name and concentrator_name strings length will
+   * not trigger integer overflows when computing packets length.
+   */
+  l = strlen(service_name);
+  if (l > 1024) {
+    return NULL;
+  }
+  l = strlen(concentrator_name);
+  if (l > 1024) {
+    return NULL;
+  }
+#endif /* PPPOE_SCNAME_SUPPORT */
+
   sc = (struct pppoe_softc *)LWIP_MEMPOOL_ALLOC(PPPOE_IF);
   if (sc == NULL) {
     return NULL;
@@ -393,6 +410,10 @@
   }
 
   pb = pbuf_coalesce(pb, PBUF_RAW);
+  if (pb->next != NULL) {
+    PPPDEBUG(LOG_DEBUG, ("pppoe: pbuf_coalesce failed: %d\n", pb->tot_len));
+    goto done;
+  }
 
   ethhdr = (struct eth_hdr *)pb->payload;
 
@@ -753,20 +774,20 @@
 {
   struct pbuf *pb;
   u8_t *p;
-  int len;
+  size_t len;
 #if PPPOE_SCNAME_SUPPORT
-  int l1 = 0, l2 = 0; /* XXX: gcc */
+  size_t l1 = 0, l2 = 0; /* XXX: gcc */
 #endif /* PPPOE_SCNAME_SUPPORT */
 
   /* calculate length of frame (excluding ethernet header + pppoe header) */
   len = 2 + 2 + 2 + 2 + sizeof sc;  /* service name tag is required, host unique is send too */
 #if PPPOE_SCNAME_SUPPORT
   if (sc->sc_service_name != NULL) {
-    l1 = (int)strlen(sc->sc_service_name);
+    l1 = strlen(sc->sc_service_name);
     len += l1;
   }
   if (sc->sc_concentrator_name != NULL) {
-    l2 = (int)strlen(sc->sc_concentrator_name);
+    l2 = strlen(sc->sc_concentrator_name);
     len += 2 + 2 + l2;
   }
 #endif /* PPPOE_SCNAME_SUPPORT */
@@ -848,7 +869,6 @@
       /* initialize for quick retry mode */
       retry_wait = LWIP_MIN(PPPOE_DISC_TIMEOUT * sc->sc_padi_retried, PPPOE_SLOW_RETRY);
       if ((err = pppoe_send_padi(sc)) != 0) {
-        sc->sc_padi_retried--;
         PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to transmit PADI, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));
         LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
@@ -869,7 +889,6 @@
         return;
       }
       if ((err = pppoe_send_padr(sc)) != 0) {
-        sc->sc_padr_retried--;
         PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADR, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));
         LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
diff --git a/src/netif/ppp/pppol2tp.c b/src/netif/ppp/pppol2tp.c
index 4c4557f..2a9a9b1 100644
--- a/src/netif/ppp/pppol2tp.c
+++ b/src/netif/ppp/pppol2tp.c
@@ -172,6 +172,9 @@
   LWIP_UNUSED_ARG(ppp);
 #endif /* MIB2_STATS */
 
+  /* skip address & flags */
+  pbuf_remove_header(p, 2);
+
   ph = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(PPPOL2TP_OUTPUT_DATA_HEADER_LEN), PBUF_RAM);
   if(!ph) {
     LINK_STATS_INC(link.memerr);
@@ -353,7 +356,7 @@
     goto free_and_return;
   }
 
-  if (!ip_addr_cmp(&l2tp->remote_ip, addr)) {
+  if (!ip_addr_eq(&l2tp->remote_ip, addr)) {
     goto free_and_return;
   }
 
@@ -440,7 +443,7 @@
 
   /* printf("LEN=%d, TUNNEL_ID=%d, SESSION_ID=%d, NS=%d, NR=%d, OFFSET=%d\n", len, tunnel_id, session_id, ns, nr, offset); */
   PPPDEBUG(LOG_DEBUG, ("pppol2tp: input packet, len=%"U16_F", tunnel=%"U16_F", session=%"U16_F", ns=%"U16_F", nr=%"U16_F"\n",
-    len, tunnel_id, session_id, ns, nr));
+    p->tot_len, tunnel_id, session_id, ns, nr));
 
   /* Control packet */
   if (hflags & PPPOL2TP_HEADERFLAG_CONTROL) {
@@ -463,8 +466,16 @@
   /*
    * skip address & flags if necessary
    *
-   * RFC 2661 does not specify whether the PPP frame in the L2TP payload should
-   * have a HDLC header or not. We handle both cases for compatibility.
+   * RFC 2661 (L2TPv2) does not specify whether the PPP frame in the L2TP payload
+   * should have a HDLC header or not, both behaviors are seen in the wild.
+   *
+   * On the other hand, L2TPv3 draft-ietf-l2tpext-l2tp-ppp versions 00 and 01 say
+   * it must be included, versions 02 to 05 say it must be omitted, and versions
+   * 06 and onwards say it should be omitted so it changed along the path when
+   * L2TPv3 was designed.  Latest versions state that receivers must handle both
+   * cases.
+   *
+   * We handle both cases for compatibility.
    */
   if (p->len >= 2) {
     GETSHORT(hflags, inp);
@@ -530,6 +541,11 @@
   l2tp->peer_ns = ns+1;
 
   p = pbuf_coalesce(p, PBUF_RAW);
+  if (p->next != NULL) {
+    PPPDEBUG(LOG_DEBUG, ("pppol2tp: pbuf_coalesce failed: %d\n", p->tot_len));
+    return;
+  }
+
   inp = (u8_t*)p->payload;
   /* Decode AVPs */
   while (p->len > 0) {
@@ -749,7 +765,6 @@
       retry_wait = LWIP_MIN(PPPOL2TP_CONTROL_TIMEOUT * l2tp->sccrq_retried, PPPOL2TP_SLOW_RETRY);
       PPPDEBUG(LOG_DEBUG, ("pppol2tp: sccrq_retried=%d\n", l2tp->sccrq_retried));
       if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {
-        l2tp->sccrq_retried--;
         PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCRQ, error=%d\n", err));
         LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
@@ -765,7 +780,6 @@
       PPPDEBUG(LOG_DEBUG, ("pppol2tp: icrq_retried=%d\n", l2tp->icrq_retried));
       if ((s16_t)(l2tp->peer_nr - l2tp->our_ns) < 0) { /* the SCCCN was not acknowledged */
         if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns -1)) != 0) {
-          l2tp->icrq_retried--;
           PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCCN, error=%d\n", err));
           LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
           sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
@@ -773,7 +787,6 @@
         }
       }
       if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
-        l2tp->icrq_retried--;
         PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICRQ, error=%d\n", err));
         LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
@@ -788,7 +801,6 @@
       }
       PPPDEBUG(LOG_DEBUG, ("pppol2tp: iccn_retried=%d\n", l2tp->iccn_retried));
       if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
-        l2tp->iccn_retried--;
         PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err));
         LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */
       }
diff --git a/src/netif/ppp/pppos.c b/src/netif/ppp/pppos.c
index dff0255..8847536 100644
--- a/src/netif/ppp/pppos.c
+++ b/src/netif/ppp/pppos.c
@@ -207,10 +207,9 @@
   err_t err;
   LWIP_UNUSED_ARG(ppp);
 
-  /* Grab an output buffer. Using PBUF_POOL here for tx is ok since the pbuf
-     gets freed by 'pppos_output_last' before this function returns and thus
-     cannot starve rx. */
-  nb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
+  /* Grab an output buffer. Assume PBUF_POOL_BUFSIZE is an acceptable
+   * chunk size for Tx as well. */
+  nb = pbuf_alloc(PBUF_RAW, PBUF_POOL_BUFSIZE, PBUF_RAM);
   if (nb == NULL) {
     PPPDEBUG(LOG_WARNING, ("pppos_write[%d]: alloc fail\n", ppp->netif->num));
     LINK_STATS_INC(link.memerr);
@@ -220,6 +219,8 @@
     return ERR_MEM;
   }
 
+  /* Empty the buffer */
+  nb->len = 0;
   /* Set nb->tot_len to actual payload length */
   nb->tot_len = p->len;
 
@@ -258,10 +259,9 @@
   err_t err;
   LWIP_UNUSED_ARG(ppp);
 
-  /* Grab an output buffer. Using PBUF_POOL here for tx is ok since the pbuf
-     gets freed by 'pppos_output_last' before this function returns and thus
-     cannot starve rx. */
-  nb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
+  /* Grab an output buffer. Assume PBUF_POOL_BUFSIZE is an acceptable
+   * chunk size for Tx as well. */
+  nb = pbuf_alloc(PBUF_RAW, PBUF_POOL_BUFSIZE, PBUF_RAM);
   if (nb == NULL) {
     PPPDEBUG(LOG_WARNING, ("pppos_netif_output[%d]: alloc fail\n", ppp->netif->num));
     LINK_STATS_INC(link.memerr);
@@ -270,6 +270,8 @@
     return ERR_MEM;
   }
 
+  /* Empty the buffer */
+  nb->len = 0;
   /* Set nb->tot_len to actual payload length */
   nb->tot_len = pb->tot_len;
 
@@ -420,7 +422,7 @@
  * @param l length of received data
  */
 err_t
-pppos_input_tcpip(ppp_pcb *ppp, u8_t *s, int l)
+pppos_input_tcpip(ppp_pcb *ppp, const void *s, int l)
 {
   struct pbuf *p;
   err_t err;
@@ -445,7 +447,7 @@
   LWIP_ASSERT_CORE_LOCKED();
 
   for (n = p; n; n = n->next) {
-    pppos_input(ppp, (u8_t*)n->payload, n->len);
+    pppos_input(ppp, n->payload, n->len);
   }
   pbuf_free(p);
   return ERR_OK;
@@ -475,10 +477,11 @@
  * @param l length of received data
  */
 void
-pppos_input(ppp_pcb *ppp, u8_t *s, int l)
+pppos_input(ppp_pcb *ppp, const void *s, int l)
 {
   pppos_pcb *pppos = (pppos_pcb *)ppp->link_ctx_cb;
   struct pbuf *next_pbuf;
+  const u8_t *s_u8 = (const u8_t *)s;
   u8_t cur_char;
   u8_t escaped;
   PPPOS_DECL_PROTECT(lev);
@@ -486,22 +489,24 @@
   LWIP_ASSERT_CORE_LOCKED();
 #endif
 
+  /* Don't even bother parsing data if we are disconnected.
+   * Added to that, ppp_input must never be called if the upper layer is down.
+   */
+  PPPOS_PROTECT(lev);
+  if (!pppos->open) {
+    PPPOS_UNPROTECT(lev);
+    return;
+  }
+  PPPOS_UNPROTECT(lev);
+
   PPPDEBUG(LOG_DEBUG, ("pppos_input[%d]: got %d bytes\n", ppp->netif->num, l));
   while (l-- > 0) {
-    cur_char = *s++;
+    cur_char = *s_u8++;
 
     PPPOS_PROTECT(lev);
-    /* ppp_input can disconnect the interface, we need to abort to prevent a memory
-     * leak if there are remaining bytes because pppos_connect and pppos_listen
-     * functions expect input buffer to be free. Furthermore there are no real
-     * reason to continue reading bytes if we are disconnected.
-     */
-    if (!pppos->open) {
-      PPPOS_UNPROTECT(lev);
-      return;
-    }
     escaped = ESCAPE_P(pppos->in_accm, cur_char);
     PPPOS_UNPROTECT(lev);
+
     /* Handle special characters. */
     if (escaped) {
       /* Check for escape sequences. */
@@ -531,6 +536,12 @@
           /* Note: If you get lots of these, check for UART frame errors or try different baud rate */
           LINK_STATS_INC(link.chkerr);
           pppos_input_drop(pppos);
+        } else if (!pppos->in_tail) {
+          PPPDEBUG(LOG_INFO,
+                   ("pppos_input[%d]: Dropping null in_tail\n",
+                    ppp->netif->num));
+          LINK_STATS_INC(link.drop);
+          pppos_input_drop(pppos);
         /* Otherwise it's a good packet so pass it on. */
         } else {
           struct pbuf *inp;
@@ -558,7 +569,16 @@
           pppos->in_tail = NULL;
 #if IP_FORWARD || LWIP_IPV6_FORWARD
           /* hide the room for Ethernet forwarding header */
-          pbuf_remove_header(inp, PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN);
+          if (0
+#if PPP_IPV4_SUPPORT
+           || pppos->in_protocol == PPP_IP
+#endif /* PPP_IPV4_SUPPORT */
+#if PPP_IPV6_SUPPORT
+           || pppos->in_protocol == PPP_IPV6
+#endif /* PPP_IPV6_SUPPORT */
+           ) {
+            pbuf_remove_header(inp, PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN);
+          }
 #endif /* IP_FORWARD || LWIP_IPV6_FORWARD */
 #if PPP_INPROC_IRQ_SAFE
           if(tcpip_try_callback(pppos_input_callback, inp) != ERR_OK) {
@@ -569,6 +589,14 @@
           }
 #else /* PPP_INPROC_IRQ_SAFE */
           ppp_input(ppp, inp);
+          /* ppp_input can disconnect the interface, we need to abort to prevent a memory
+           * leak if there are remaining bytes because pppos_connect and pppos_listen
+           * functions expect input buffer to be free. Furthermore there are no real
+           * reason to continue reading bytes if we are disconnected.
+           */
+          if (!pppos->open) {
+            break;
+          }
 #endif /* PPP_INPROC_IRQ_SAFE */
         }
 
@@ -591,50 +619,24 @@
       }
 
       /* Process character relative to current state. */
-      switch(pppos->in_state) {
-        case PDIDLE:                    /* Idle state - waiting. */
-          /* Drop the character if it's not 0xff
-           * we would have processed a flag character above. */
-          if (cur_char != PPP_ALLSTATIONS) {
-            break;
-          }
-          /* no break */
-          /* Fall through */
-
-        case PDSTART:                   /* Process start flag. */
-          /* Prepare for a new packet. */
-          pppos->in_fcs = PPP_INITFCS;
-          /* no break */
-          /* Fall through */
-
+      switch (pppos->in_state) {
+        case PDIDLE:                    /* Idle state - wait for flag character. */
+          break;
         case PDADDRESS:                 /* Process address field. */
           if (cur_char == PPP_ALLSTATIONS) {
             pppos->in_state = PDCONTROL;
             break;
           }
-          /* no break */
-
           /* Else assume compressed address and control fields so
            * fall through to get the protocol... */
           /* Fall through */
         case PDCONTROL:                 /* Process control field. */
-          /* If we don't get a valid control code, restart. */
           if (cur_char == PPP_UI) {
             pppos->in_state = PDPROTOCOL1;
             break;
           }
-          /* no break */
-
-#if 0
-          else {
-            PPPDEBUG(LOG_WARNING,
-                     ("pppos_input[%d]: Invalid control <%d>\n", ppp->netif->num, cur_char));
-            pppos->in_state = PDSTART;
-          }
-#endif
           /* Fall through */
-
-      case PDPROTOCOL1:               /* Process protocol field 1. */
+        case PDPROTOCOL1:               /* Process protocol field 1. */
           /* If the lower bit is set, this is the end of the protocol
            * field. */
           if (cur_char & 1) {
@@ -654,12 +656,37 @@
           if (pppos->in_tail == NULL || pppos->in_tail->len == PBUF_POOL_BUFSIZE) {
             u16_t pbuf_alloc_len;
             if (pppos->in_tail != NULL) {
+              u16_t mru;
               pppos->in_tail->tot_len = pppos->in_tail->len;
               if (pppos->in_tail != pppos->in_head) {
                 pbuf_cat(pppos->in_head, pppos->in_tail);
                 /* give up the in_tail reference now */
                 pppos->in_tail = NULL;
               }
+              /* Compute MRU including headers length.  If smaller packets are
+               * requested, we must still be able to receive packets of the
+               * default MRU for control packets. */
+              mru = LWIP_MAX(PPP_MRU, PPP_DEFMRU)
+                /* Add 10% more. We only want to avoid filling all PBUFs with garbage,
+                 * we don't have to be pedantic. */
+                + LWIP_MAX(PPP_MRU, PPP_DEFMRU)/10
+#if IP_FORWARD || LWIP_IPV6_FORWARD
+                + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN
+#endif /* IP_FORWARD || LWIP_IPV6_FORWARD */
+#if PPP_INPROC_IRQ_SAFE
+                + sizeof(struct pppos_input_header)
+#endif /* PPP_INPROC_IRQ_SAFE */
+                + sizeof(pppos->in_protocol);
+              if (pppos->in_head->tot_len > mru) {
+                /* Packet too big. Drop the input packet and let the
+                 * higher layers deal with it.  Continue processing
+                 * received characters in case a new packet starts. */
+                PPPDEBUG(LOG_ERR, ("pppos_input[%d]: packet too big, max_len=%d, dropping packet\n", ppp->netif->num, mru));
+                LINK_STATS_INC(link.lenerr);
+                pppos_input_drop(pppos);
+                pppos->in_state = PDIDLE;  /* Wait for flag character. */
+                break;
+              }
             }
             /* If we haven't started a packet, we need a packet header. */
             pbuf_alloc_len = 0;
@@ -668,7 +695,14 @@
              * + PBUF_LINK_HLEN bytes so the packet is being allocated with enough header
              * space to be forwarded (to Ethernet for example).
              */
-            if (pppos->in_head == NULL) {
+            if (pppos->in_head == NULL && (0
+#if PPP_IPV4_SUPPORT
+             || pppos->in_protocol == PPP_IP
+#endif /* PPP_IPV4_SUPPORT */
+#if PPP_IPV6_SUPPORT
+             || pppos->in_protocol == PPP_IPV6
+#endif /* PPP_IPV6_SUPPORT */
+             )) {
               pbuf_alloc_len = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN;
             }
 #endif /* IP_FORWARD || LWIP_IPV6_FORWARD */
@@ -676,11 +710,11 @@
             if (next_pbuf == NULL) {
               /* No free buffers.  Drop the input packet and let the
                * higher layers deal with it.  Continue processing
-               * the received pbuf chain in case a new packet starts. */
+               * received characters in case a new packet starts. */
               PPPDEBUG(LOG_ERR, ("pppos_input[%d]: NO FREE PBUFS!\n", ppp->netif->num));
               LINK_STATS_INC(link.memerr);
               pppos_input_drop(pppos);
-              pppos->in_state = PDSTART;  /* Wait for flag sequence. */
+              pppos->in_state = PDIDLE;  /* Wait for flag character. */
               break;
             }
             if (pppos->in_head == NULL) {
@@ -716,10 +750,21 @@
 static void pppos_input_callback(void *arg) {
   struct pbuf *pb = (struct pbuf*)arg;
   ppp_pcb *ppp;
+  pppos_pcb *pppos;
 
   ppp = ((struct pppos_input_header*)pb->payload)->ppp;
   if(pbuf_remove_header(pb, sizeof(struct pppos_input_header))) {
-    LWIP_ASSERT("pbuf_remove_header failed\n", 0);
+    LWIP_ASSERT("pbuf_remove_header failed", 0);
+    goto drop;
+  }
+
+  /* A previous call to ppp_input might have disconnected the session
+   * while there were still packets in flight in the tcpip mailbox.
+   * Drop incoming packets because ppp_input must never be called if
+   * the upper layer is down.
+   */
+  pppos = (pppos_pcb *)ppp->link_ctx_cb;
+  if (!pppos->open) {
     goto drop;
   }
 
@@ -830,7 +875,7 @@
    * Sure we don't quite fill the buffer if the character doesn't
    * get escaped but is one character worth complicating this? */
   if ((PBUF_POOL_BUFSIZE - nb->len) < 2) {
-    u32_t l = pppos->output_cb(pppos->ppp, (u8_t*)nb->payload, nb->len, pppos->ppp->ctx_cb);
+    u32_t l = pppos->output_cb(pppos->ppp, nb->payload, nb->len, pppos->ppp->ctx_cb);
     if (l != nb->len) {
       return ERR_IF;
     }
@@ -869,7 +914,7 @@
 
   /* Send remaining buffer if not empty */
   if (nb->len > 0) {
-    u32_t l = pppos->output_cb(ppp, (u8_t*)nb->payload, nb->len, ppp->ctx_cb);
+    u32_t l = pppos->output_cb(ppp, nb->payload, nb->len, ppp->ctx_cb);
     if (l != nb->len) {
       err = ERR_IF;
       goto failed;
diff --git a/src/netif/ppp/upap.c b/src/netif/ppp/upap.c
index 3b2399d..c8cd394 100644
--- a/src/netif/ppp/upap.c
+++ b/src/netif/ppp/upap.c
@@ -206,7 +206,7 @@
 
     if (pcb->upap.us_transmits >= pcb->settings.pap_max_transmits) {
 	/* give up in disgust */
-	ppp_error("No response to PAP authenticate-requests");
+	ppp_error(("No response to PAP authenticate-requests"));
 	pcb->upap.us_clientstate = UPAPCS_BADAUTH;
 	auth_withpeer_fail(pcb, PPP_PAP);
 	return;
@@ -286,12 +286,12 @@
 static void upap_protrej(ppp_pcb *pcb) {
 
     if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) {
-	ppp_error("PAP authentication failed due to protocol-reject");
+	ppp_error(("PAP authentication failed due to protocol-reject"));
 	auth_withpeer_fail(pcb, PPP_PAP);
     }
 #if PPP_SERVER
     if (pcb->upap.us_serverstate == UPAPSS_LISTEN) {
-	ppp_error("PAP authentication of peer failed (protocol-reject)");
+	ppp_error(("PAP authentication of peer failed (protocol-reject)"));
 	auth_peer_fail(pcb, PPP_PAP);
     }
 #endif /* PPP_SERVER */
@@ -439,11 +439,11 @@
 
     if (retcode == UPAP_AUTHACK) {
 	pcb->upap.us_serverstate = UPAPSS_OPEN;
-	ppp_notice("PAP peer authentication succeeded for %q", rhostname);
+	ppp_notice(("PAP peer authentication succeeded for %q", rhostname));
 	auth_peer_success(pcb, PPP_PAP, 0, ruser, ruserlen);
     } else {
 	pcb->upap.us_serverstate = UPAPSS_BADAUTH;
-	ppp_warn("PAP peer authentication failed for %q", rhostname);
+	ppp_warn(("PAP peer authentication failed for %q", rhostname));
 	auth_peer_fail(pcb, PPP_PAP);
     }
 
@@ -481,6 +481,7 @@
 	}
     }
 
+    UNTIMEOUT(upap_timeout, pcb);
     pcb->upap.us_clientstate = UPAPCS_OPEN;
 
     auth_withpeer_success(pcb, PPP_PAP, 0);
@@ -516,9 +517,10 @@
 	}
     }
 
+    UNTIMEOUT(upap_timeout, pcb);
     pcb->upap.us_clientstate = UPAPCS_BADAUTH;
 
-    ppp_error("PAP authentication failed");
+    ppp_error(("PAP authentication failed"));
     auth_withpeer_fail(pcb, PPP_PAP);
 }
 
@@ -533,7 +535,7 @@
 
     outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) +
 	pcb->upap.us_userlen + pcb->upap.us_passwdlen;
-    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE);
+    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PBUF_RAM);
     if(NULL == p)
         return;
     if(p->tot_len != p->len) {
@@ -570,7 +572,7 @@
     int outlen;
 
     outlen = UPAP_HEADERLEN + sizeof (u_char) + msglen;
-    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE);
+    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PBUF_RAM);
     if(NULL == p)
         return;
     if(p->tot_len != p->len) {
diff --git a/src/netif/ppp/utils.c b/src/netif/ppp/utils.c
index f1366da..99a5fb1 100644
--- a/src/netif/ppp/utils.c
+++ b/src/netif/ppp/utils.c
@@ -629,7 +629,7 @@
 /*
  * ppp_fatal - log an error message and die horribly.
  */
-void ppp_fatal(const char *fmt, ...) {
+void ppp_fatal_impl(const char *fmt, ...) {
     va_list pvar;
 
     va_start(pvar, fmt);
@@ -642,7 +642,7 @@
 /*
  * ppp_error - log an error message.
  */
-void ppp_error(const char *fmt, ...) {
+void ppp_error_impl(const char *fmt, ...) {
     va_list pvar;
 
     va_start(pvar, fmt);
@@ -656,7 +656,7 @@
 /*
  * ppp_warn - log a warning message.
  */
-void ppp_warn(const char *fmt, ...) {
+void ppp_warn_impl(const char *fmt, ...) {
     va_list pvar;
 
     va_start(pvar, fmt);
@@ -667,7 +667,7 @@
 /*
  * ppp_notice - log a notice-level message.
  */
-void ppp_notice(const char *fmt, ...) {
+void ppp_notice_impl(const char *fmt, ...) {
     va_list pvar;
 
     va_start(pvar, fmt);
@@ -678,7 +678,7 @@
 /*
  * ppp_info - log an informational message.
  */
-void ppp_info(const char *fmt, ...) {
+void ppp_info_impl(const char *fmt, ...) {
     va_list pvar;
 
     va_start(pvar, fmt);
@@ -689,7 +689,7 @@
 /*
  * ppp_dbglog - log a debug message.
  */
-void ppp_dbglog(const char *fmt, ...) {
+void ppp_dbglog_impl(const char *fmt, ...) {
     va_list pvar;
 
     va_start(pvar, fmt);
@@ -724,7 +724,7 @@
 	    return;
     }
 
-    ppp_dbglog("%s %P", tag, p, len);
+    ppp_dbglog(("%s %P", tag, p, len));
 }
 #endif /* PRINTPKT_SUPPORT */
 
@@ -788,9 +788,9 @@
     }
 
     if (result > 0)
-        ppp_notice("Device %s is locked by pid %d", dev, result);
+        ppp_notice(("Device %s is locked by pid %d", dev, result));
     else
-	ppp_error("Can't create lock file %s", lock_file);
+	ppp_error(("Can't create lock file %s", lock_file));
     return -1;
 
 #else /* LOCKLIB */
@@ -802,11 +802,11 @@
     struct stat sbuf;
 
     if (stat(dev, &sbuf) < 0) {
-	ppp_error("Can't get device number for %s: %m", dev);
+	ppp_error(("Can't get device number for %s: %m", dev));
 	return -1;
     }
     if ((sbuf.st_mode & S_IFMT) != S_IFCHR) {
-	ppp_error("Can't lock %s: not a character device", dev);
+	ppp_error(("Can't lock %s: not a character device", dev));
 	return -1;
     }
     ppp_slprintf(lock_file, sizeof(lock_file), "%s/LK.%03d.%03d.%03d",
@@ -833,7 +833,7 @@
 
     while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0) {
 	if (errno != EEXIST) {
-	    ppp_error("Can't create lock file %s: %m", lock_file);
+	    ppp_error(("Can't create lock file %s: %m", lock_file));
 	    break;
 	}
 
@@ -842,7 +842,7 @@
 	if (fd < 0) {
 	    if (errno == ENOENT) /* This is just a timing problem. */
 		continue;
-	    ppp_error("Can't open existing lock file %s: %m", lock_file);
+	    ppp_error(("Can't open existing lock file %s: %m", lock_file));
 	    break;
 	}
 #ifndef LOCK_BINARY
@@ -853,7 +853,7 @@
 	close(fd);
 	fd = -1;
 	if (n <= 0) {
-	    ppp_error("Can't read pid from lock file %s", lock_file);
+	    ppp_error(("Can't read pid from lock file %s", lock_file));
 	    break;
 	}
 
@@ -867,12 +867,12 @@
 	if (pid == 0
 	    || (kill(pid, 0) == -1 && errno == ESRCH)) {
 	    if (unlink (lock_file) == 0) {
-		ppp_notice("Removed stale lock on %s (pid %d)", dev, pid);
+		ppp_notice(("Removed stale lock on %s (pid %d)", dev, pid));
 		continue;
 	    }
-	    ppp_warn("Couldn't remove stale lock on %s", dev);
+	    ppp_warn(("Couldn't remove stale lock on %s", dev));
 	} else
-	    ppp_notice("Device %s is locked by pid %d", dev, pid);
+	    ppp_notice(("Device %s is locked by pid %d", dev, pid));
 	break;
     }
 
@@ -919,7 +919,7 @@
 	return -1;
     fd = open(lock_file, O_WRONLY, 0);
     if (fd < 0) {
-	ppp_error("Couldn't reopen lock file %s: %m", lock_file);
+	ppp_error(("Couldn't reopen lock file %s: %m", lock_file));
 	lock_file[0] = 0;
 	return -1;
     }
diff --git a/src/netif/ppp/vj.c b/src/netif/ppp/vj.c
index 3fecba6..7b6f8ea 100644
--- a/src/netif/ppp/vj.c
+++ b/src/netif/ppp/vj.c
@@ -15,7 +15,7 @@
  * from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:
  *   Initial distribution.
@@ -218,8 +218,8 @@
    * again & we don't have to do any reordering if it's used.
    */
   INCR(vjs_packets);
-  if (!ip4_addr_cmp(&ip->src, &cs->cs_ip.src)
-      || !ip4_addr_cmp(&ip->dest, &cs->cs_ip.dest)
+  if (!ip4_addr_eq(&ip->src, &cs->cs_ip.src)
+      || !ip4_addr_eq(&ip->dest, &cs->cs_ip.dest)
       || (*(struct vj_u32_t*)th).v != (((struct vj_u32_t*)&cs->cs_ip)[IPH_HL(&cs->cs_ip)]).v) {
     /*
      * Wasn't the first -- search for it.
@@ -239,8 +239,8 @@
     do {
       lcs = cs; cs = cs->cs_next;
       INCR(vjs_searches);
-      if (ip4_addr_cmp(&ip->src, &cs->cs_ip.src)
-          && ip4_addr_cmp(&ip->dest, &cs->cs_ip.dest)
+      if (ip4_addr_eq(&ip->src, &cs->cs_ip.src)
+          && ip4_addr_eq(&ip->dest, &cs->cs_ip.dest)
           && (*(struct vj_u32_t*)th).v == (((struct vj_u32_t*)&cs->cs_ip)[IPH_HL(&cs->cs_ip)]).v) {
         goto found;
       }
@@ -409,7 +409,7 @@
     hlen -= deltaS + 4;
     if (pbuf_remove_header(np, hlen)){
       /* Can we cope with this failing?  Just assert for now */
-      LWIP_ASSERT("pbuf_remove_header failed\n", 0);
+      LWIP_ASSERT("pbuf_remove_header failed", 0);
     }
     cp = (u8_t*)np->payload;
     *cp++ = (u8_t)(changes | NEW_C);
@@ -418,7 +418,7 @@
     hlen -= deltaS + 3;
     if (pbuf_remove_header(np, hlen)) {
       /* Can we cope with this failing?  Just assert for now */
-      LWIP_ASSERT("pbuf_remove_header failed\n", 0);
+      LWIP_ASSERT("pbuf_remove_header failed", 0);
     }
     cp = (u8_t*)np->payload;
     *cp++ = (u8_t)changes;
@@ -621,7 +621,7 @@
   /* Remove the compressed header and prepend the uncompressed header. */
   if (pbuf_remove_header(n0, vjlen)) {
     /* Can we cope with this failing?  Just assert for now */
-    LWIP_ASSERT("pbuf_remove_header failed\n", 0);
+    LWIP_ASSERT("pbuf_remove_header failed", 0);
     goto bad;
   }
 
@@ -644,7 +644,7 @@
 
     if (pbuf_remove_header(np, cs->cs_hlen)) {
       /* Can we cope with this failing?  Just assert for now */
-      LWIP_ASSERT("pbuf_remove_header failed\n", 0);
+      LWIP_ASSERT("pbuf_remove_header failed", 0);
       goto bad;
     }
 
diff --git a/src/netif/slipif.c b/src/netif/slipif.c
index 9b175dc..c8e4eb3 100644
--- a/src/netif/slipif.c
+++ b/src/netif/slipif.c
@@ -46,12 +46,12 @@
  * This is an arch independent SLIP netif. The specific serial hooks must be
  * provided by another file. They are sio_open, sio_read/sio_tryread and sio_send
  *
- * Usage: This netif can be used in three ways:\n
- *        1) For NO_SYS==0, an RX thread can be used which blocks on sio_read()
- *           until data is received.\n
- *        2) In your main loop, call slipif_poll() to check for new RX bytes,
- *           completed packets are fed into netif->input().\n
- *        3) Call slipif_received_byte[s]() from your serial RX ISR and
+ * Usage: This netif can be used in three ways:
+ *        1. For NO_SYS==0, an RX thread can be used which blocks on sio_read()
+ *           until data is received.
+ *        2. In your main loop, call slipif_poll() to check for new RX bytes,
+ *           completed packets are fed into netif->input().
+ *        3. Call slipif_received_byte[s]() from your serial RX ISR and
  *           slipif_process_rxqueue() from your main loop. ISR level decodes
  *           packets and puts completed packets on a queue which is fed into
  *           the stack from the main loop (needs SYS_LIGHTWEIGHT_PROT for
diff --git a/st_readme.txt b/st_readme.txt
index c6c23f6..644fa59 100644
--- a/st_readme.txt
+++ b/st_readme.txt
@@ -47,10 +47,20 @@
   ******************************************************************************
   @endverbatim
 
-### 13-December-2024 ###
+### 06-January-2025 ###
 ========================
-  + Remove outdated doxygen_docs.zip file
-  + Regenerate documentation using Doxygen 1.12.0
+  + sys_arch.c:
+     - Add new LWIP_CHECK_MULTITHREADING flag to enable or disable core lock checking functions.
+     - Add support for recursive Mutex.
+     - Add new API sys_lock_tcpip_core to lock the lwip core, mark the current core lock holder and the lock count.
+     - Add new API sys_unlock_tcpip_core to unlock the lwip core, reset the current core lock holder and the lock count.
+     - Add new API sys_mark_tcpip_thread to mark the lwip tcpip thread ID.
+     - Add new API sys_check_core_locking to check if core locking is done correctly.
+
+### 02-February-2024 ###
+========================
+  + Upgrade to LwIP V2.2.0 version
+     - For more details about new features and bug fixes please refer to CHANGELOG.txt and UPGRADING files.
 
 ### 18-August-2023 ###
 ========================
diff --git a/system/OS/sys_arch.c b/system/OS/sys_arch.c
index f7e3ff0..5b98e7b 100644
--- a/system/OS/sys_arch.c
+++ b/system/OS/sys_arch.c
@@ -36,6 +36,7 @@
 #include "lwip/sys.h"
 #include "lwip/mem.h"
 #include "lwip/stats.h"
+#include "lwip/tcpip.h"
 
 #if !NO_SYS
 
@@ -45,6 +46,42 @@
 int errno;
 #endif
 
+#if    (__ARM_ARCH_7A__      == 1U)
+/* CPSR mode bitmasks */
+#define CPSR_MODE_USER            0x10U
+#define CPSR_MODE_SYSTEM          0x1FU
+
+#define IS_IRQ_MODE()             ((__get_mode() != CPSR_MODE_USER) && (__get_mode() != CPSR_MODE_SYSTEM))
+#else
+#define IS_IRQ_MODE()             (__get_IPSR() != 0U)
+#endif
+
+/* Enables multithreading check functions in this port.
+
+   For this to work, in your lwipopts.h file, you need to set this flag to 1,
+   define LWIP_ASSERT_CORE_LOCKED() and LWIP_MARK_TCPIP_THREAD() macros,
+   point them to functions sys_check_core_locking() and sys_mark_tcpip_thread()
+   respectively and add the functions prototypes.
+
+   If you use LWIP_TCPIP_CORE_LOCKING, you also have to define LOCK_TCPIP_CORE()
+   and UNLOCK_TCPIP_CORE() macros, point them to functions sys_lock_tcpip_core()
+   and sys_unlock_tcpip_core() respectively and add the functions prototypes.
+*/
+#ifndef LWIP_CHECK_MULTITHREADING
+#define LWIP_CHECK_MULTITHREADING           0
+#endif /* LWIP_CHECK_MULTITHREADING */
+
+#if LWIP_CHECK_MULTITHREADING
+#if LWIP_TCPIP_CORE_LOCKING
+/* Flag the core lock held. A counter for recursive locks. */
+static u8_t lwip_core_lock_count;
+/* Mark the current core lock holder. */
+static osThreadId_t lwip_core_lock_holder_thread;
+#endif /* LWIP_TCPIP_CORE_LOCKING */
+/* Mark the tcpip thread. */
+static osThreadId_t lwip_tcpip_thread;
+#endif /* LWIP_CHECK_MULTITHREADING */
+
 /*-----------------------------------------------------------------------------------*/
 //  Creates an empty mailbox.
 err_t sys_mbox_new(sys_mbox_t *mbox, int size)
@@ -295,12 +332,17 @@
 }
 
 /*-----------------------------------------------------------------------------------*/
+/* Attributes to support recursive Mutex. */
+const osMutexAttr_t Mutex_attributes = {
+  .attr_bits = osMutexRecursive,
+};
+
 osMutexId_t lwip_sys_mutex;
 
 // Initialize sys arch
 void sys_init(void)
 {
-  lwip_sys_mutex = osMutexNew(NULL);
+  lwip_sys_mutex = osMutexNew(&Mutex_attributes);
 }
 /*-----------------------------------------------------------------------------------*/
                                       /* Mutexes*/
@@ -310,7 +352,7 @@
 /* Create a new mutex*/
 err_t sys_mutex_new(sys_mutex_t *mutex) {
 
-  *mutex = osMutexNew(NULL);
+  *mutex = osMutexNew(&Mutex_attributes);
 
   if(*mutex == NULL)
   {
@@ -410,4 +452,62 @@
   osMutexRelease(lwip_sys_mutex);
 }
 
+/*-----------------------------------------------------------------------------------*/
+#if LWIP_CHECK_MULTITHREADING
+#if LWIP_TCPIP_CORE_LOCKING
+/* Lock the lwip core, mark the current core lock holder and the lock count. */
+void sys_lock_tcpip_core(void)
+{
+   sys_mutex_lock(&lock_tcpip_core);
+   if (lwip_core_lock_count == 0) {
+     lwip_core_lock_holder_thread = osThreadGetId();
+   }
+   lwip_core_lock_count++;
+}
+
+/* Unlock the lwip core. */
+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 */
+
+/* Mark the lwip tcpip thread ID. */
+void sys_mark_tcpip_thread(void)
+{
+  lwip_tcpip_thread = osThreadGetId();
+}
+
+/* Check if the function was accessed with core lock or not.
+   Note : This function cannot be called from Interrupt Service Routines.
+*/
+void sys_check_core_locking(void)
+{
+  osThreadId_t current_thread;
+
+  /* Check if this function is called from Interrupt Service Routines */
+  if (IS_IRQ_MODE())
+  {
+    LWIP_PLATFORM_ASSERT("This function cannot be called from Interrupt Service Routines");
+    while(1);
+  }
+
+  if (lwip_tcpip_thread != 0)
+  {
+    current_thread = osThreadGetId();
+
+#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 /* LWIP_CHECK_MULTITHREADING */
+
 #endif /* !NO_SYS */
diff --git a/test/fuzz/Makefile b/test/fuzz/Makefile
index ccbe956..05a4f63 100644
--- a/test/fuzz/Makefile
+++ b/test/fuzz/Makefile
@@ -29,26 +29,45 @@
 # Author: Adam Dunkels <adam@sics.se>
 #
 
-all compile: lwip_fuzz
+all compile: lwip_fuzz lwip_fuzz2 lwip_fuzz3
 .PHONY: all clean
 
+ifeq ($(origin CC), default)
 CC=afl-gcc
+endif
+
 LDFLAGS=-lm
 # use 'make D=-DUSER_DEFINE' to pass a user define to gcc
-CFLAGS=-O0 $(D)
+CFLAGS=-O2 $(D)
 
-CONTRIBDIR=../../../lwip-contrib
+LWIPDIR=../../src
+CONTRIBDIR=../../contrib
 include $(CONTRIBDIR)/ports/unix/Common.mk
 
+DEPFILES=.depend_fuzz .depend_lwip .depend_app
+
 clean:
-	rm -f *.o $(LWIPLIBCOMMON) $(APPLIB) lwip_fuzz *.s .depend* *.core core
+	rm -f *.o $(LWIPLIBCOMMON) $(APPLIB) lwip_fuzz lwip_fuzz2 lwip_fuzz3 *.s $(DEPFILES) *.core core
 
-depend dep: .depend
+depend dep: $(DEPFILES)
+	@true
 
-include .depend
+ifneq ($(MAKECMDGOALS),clean)
+include $(DEPFILES)
+endif
 
-.depend: fuzz.c $(LWIPFILES) $(APPFILES)
-	$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend
+.depend_fuzz: fuzz.c fuzz2.c fuzz3.c fuzz_common.c
+	$(CCDEP) $(CFLAGS) -MM $^ > .depend_fuzz || rm -f .depend_fuzz
+.depend_lwip: $(LWIPFILES)
+	$(CCDEP) $(CFLAGS) -MM $^ > .depend_lwip || rm -f .depend_lwip
+.depend_app: $(APPFILES)
+	$(CCDEP) $(CFLAGS) -MM $^ > .depend_app || rm -f .depend_app
 
-lwip_fuzz: .depend $(LWIPLIBCOMMON) $(APPLIB) fuzz.o
-	$(CC) $(CFLAGS) -o lwip_fuzz fuzz.o $(APPLIB) $(LWIPLIBCOMMON) $(LDFLAGS)
+lwip_fuzz: $(DEPFILES) $(LWIPLIBCOMMON) $(APPLIB) fuzz.o fuzz_common.o
+	$(CC) $(CFLAGS) -o lwip_fuzz fuzz.o fuzz_common.o $(APPLIB) $(LWIPLIBCOMMON) $(LDFLAGS)
+
+lwip_fuzz2: $(DEPFILES) $(LWIPLIBCOMMON) $(APPLIB) fuzz2.o fuzz_common.o
+	$(CC) $(CFLAGS) -o lwip_fuzz2 fuzz2.o fuzz_common.o $(APPLIB) $(LWIPLIBCOMMON) $(LDFLAGS)
+
+lwip_fuzz3: $(DEPFILES) $(LWIPLIBCOMMON) $(APPLIB) fuzz3.o fuzz_common.o
+	$(CC) $(CFLAGS) -o lwip_fuzz3 fuzz3.o fuzz_common.o $(APPLIB) $(LWIPLIBCOMMON) $(LDFLAGS)
diff --git a/test/fuzz/README b/test/fuzz/README
index de6fb75..a3b2eee 100644
--- a/test/fuzz/README
+++ b/test/fuzz/README
@@ -1,17 +1,15 @@
 
 Fuzzing the lwIP stack (afl-fuzz requires linux/unix or similar)
 
-This directory contains a small app that reads Ethernet frames from stdin and
-processes them. It is used together with the 'american fuzzy lop' tool (found
-at http://lcamtuf.coredump.cx/afl/) and the sample inputs to test how
+This directory contains small apps that read Ethernet frames from stdin and
+process them. They are used together with the 'american fuzzy lop' tool (found
+at https://lcamtuf.coredump.cx/afl/) or its successor AFL++
+(https://github.com/AFLplusplus/AFLplusplus) and the sample inputs to test how
 unexpected inputs are handled. The afl tool will read the known inputs, and
 try to modify them to exercise as many code paths as possible, by instrumenting
 the code and keeping track of which code is executed.
 
-Just running make will produce the test program.
-
-Running make with parameter 'D=-DLWIP_FUZZ_MULTI_PACKET' will produce a binary
-that parses the input data as multiple packets (experimental!).
+Just running make will produce the test programs.
 
 Then run afl with:
 
@@ -34,4 +32,3 @@
 The lwipopts.h file needs to have checksum checking off, otherwise almost every
 packet will be discarded because of that. The other options can be tuned to
 expose different parts of the code.
-
diff --git a/test/fuzz/fuzz.c b/test/fuzz/fuzz.c
index 8aa07ec..8eb453f 100644
--- a/test/fuzz/fuzz.c
+++ b/test/fuzz/fuzz.c
@@ -27,163 +27,13 @@
  * This file is part of the lwIP TCP/IP stack.
  * 
  * Author: Erik Ekman <erik@kryo.se>
+ *         Simon Goldschmidt <goldsimon@gmx.de>
  *
  */
 
-#include "lwip/init.h"
-#include "lwip/netif.h"
-#include "lwip/dns.h"
-#include "netif/etharp.h"
-#if LWIP_IPV6
-#include "lwip/ethip6.h"
-#include "lwip/nd6.h"
-#endif
-
-#include "lwip/apps/httpd.h"
-#include "lwip/apps/snmp.h"
-#include "lwip/apps/lwiperf.h"
-#include "lwip/apps/mdns.h"
-
-#include <string.h>
-#include <stdio.h>
-
-/* This define enables multi packet processing.
- * For this, the input is interpreted as 2 byte length + data + 2 byte length + data...
- * #define LWIP_FUZZ_MULTI_PACKET
-*/
-#ifdef LWIP_FUZZ_MULTI_PACKET
-u8_t pktbuf[20000];
-#else
-u8_t pktbuf[2000];
-#endif
-
-/* no-op send function */
-static err_t lwip_tx_func(struct netif *netif, struct pbuf *p)
-{
-  LWIP_UNUSED_ARG(netif);
-  LWIP_UNUSED_ARG(p);
-  return ERR_OK;
-}
-
-static err_t testif_init(struct netif *netif)
-{
-  netif->name[0] = 'f';
-  netif->name[1] = 'z';
-  netif->output = etharp_output;
-  netif->linkoutput = lwip_tx_func;
-  netif->mtu = 1500;
-  netif->hwaddr_len = 6;
-  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
-
-  netif->hwaddr[0] = 0x00;
-  netif->hwaddr[1] = 0x23;
-  netif->hwaddr[2] = 0xC1;
-  netif->hwaddr[3] = 0xDE;
-  netif->hwaddr[4] = 0xD0;
-  netif->hwaddr[5] = 0x0D;
-
-#if LWIP_IPV6
-  netif->output_ip6 = ethip6_output;
-  netif->ip6_autoconfig_enabled = 1;
-  netif_create_ip6_linklocal_address(netif, 1);
-  netif->flags |= NETIF_FLAG_MLD6;
-#endif
-
-  return ERR_OK;
-}
-
-static void input_pkt(struct netif *netif, const u8_t *data, size_t len)
-{
-  struct pbuf *p, *q;
-  err_t err;
-
-  LWIP_ASSERT("pkt too big", len <= 0xFFFF);
-  p = pbuf_alloc(PBUF_RAW, (u16_t)len, PBUF_POOL);
-  LWIP_ASSERT("alloc failed", p);
-  for(q = p; q != NULL; q = q->next) {
-    MEMCPY(q->payload, data, q->len);
-    data += q->len;
-  }
-  err = netif->input(p, netif);
-  if (err != ERR_OK) {
-    pbuf_free(p);
-  }
-}
-
-static void input_pkts(struct netif *netif, const u8_t *data, size_t len)
-{
-#ifdef LWIP_FUZZ_MULTI_PACKET
-  const u16_t max_packet_size = 1514;
-  const u8_t *ptr = data;
-  size_t rem_len = len;
-
-  while (rem_len > sizeof(u16_t)) {
-    u16_t frame_len;
-    memcpy(&frame_len, ptr, sizeof(u16_t));
-    ptr += sizeof(u16_t);
-    rem_len -= sizeof(u16_t);
-    frame_len = htons(frame_len) & 0x7FF;
-    frame_len = LWIP_MIN(frame_len, max_packet_size);
-    if (frame_len > rem_len) {
-      frame_len = (u16_t)rem_len;
-    }
-    if (frame_len != 0) {
-      input_pkt(netif, ptr, frame_len);
-    }
-    ptr += frame_len;
-    rem_len -= frame_len;
-  }
-#else /* LWIP_FUZZ_MULTI_PACKET */
-  input_pkt(netif, data, len);
-#endif /* LWIP_FUZZ_MULTI_PACKET */
-}
+#include "fuzz_common.h"
 
 int main(int argc, char** argv)
 {
-  struct netif net_test;
-  ip4_addr_t addr;
-  ip4_addr_t netmask;
-  ip4_addr_t gw;
-  size_t len;
-
-  lwip_init();
-
-  IP4_ADDR(&addr, 172, 30, 115, 84);
-  IP4_ADDR(&netmask, 255, 255, 255, 0);
-  IP4_ADDR(&gw, 172, 30, 115, 1);
-
-  netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
-  netif_set_up(&net_test);
-  netif_set_link_up(&net_test);
-
-#if LWIP_IPV6
-  nd6_tmr(); /* tick nd to join multicast groups */
-#endif
-  dns_setserver(0, &net_test.gw);
-
-  /* initialize apps */
-  httpd_init();
-  lwiperf_start_tcp_server_default(NULL, NULL);
-  mdns_resp_init();
-  mdns_resp_add_netif(&net_test, "hostname", 255);
-  snmp_init();
-
-  if(argc > 1) {
-    FILE* f;
-    const char* filename;
-    printf("reading input from file... ");
-    fflush(stdout);
-    filename = argv[1];
-    LWIP_ASSERT("invalid filename", filename != NULL);
-    f = fopen(filename, "rb");
-    LWIP_ASSERT("open failed", f != NULL);
-    len = fread(pktbuf, 1, sizeof(pktbuf), f);
-    fclose(f);
-    printf("testing file: \"%s\"...\r\n", filename);
-  } else {
-    len = fread(pktbuf, 1, sizeof(pktbuf), stdin);
-  }
-  input_pkts(&net_test, pktbuf, len);
-
-  return 0;
+  return lwip_fuzztest(argc, argv, LWIP_FUZZ_SINGLE, LWIP_FUZZ_DEFAULT);
 }
diff --git a/test/fuzz/fuzz2.c b/test/fuzz/fuzz2.c
new file mode 100644
index 0000000..b6a9ceb
--- /dev/null
+++ b/test/fuzz/fuzz2.c
@@ -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: Erik Ekman <erik@kryo.se>
+ *         Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "fuzz_common.h"
+
+int main(int argc, char** argv)
+{
+  return lwip_fuzztest(argc, argv, LWIP_FUZZ_MULTIPACKET, LWIP_FUZZ_DEFAULT);
+}
diff --git a/test/fuzz/fuzz3.c b/test/fuzz/fuzz3.c
new file mode 100644
index 0000000..fc22991
--- /dev/null
+++ b/test/fuzz/fuzz3.c
@@ -0,0 +1,40 @@
+/*
+ * 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: Erik Ekman <erik@kryo.se>
+ *         Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "fuzz_common.h"
+
+int main(int argc, char** argv)
+{
+  return lwip_fuzztest(argc, argv, LWIP_FUZZ_MULTIPACKET_TIME,
+    LWIP_FUZZ_STATICARP|LWIP_FUZZ_TCP_SERVER|LWIP_FUZZ_TCP_CLIENT|LWIP_FUZZ_UDP_SERVER|LWIP_FUZZ_UDP_CLIENT);
+}
diff --git a/test/fuzz/fuzz_common.c b/test/fuzz/fuzz_common.c
new file mode 100644
index 0000000..a275265
--- /dev/null
+++ b/test/fuzz/fuzz_common.c
@@ -0,0 +1,702 @@
+/*
+ * 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: Erik Ekman <erik@kryo.se>
+ *         Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "fuzz_common.h"
+
+#include "lwip/altcp_tcp.h"
+#include "lwip/dns.h"
+#include "lwip/init.h"
+#include "lwip/netif.h"
+#include "lwip/sys.h"
+#include "lwip/timeouts.h"
+#include "lwip/udp.h"
+#include "netif/etharp.h"
+#if LWIP_IPV6
+#include "lwip/ethip6.h"
+#include "lwip/nd6.h"
+#endif
+
+#include "lwip/apps/httpd.h"
+#include "lwip/apps/snmp.h"
+#include "lwip/apps/lwiperf.h"
+#include "lwip/apps/mdns.h"
+
+#include <string.h>
+#include <stdio.h>
+
+static u8_t pktbuf[200000];
+static const u8_t *remfuzz_ptr; /* remaining fuzz pointer */
+static size_t     remfuzz_len;  /* remaining fuzz length  */
+
+#ifndef FUZZ_DEBUG
+#define FUZZ_DEBUG LWIP_DBG_OFF
+#endif
+
+#ifdef LWIP_FUZZ_SYS_NOW
+/* This offset should be added to the time 'sys_now()' returns */
+u32_t sys_now_offset;
+#endif
+
+/** Set this to 1 and define FUZZ_DUMP_PCAP_FILE to dump tx and rx packets into
+ * a pcap file. At the same time, packet info is written via LWIP_DEBUGF so
+ * packets can be matched to other events for debugging them.
+ */
+#ifndef FUZZ_DUMP_PCAP
+#define FUZZ_DUMP_PCAP 0
+#endif
+
+#if FUZZ_DUMP_PCAP
+const u8_t pcap_file_header[24] = {
+  0xd4, 0xc3, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00
+};
+
+static FILE* fpcap;
+static u32_t pcap_packet;
+
+static void pcap_dump_init(void)
+{
+  fpcap = fopen(FUZZ_DUMP_PCAP_FILE, "wb");
+  if (fpcap != NULL) {
+    /* write header */
+    fwrite(pcap_file_header, 1, sizeof(pcap_file_header), fpcap);
+  }
+}
+
+/* This function might have to be called from LWIP_PLATFORM_ASSERT()
+ * in order to produce correct pcap results on crash.
+ * Define this global so that for a test, we can call this from anywhere...
+ */
+void pcap_dump_stop(void);
+void pcap_dump_stop(void)
+{
+  if (fpcap != NULL) {
+    fclose(fpcap);
+    fpcap = NULL;
+  }
+}
+
+static void pcap_dump_packet(struct pbuf *p, int is_tx)
+{
+  if (fpcap != NULL) {
+    struct pbuf *q;
+    u32_t data;
+    pcap_packet++;
+    if (is_tx) {
+      LWIP_DEBUGF(FUZZ_DEBUG, ("> %d fuzz: netif: send %u bytes\n", pcap_packet, p->tot_len));
+    } else {
+      LWIP_DEBUGF(FUZZ_DEBUG, ("< %d fuzz: RX packet of %u bytes\n", pcap_packet, p->tot_len));
+      if (pcap_packet == 50 || pcap_packet == 33 || pcap_packet == 29) {
+        pcap_packet++;
+        pcap_packet--;
+      }
+    }
+    /* write packet header */
+    fwrite(&pcap_packet, 1, sizeof(pcap_packet), fpcap);
+    data = 0;
+    fwrite(&data, 1, sizeof(data), fpcap);
+    data = p->tot_len;
+    fwrite(&data, 1, sizeof(data), fpcap);
+    fwrite(&data, 1, sizeof(data), fpcap);
+    /* write packet data */
+    for(q = p; q != NULL; q = q->next) {
+      fwrite(q->payload, 1, q->len, fpcap);
+    }
+  }
+}
+
+static void pcap_dump_rx_packet(struct pbuf *p)
+{
+  pcap_dump_packet(p, 0);
+}
+
+static void pcap_dump_tx_packet(struct pbuf *p)
+{
+  pcap_dump_packet(p, 1);
+}
+#else /* FUZZ_DUMP_PCAP */
+#define pcap_dump_rx_packet(p)
+#define pcap_dump_tx_packet(p)
+#define pcap_dump_init()
+#define pcap_dump_stop()
+#endif /* FUZZ_DUMP_PCAP */
+
+/* no-op send function */
+static err_t lwip_tx_func(struct netif *netif, struct pbuf *p)
+{
+  pcap_dump_tx_packet(p);
+  LWIP_UNUSED_ARG(netif);
+  LWIP_UNUSED_ARG(p);
+  return ERR_OK;
+}
+
+static err_t testif_init(struct netif *netif)
+{
+  netif->name[0] = 'f';
+  netif->name[1] = 'z';
+  netif->output = etharp_output;
+  netif->linkoutput = lwip_tx_func;
+  netif->mtu = 1500;
+  netif->hwaddr_len = 6;
+  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
+
+  netif->hwaddr[0] = 0x00;
+  netif->hwaddr[1] = 0x23;
+  netif->hwaddr[2] = 0xC1;
+  netif->hwaddr[3] = 0xDE;
+  netif->hwaddr[4] = 0xD0;
+  netif->hwaddr[5] = 0x0D;
+
+#if LWIP_IPV6
+  netif->output_ip6 = ethip6_output;
+  netif_create_ip6_linklocal_address(netif, 1);
+  netif->flags |= NETIF_FLAG_MLD6;
+#endif
+
+  return ERR_OK;
+}
+
+static void input_pkt(struct netif *netif, const u8_t *data, size_t len)
+{
+  struct pbuf *p, *q;
+  err_t err;
+
+  if (len > 0xFFFF) {
+    printf("pkt too big (%#zX bytes)\n", len);
+    return;
+  }
+
+  p = pbuf_alloc(PBUF_RAW, (u16_t)len, PBUF_POOL);
+  LWIP_ASSERT("alloc failed", p);
+  for(q = p; q != NULL; q = q->next) {
+    MEMCPY(q->payload, data, q->len);
+    data += q->len;
+  }
+  remfuzz_ptr += len;
+  remfuzz_len -= len;
+  pcap_dump_rx_packet(p);
+  err = netif->input(p, netif);
+  if (err != ERR_OK) {
+    pbuf_free(p);
+  }
+}
+
+static void input_pkts(enum lwip_fuzz_type type, struct netif *netif, const u8_t *data, size_t len)
+{
+  remfuzz_ptr = data;
+  remfuzz_len = len;
+
+  if (type == LWIP_FUZZ_SINGLE) {
+    input_pkt(netif, data, len);
+  } else {
+    const u16_t max_packet_size = 1514;
+    const size_t minlen = sizeof(u16_t) + (type == LWIP_FUZZ_MULTIPACKET_TIME ? sizeof(u32_t) : 0);
+
+    while (remfuzz_len > minlen) {
+      u16_t frame_len;
+#ifdef LWIP_FUZZ_SYS_NOW
+      u32_t external_delay = 0;
+#endif
+      if (type == LWIP_FUZZ_MULTIPACKET_TIME) {
+#ifdef LWIP_FUZZ_SYS_NOW
+        /* Extract external delay time from fuzz pool */
+        memcpy(&external_delay, remfuzz_ptr, sizeof(u32_t));
+        external_delay = ntohl(external_delay);
+#endif
+        remfuzz_ptr += sizeof(u32_t);
+        remfuzz_len -= sizeof(u32_t);
+      }
+      memcpy(&frame_len, remfuzz_ptr, sizeof(u16_t));
+      remfuzz_ptr += sizeof(u16_t);
+      remfuzz_len -= sizeof(u16_t);
+      frame_len = ntohs(frame_len) & 0x7FF;
+      frame_len = LWIP_MIN(frame_len, max_packet_size);
+      if (frame_len > remfuzz_len) {
+        frame_len = (u16_t)remfuzz_len;
+      }
+      if (frame_len != 0) {
+        if (type == LWIP_FUZZ_MULTIPACKET_TIME) {
+#ifdef LWIP_FUZZ_SYS_NOW
+          /* Update total external delay time, and check timeouts */
+          sys_now_offset += external_delay;
+          LWIP_DEBUGF(FUZZ_DEBUG, ("fuzz: sys_now_offset += %u -> %u\n", external_delay, sys_now_offset));
+#endif
+          sys_check_timeouts();
+        }
+        input_pkt(netif, remfuzz_ptr, frame_len);
+        /* Check timeouts again */
+        sys_check_timeouts();
+      }
+    }
+  }
+}
+
+#if LWIP_TCP
+static struct altcp_pcb *tcp_client_pcb;  /* a pcb for the TCP client */
+static struct altcp_pcb *tcp_server_pcb;  /* a pcb for the TCP server */
+static u16_t            tcp_remote_port;  /* a TCP port number of the destionation */
+static u16_t            tcp_local_port;   /* a TCP port number of the local server */
+
+/**
+ * tcp_app_fuzz_input
+ * Input fuzz with a write function for TCP.
+ */
+static void
+tcp_app_fuzz_input(struct altcp_pcb *pcb)
+{
+  if (remfuzz_len > sizeof(u16_t)) {
+    /*
+     * (max IP packet size) - ((minimum IP header size) + (minimum TCP header size))
+     * = 65535 - (20 + 20)
+     * = 65495
+     */
+    const u16_t max_data_size = 65495;
+    u16_t data_len;
+
+    memcpy(&data_len, remfuzz_ptr, sizeof(u16_t));
+    remfuzz_ptr += sizeof(u16_t);
+    remfuzz_len -= sizeof(u16_t);
+    data_len = ntohs(data_len);
+    data_len = LWIP_MIN(data_len, max_data_size);
+    if (data_len > remfuzz_len) {
+      data_len = (u16_t)remfuzz_len;
+    }
+
+    if (data_len != 0) {
+      LWIP_DEBUGF(FUZZ_DEBUG, ("fuzz: tcp: write %u bytes\n", data_len));
+      altcp_write(pcb, remfuzz_ptr, data_len, TCP_WRITE_FLAG_COPY);
+      altcp_output(pcb);
+    } else {
+      LWIP_DEBUGF(FUZZ_DEBUG, ("fuzz: tcp: close\n"));
+      altcp_close(pcb);
+    }
+
+    remfuzz_ptr += data_len;
+    remfuzz_len -= data_len;
+  }
+}
+
+/**
+ * tcp_client_connected
+ * A connected callback function (for the TCP client)
+ */
+static err_t
+tcp_client_connected(void *arg, struct altcp_pcb *pcb, err_t err)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(err);
+
+  LWIP_DEBUGF(FUZZ_DEBUG, ("fuzz: tcp: tcp_client_connected\n"));
+  tcp_app_fuzz_input(pcb);
+
+  return ERR_OK;
+}
+
+/**
+ * tcp_client_recv
+ * A recv callback function (for the TCP client)
+ */
+static err_t
+tcp_client_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(err);
+
+  if (p == NULL) {
+    altcp_close(pcb);
+  } else {
+    altcp_recved(pcb, p->tot_len);
+    LWIP_DEBUGF(FUZZ_DEBUG, ("fuzz: tcp: tcp_client_recv: %d\n", p->tot_len));
+    tcp_app_fuzz_input(pcb);
+    pbuf_free(p);
+  }
+
+  return ERR_OK;
+}
+
+/**
+ * tcp_client_sent
+ * A sent callback function (for the TCP client)
+ */
+static err_t
+tcp_client_sent(void *arg, struct altcp_pcb *pcb, u16_t len)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(pcb);
+  LWIP_UNUSED_ARG(len);
+  return ERR_OK;
+}
+
+/**
+ * tcp_client_poll
+ * A poll callback function (for the TCP client)
+ */
+static err_t
+tcp_client_poll(void *arg, struct altcp_pcb *pcb)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(pcb);
+  return ERR_OK;
+}
+
+/**
+ * tcp_client_err
+ * An err callback function (for the TCP client)
+ */
+static void
+tcp_client_err(void *arg, err_t err)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(err);
+}
+
+/**
+ * tcp_server_recv
+ * A recv callback function (for the TCP server)
+ */
+static err_t
+tcp_server_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(err);
+
+  if (p == NULL) {
+    altcp_close(pcb);
+  } else {
+    altcp_recved(pcb, p->tot_len);
+    LWIP_DEBUGF(FUZZ_DEBUG, ("fuzz: tcp: tcp_server_recv: %d\n", p->tot_len));
+    tcp_app_fuzz_input(pcb);
+    pbuf_free(p);
+  }
+
+  return ERR_OK;
+}
+
+/**
+ * tcp_server_sent
+ * A sent callback function (for the TCP server)
+ */
+static err_t
+tcp_server_sent(void *arg, struct altcp_pcb *pcb, u16_t len)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(pcb);
+  LWIP_UNUSED_ARG(len);
+  return ERR_OK;
+}
+
+/**
+ * tcp_server_poll
+ * A poll callback function (for the TCP server)
+ */
+static err_t
+tcp_server_poll(void *arg, struct altcp_pcb *pcb)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(pcb);
+  return ERR_OK;
+}
+
+/**
+ * tcp_server_err
+ * An err callbuck function (for the TCP server)
+ */
+static void
+tcp_server_err(void *arg, err_t err)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(err);
+}
+
+/**
+ * tcp_server_accept
+ * An accept callbuck function (for the TCP server)
+ */
+static err_t
+tcp_server_accept(void *arg, struct altcp_pcb *pcb, err_t err)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(err);
+
+  if ((err != ERR_OK) || (pcb == NULL)) {
+    return ERR_VAL;
+  }
+  LWIP_DEBUGF(FUZZ_DEBUG, ("fuzz: accept from remote\n"));
+
+  altcp_setprio(pcb, TCP_PRIO_MIN);
+
+  altcp_recv(pcb, tcp_server_recv);
+  altcp_err(pcb, tcp_server_err);
+  altcp_poll(pcb, tcp_server_poll, 10);
+  altcp_sent(pcb, tcp_server_sent);
+
+  return ERR_OK;
+}
+#endif /* LWIP_TCP */
+
+#if LWIP_UDP
+static struct udp_pcb   *udp_client_pcb;  /* a pcb for the UDP client */
+static struct udp_pcb   *udp_server_pcb;  /* a pcb for the UDP server */
+static u16_t            udp_remote_port;  /* a UDP port number of the destination */
+static u16_t            udp_local_port;   /* a UDP port number of the local server*/
+
+/**
+ * udp_app_fuzz_input
+ * Input fuzz with write functions for UDP.
+ */
+static void
+udp_app_fuzz_input(struct udp_pcb *pcb, const ip_addr_t *addr, u16_t port)
+{
+  if (remfuzz_len > sizeof(u16_t)) {
+    /*
+     * (max IP packet size) - ((minimum IP header size) - (minimum UDP header size))
+     * = 65535 - (20 + 8)
+     * = 65507
+     */
+    const u16_t max_data_size = 65507;
+    u16_t data_len;
+
+    memcpy(&data_len, remfuzz_ptr, sizeof(u16_t));
+    remfuzz_ptr += sizeof(u16_t);
+    remfuzz_len -= sizeof(u16_t);
+    data_len = ntohs(data_len);
+    data_len = LWIP_MIN(data_len, max_data_size);
+    if (data_len > remfuzz_len) {
+      data_len = (u16_t)remfuzz_len;
+    }
+
+    LWIP_DEBUGF(FUZZ_DEBUG, ("fuzz: udp: send %u bytes\n", data_len));
+    if (data_len != 0) {
+      struct pbuf *p, *q;
+
+      p = pbuf_alloc(PBUF_RAW, (u16_t)data_len, PBUF_POOL);
+      LWIP_ASSERT("alloc failed", p);
+
+      for (q = p; q != NULL; q = q->next) {
+        MEMCPY(q->payload, remfuzz_ptr, q->len);
+        remfuzz_ptr += q->len;
+      }
+      remfuzz_len -= data_len;
+
+      /*
+       * Trying input from ...
+       *
+       * client:
+       *     The pcb has information about the destination.
+       *     We use udp_send().
+       *
+       * server:
+       *     The pcb does NOT have infomation about the destionation.
+       *     We use udp_sendto().
+       */
+      if (addr == NULL) {
+        udp_send(pcb, p);
+      } else {
+        udp_sendto(pcb, p, addr, port);
+      }
+      pbuf_free(p);
+    }
+  }
+}
+
+/**
+ * udp_client_recv
+ * A recv callback function (for the UDP client)
+ */
+static void
+udp_client_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(p);
+  LWIP_UNUSED_ARG(addr);
+  LWIP_UNUSED_ARG(port);
+
+  if (p == NULL) {
+    udp_disconnect(pcb);
+  } else {
+    /*
+     * We call the function with 2nd argument set to NULL
+     * to input fuzz from udp_send.
+     */
+    udp_app_fuzz_input(pcb, NULL, port);
+    pbuf_free(p);
+  }
+}
+
+/**
+ * udp_server_recv
+ * A recv callback functyion (for the UDP server)
+ */
+static void
+udp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
+{
+  LWIP_UNUSED_ARG(arg);
+  LWIP_UNUSED_ARG(p);
+  LWIP_UNUSED_ARG(addr);
+  LWIP_UNUSED_ARG(port);
+
+  if (p != NULL) {
+    udp_app_fuzz_input(pcb, addr, port);
+    pbuf_free(p);
+  }
+}
+#endif /* LWIP_UDP */
+
+int lwip_fuzztest(int argc, char** argv, enum lwip_fuzz_type type, u32_t test_apps)
+{
+  struct netif net_test;
+  ip4_addr_t addr;
+  ip4_addr_t netmask;
+  ip4_addr_t gw;
+  size_t len;
+  err_t err;
+  ip_addr_t remote_addr;      /* a IPv4 addr of the destination */
+  struct eth_addr remote_mac = ETH_ADDR(0x28, 0x00, 0x00, 0x22, 0x2b, 0x38); /* a MAC addr of the destination */
+
+  pcap_dump_init();
+  lwip_init();
+
+  IP4_ADDR(&addr, 172, 30, 115, 84);
+  IP4_ADDR(&netmask, 255, 255, 255, 0);
+  IP4_ADDR(&gw, 172, 30, 115, 1);
+
+  netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
+  netif_set_up(&net_test);
+  netif_set_link_up(&net_test);
+
+  if (test_apps & LWIP_FUZZ_STATICARP) {
+    /* Add the ARP entry */
+    IP_ADDR4(&remote_addr, 172, 30, 115, 37);
+    etharp_add_static_entry(&(remote_addr.u_addr.ip4), &remote_mac);
+  }
+
+#if LWIP_IPV6
+  nd6_tmr(); /* tick nd to join multicast groups */
+#endif
+  dns_setserver(0, &net_test.gw);
+
+  if (test_apps & LWIP_FUZZ_DEFAULT) {
+    /* initialize apps */
+    httpd_init();
+    lwiperf_start_tcp_server_default(NULL, NULL);
+    mdns_resp_init();
+    mdns_resp_add_netif(&net_test, "hostname");
+    snmp_init();
+  }
+  if (test_apps & LWIP_FUZZ_TCP_CLIENT) {
+    tcp_client_pcb = altcp_tcp_new_ip_type(IPADDR_TYPE_ANY);
+    LWIP_ASSERT("Error: altcp_new() failed", tcp_client_pcb != NULL);
+    tcp_remote_port = 80;
+    err = altcp_connect(tcp_client_pcb, &remote_addr, tcp_remote_port, tcp_client_connected);
+    LWIP_ASSERT("Error: altcp_connect() failed", err == ERR_OK);
+    altcp_recv(tcp_client_pcb, tcp_client_recv);
+    altcp_err(tcp_client_pcb, tcp_client_err);
+    altcp_poll(tcp_client_pcb, tcp_client_poll, 10);
+    altcp_sent(tcp_client_pcb, tcp_client_sent);
+  }
+  if (test_apps & LWIP_FUZZ_TCP_SERVER) {
+    tcp_server_pcb = altcp_tcp_new_ip_type(IPADDR_TYPE_ANY);
+    LWIP_ASSERT("Error: altcp_new() failed", tcp_server_pcb != NULL);
+    altcp_setprio(tcp_server_pcb, TCP_PRIO_MIN);
+    tcp_local_port = 80;
+    err = altcp_bind(tcp_server_pcb, IP_ANY_TYPE, tcp_local_port);
+    LWIP_ASSERT("Error: altcp_bind() failed", err == ERR_OK);
+    tcp_server_pcb = altcp_listen(tcp_server_pcb);
+    LWIP_ASSERT("Error: altcp_listen() failed", err == ERR_OK);
+    altcp_accept(tcp_server_pcb, tcp_server_accept);
+  }
+  if (test_apps & LWIP_FUZZ_UDP_CLIENT) {
+    udp_client_pcb = udp_new();
+    udp_new_ip_type(IPADDR_TYPE_ANY);
+    udp_recv(udp_client_pcb, udp_client_recv, NULL);
+    udp_remote_port = 161;
+    udp_connect(udp_client_pcb, &remote_addr, udp_remote_port);
+  }
+  if (test_apps & LWIP_FUZZ_UDP_SERVER) {
+    udp_server_pcb = udp_new();
+    udp_new_ip_type(IPADDR_TYPE_ANY);
+    udp_local_port = 161;
+    udp_bind(udp_server_pcb, IP_ANY_TYPE, udp_local_port);
+    udp_recv(udp_server_pcb, udp_server_recv, NULL);
+  }
+
+  if(argc > 1) {
+    FILE* f;
+    const char* filename;
+    printf("reading input from file... ");
+    fflush(stdout);
+    filename = argv[1];
+    LWIP_ASSERT("invalid filename", filename != NULL);
+    f = fopen(filename, "rb");
+    LWIP_ASSERT("open failed", f != NULL);
+    len = fread(pktbuf, 1, sizeof(pktbuf), f);
+    fclose(f);
+    printf("testing file: \"%s\"...\r\n", filename);
+  } else {
+    len = fread(pktbuf, 1, sizeof(pktbuf), stdin);
+  }
+  input_pkts(type, &net_test, pktbuf, len);
+
+  pcap_dump_stop();
+  return 0;
+}
+
+#ifdef LWIP_RAND_FOR_FUZZ
+u32_t lwip_fuzz_rand(void)
+{
+#ifdef LWIP_RAND_FOR_FUZZ_SIMULATE_GLIBC
+  /* this is what glibc rand() returns (first 20 numbers) */
+  static u32_t rand_nrs[] = {0x6b8b4567, 0x327b23c6, 0x643c9869, 0x66334873, 0x74b0dc51,
+    0x19495cff, 0x2ae8944a, 0x625558ec, 0x238e1f29, 0x46e87ccd,
+    0x3d1b58ba, 0x507ed7ab, 0x2eb141f2, 0x41b71efb, 0x79e2a9e3,
+    0x7545e146, 0x515f007c, 0x5bd062c2, 0x12200854, 0x4db127f8};
+  static unsigned idx = 0;
+  u32_t ret = rand_nrs[idx];
+  idx++;
+  if (idx >= sizeof(rand_nrs)/sizeof((rand_nrs)[0])) {
+    idx = 0;
+  }
+  return ret;
+#else
+  /* a simple LCG, unsafe but should give the same result for every execution (best for fuzzing) */
+  u32_t result;
+  static s32_t state[1] = {0xdeadbeef};
+  uint64_t val = state[0] & 0xffffffff;
+  val = ((val * 1103515245) + 12345) & 0x7fffffff;
+  state[0] = val;
+  result = val;
+  return result;
+#endif
+}
+#endif
diff --git a/test/fuzz/fuzz_common.h b/test/fuzz/fuzz_common.h
new file mode 100644
index 0000000..79784e7
--- /dev/null
+++ b/test/fuzz/fuzz_common.h
@@ -0,0 +1,62 @@
+/*
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+#ifndef LWIP_HDR_FUZZ_COMMON_H
+#define LWIP_HDR_FUZZ_COMMON_H
+
+#include "lwip/opt.h"
+#include "lwip/arch.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum lwip_fuzz_type {
+  LWIP_FUZZ_SINGLE = 0,
+  LWIP_FUZZ_MULTIPACKET = 1,
+  LWIP_FUZZ_MULTIPACKET_TIME = 2
+};
+
+/* bitmask of what to test: */
+#define LWIP_FUZZ_DEFAULT    0x01
+#define LWIP_FUZZ_STATICARP  0x02
+#define LWIP_FUZZ_TCP_SERVER 0x04
+#define LWIP_FUZZ_TCP_CLIENT 0x08
+#define LWIP_FUZZ_UDP_SERVER 0x10
+#define LWIP_FUZZ_UDP_CLIENT 0x20
+
+int lwip_fuzztest(int argc, char** argv, enum lwip_fuzz_type type, u32_t test_apps);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_FUZZ_COMMON_H */
diff --git a/test/fuzz/lwipopts.h b/test/fuzz/lwipopts.h
index 4ab26f2..1492fd9 100644
--- a/test/fuzz/lwipopts.h
+++ b/test/fuzz/lwipopts.h
@@ -1,8 +1,8 @@
 /*
  * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
- * All rights reserved. 
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
+ * 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,
@@ -11,27 +11,31 @@
  *    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. 
+ *    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 
+ * 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
  *
  */
 #ifndef LWIP_HDR_LWIPOPTS_H__
 #define LWIP_HDR_LWIPOPTS_H__
 
+#define MEMP_NUM_SYS_TIMEOUT    17
+#define LWIP_FUZZ_SYS_NOW
+#define LWIP_RAND_FOR_FUZZ
+
 /* Prevent having to link sys_arch.c (we don't test the API layers in unit tests) */
 #define NO_SYS                          1
 #define LWIP_NETCONN                    0
diff --git a/test/unit/Filelists.cmake b/test/unit/Filelists.cmake
index e1f40bc..b3db893 100644
--- a/test/unit/Filelists.cmake
+++ b/test/unit/Filelists.cmake
@@ -5,15 +5,20 @@
 #
 # 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 
+# 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(LWIP_TESTDIR ${LWIP_DIR}/test/unit)
 set(LWIP_TESTFILES
 	${LWIP_TESTDIR}/lwip_unittests.c
 	${LWIP_TESTDIR}/api/test_sockets.c
 	${LWIP_TESTDIR}/arch/sys_arch.c
 	${LWIP_TESTDIR}/core/test_def.c
+	${LWIP_TESTDIR}/core/test_dns.c
 	${LWIP_TESTDIR}/core/test_mem.c
 	${LWIP_TESTDIR}/core/test_netif.c
 	${LWIP_TESTDIR}/core/test_pbuf.c
@@ -26,6 +31,8 @@
 	${LWIP_TESTDIR}/mqtt/test_mqtt.c
 	${LWIP_TESTDIR}/tcp/tcp_helper.c
 	${LWIP_TESTDIR}/tcp/test_tcp_oos.c
+	${LWIP_TESTDIR}/tcp/test_tcp_state.c
 	${LWIP_TESTDIR}/tcp/test_tcp.c
 	${LWIP_TESTDIR}/udp/test_udp.c
+	${LWIP_TESTDIR}/ppp/test_pppos.c
 )
diff --git a/test/unit/Filelists.mk b/test/unit/Filelists.mk
index 4b77078..c33e1b0 100644
--- a/test/unit/Filelists.mk
+++ b/test/unit/Filelists.mk
@@ -34,6 +34,7 @@
 	$(TESTDIR)/api/test_sockets.c \
 	$(TESTDIR)/arch/sys_arch.c \
 	$(TESTDIR)/core/test_def.c \
+	$(TESTDIR)/core/test_dns.c \
 	$(TESTDIR)/core/test_mem.c \
 	$(TESTDIR)/core/test_netif.c \
 	$(TESTDIR)/core/test_pbuf.c \
@@ -46,6 +47,8 @@
 	$(TESTDIR)/mqtt/test_mqtt.c \
 	$(TESTDIR)/tcp/tcp_helper.c \
 	$(TESTDIR)/tcp/test_tcp_oos.c \
+	$(TESTDIR)/tcp/test_tcp_state.c \
 	$(TESTDIR)/tcp/test_tcp.c \
-	$(TESTDIR)/udp/test_udp.c
+	$(TESTDIR)/udp/test_udp.c \
+	$(TESTDIR)/ppp/test_pppos.c
 
diff --git a/test/unit/Makefile b/test/unit/Makefile
new file mode 100644
index 0000000..a27c72c
--- /dev/null
+++ b/test/unit/Makefile
@@ -0,0 +1,11 @@
+# Shortcuts to building and running tests on unix platforms.
+# Output files will be written to the directory listed below.
+
+all:
+	cd ../../contrib/ports/unix/check/ && $(MAKE)
+
+check:
+	cd ../../contrib/ports/unix/check/ && $(MAKE) check
+
+clean:
+	cd ../../contrib/ports/unix/check/ && $(MAKE) clean
diff --git a/test/unit/api/test_sockets.c b/test/unit/api/test_sockets.c
index 472fa48..3faa5ff 100644
--- a/test/unit/api/test_sockets.c
+++ b/test/unit/api/test_sockets.c
@@ -153,7 +153,7 @@
   fail_unless(errno == EISCONN);
 
   /* write from server to client */
-  ret = write(s3, "test", 4);
+  ret = lwip_write(s3, "test", 4);
   fail_unless(ret == 4);
 
   ret = lwip_shutdown(s3, SHUT_WR);
@@ -250,11 +250,11 @@
 
 static void test_sockets_msgapi_update_iovs(struct msghdr *msg, size_t bytes)
 {
-  int i;
+  msg_iovlen_t i;
 
   /* note: this modifies the underyling iov_base and iov_len for a partial
      read for an individual vector. This updates the msg->msg_iov pointer
-     to skip fully consumed vecotrs */
+     to skip fully consumed vectors */
   
   /* process fully consumed vectors */
   for (i = 0; i < msg->msg_iovlen; i++) {
@@ -330,7 +330,7 @@
 
   /* set s2 to non-blocking, not inherited from listener */
   opt = lwip_fcntl(s2, F_GETFL, 0);
-  fail_unless(opt == 6);
+  fail_unless(opt == O_RDWR);
   opt = O_NONBLOCK;
   ret = lwip_fcntl(s2, F_SETFL, opt);
   fail_unless(ret == 0);
diff --git a/test/unit/core/test_dns.c b/test/unit/core/test_dns.c
new file mode 100644
index 0000000..6789d24
--- /dev/null
+++ b/test/unit/core/test_dns.c
@@ -0,0 +1,52 @@
+#include "test_dns.h"
+
+#include "lwip/dns.h"
+
+/* Setups/teardown functions */
+
+static void
+dns_setup(void)
+{
+}
+
+static void
+dns_teardown(void)
+{
+}
+
+/* Test functions */
+
+START_TEST(test_dns_set_get_server)
+{
+  int n;
+  LWIP_UNUSED_ARG(_i);
+
+  for (n = 0; n < 256; n++) {
+    u8_t i = (u8_t)n;
+    ip_addr_t server;
+    /* Should return a zeroed address for any index */
+    fail_unless(dns_getserver(i));
+    fail_unless(ip_addr_isany(dns_getserver(i)));
+
+    /* Should accept setting address for any index, and ignore if out of range */
+    IP_ADDR4(&server, 10, 0, 0, i);
+    dns_setserver(i, &server);
+    fail_unless(dns_getserver(i));
+    if (i < DNS_MAX_SERVERS) {
+      fail_unless(ip_addr_eq(dns_getserver(i), &server) == 1);
+    } else {
+      fail_unless(ip_addr_isany(dns_getserver(i)));
+    }
+  }
+}
+END_TEST
+
+/** Create the suite including all tests for this module */
+Suite *
+dns_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(test_dns_set_get_server)
+  };
+  return create_suite("DNS", tests, sizeof(tests)/sizeof(testfunc), dns_setup, dns_teardown);
+}
diff --git a/test/unit/core/test_dns.h b/test/unit/core/test_dns.h
new file mode 100644
index 0000000..eaad0ca
--- /dev/null
+++ b/test/unit/core/test_dns.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_HDR_TEST_DNS_H
+#define LWIP_HDR_TEST_DNS_H
+
+#include "../lwip_check.h"
+
+Suite *dns_suite(void);
+
+#endif
diff --git a/test/unit/core/test_mem.c b/test/unit/core/test_mem.c
index 2aeb20c..601bfc7 100644
--- a/test/unit/core/test_mem.c
+++ b/test/unit/core/test_mem.c
@@ -6,9 +6,6 @@
 #if !LWIP_STATS || !MEM_STATS
 #error "This tests needs MEM-statistics enabled"
 #endif
-#if LWIP_DNS
-#error "This test needs DNS turned off (as it mallocs on init)"
-#endif
 
 /* Setups/teardown functions */
 
diff --git a/test/unit/core/test_netif.c b/test/unit/core/test_netif.c
index c5fa75d..a51a479 100644
--- a/test/unit/core/test_netif.c
+++ b/test/unit/core/test_netif.c
@@ -166,7 +166,8 @@
   IP4_ADDR(&netmask, 255, 255, 255, 0);
   IP4_ADDR(&gw, 1, 2, 3, 254);
   expected_reasons = (netif_nsc_reason_t)(LWIP_NSC_IPV4_ADDRESS_CHANGED | LWIP_NSC_IPV4_NETMASK_CHANGED |
-                                          LWIP_NSC_IPV4_GATEWAY_CHANGED | LWIP_NSC_IPV4_SETTINGS_CHANGED);
+                                          LWIP_NSC_IPV4_GATEWAY_CHANGED | LWIP_NSC_IPV4_SETTINGS_CHANGED |
+                                          LWIP_NSC_IPV4_ADDR_VALID);
   callback_ctr = 0;
   netif_set_addr(&net_test, &addr, &netmask, &gw);
   fail_unless(callback_ctr == 1);
@@ -185,13 +186,16 @@
   netif_set_gw(&net_test, &gw);
   fail_unless(callback_ctr == 0);
 
+  /* netif_set_addr() always issues at least LWIP_NSC_IPV4_ADDR_VALID */
+  expected_reasons = LWIP_NSC_IPV4_ADDR_VALID;
   callback_ctr = 0;
   netif_set_addr(&net_test, &addr, &netmask, &gw);
-  fail_unless(callback_ctr == 0);
+  fail_unless(callback_ctr == 1);
 
   /* check for single-events */
   IP4_ADDR(&addr, 1, 2, 3, 5);
-  expected_reasons = (netif_nsc_reason_t)(LWIP_NSC_IPV4_ADDRESS_CHANGED | LWIP_NSC_IPV4_SETTINGS_CHANGED);
+  expected_reasons = (netif_nsc_reason_t)(LWIP_NSC_IPV4_ADDRESS_CHANGED | LWIP_NSC_IPV4_SETTINGS_CHANGED |
+                                          LWIP_NSC_IPV4_ADDR_VALID);
   callback_ctr = 0;
   netif_set_addr(&net_test, &addr, &netmask, &gw);
   fail_unless(callback_ctr == 1);
diff --git a/test/unit/core/test_pbuf.c b/test/unit/core/test_pbuf.c
index 57087d2..6163e4f 100644
--- a/test/unit/core/test_pbuf.c
+++ b/test/unit/core/test_pbuf.c
@@ -6,9 +6,6 @@
 #if !LWIP_STATS || !MEM_STATS ||!MEMP_STATS
 #error "This tests needs MEM- and MEMP-statistics enabled"
 #endif
-#if LWIP_DNS
-#error "This test needs DNS turned off (as it mallocs on init)"
-#endif
 #if !LWIP_TCP || !TCP_QUEUE_OOSEQ || !LWIP_WND_SCALE
 #error "This test needs TCP OOSEQ queueing and window scaling enabled"
 #endif
@@ -77,9 +74,6 @@
   err_t err;
   LWIP_UNUSED_ARG(_i);
 
-  fail_unless(lwip_stats.mem.used == 0);
-  fail_unless(MEMP_STATS_GET(used, MEMP_PBUF_POOL) == 0);
-
   p1 = pbuf_alloc(PBUF_RAW, 1024, PBUF_RAM);
   fail_unless(p1 != NULL);
   fail_unless(p1->ref == 1);
@@ -99,10 +93,102 @@
 
   pbuf_free(p1);
   pbuf_free(p3);
-  fail_unless(lwip_stats.mem.used == 0);
+}
+END_TEST
 
-  fail_unless(lwip_stats.mem.used == 0);
-  fail_unless(MEMP_STATS_GET(used, MEMP_PBUF_POOL) == 0);
+/** Call pbuf_copy on pbufs with chains of different sizes */
+START_TEST(test_pbuf_copy_unmatched_chains)
+{
+  uint16_t i, j;
+  err_t err;
+  struct pbuf *source, *dest, *p;
+  LWIP_UNUSED_ARG(_i);
+
+  source = NULL;
+  /* Build source pbuf from linked 16 byte parts,
+   * with payload bytes containing their offset */
+  for (i = 0; i < 8; i++) {
+    p = pbuf_alloc(PBUF_RAW, 16, PBUF_RAM);
+    fail_unless(p != NULL);
+    for (j = 0; j < p->len; j++) {
+        ((u8_t*)p->payload)[j] = (u8_t)((i << 4) | j);
+    }
+    if (source) {
+        pbuf_cat(source, p);
+    } else {
+        source = p;
+    }
+  }
+  for (i = 0; i < source->tot_len; i++) {
+    fail_unless(pbuf_get_at(source, i) == i);
+  }
+
+  /* Build dest pbuf from other lengths */
+  dest = pbuf_alloc(PBUF_RAW, 35, PBUF_RAM);
+  fail_unless(dest != NULL);
+  p = pbuf_alloc(PBUF_RAW, 81, PBUF_RAM);
+  fail_unless(p != NULL);
+  pbuf_cat(dest, p);
+  p = pbuf_alloc(PBUF_RAW, 27, PBUF_RAM);
+  fail_unless(p != NULL);
+  pbuf_cat(dest, p);
+
+  /* Copy contents and verify data */
+  err = pbuf_copy(dest, source);
+  fail_unless(err == ERR_OK);
+  for (i = 0; i < source->tot_len; i++) {
+    fail_unless(pbuf_get_at(dest, i) == i);
+  }
+
+  pbuf_free(source);
+  pbuf_free(dest);
+}
+END_TEST
+
+START_TEST(test_pbuf_copy_partial_pbuf)
+{
+  struct pbuf *a, *b, *dest;
+  char lwip[] = "lwip ";
+  char packet[] = "packet";
+  err_t err;
+  LWIP_UNUSED_ARG(_i);
+
+  a = pbuf_alloc(PBUF_RAW, 5, PBUF_REF);
+  fail_unless(a != NULL);
+  a->payload = lwip;
+  b = pbuf_alloc(PBUF_RAW, 7, PBUF_REF);
+  fail_unless(b != NULL);
+  b->payload = packet;
+  pbuf_cat(a, b);
+  dest = pbuf_alloc(PBUF_RAW, 14, PBUF_RAM);
+  memset(dest->payload, 0, dest->len);
+  fail_unless(dest != NULL);
+
+  /* Don't copy if data will not fit */
+  err = pbuf_copy_partial_pbuf(dest, a, a->tot_len, 4);
+  fail_unless(err == ERR_ARG);
+  /* Don't copy if length is longer than source */
+  err = pbuf_copy_partial_pbuf(dest, a, a->tot_len + 1, 0);
+  fail_unless(err == ERR_ARG);
+  /* Normal copy */
+  err = pbuf_copy_partial_pbuf(dest, a, a->tot_len, 0);
+  fail_unless(err == ERR_OK);
+  fail_unless(strcmp("lwip packet", (char*)dest->payload) == 0);
+  /* Copy at offset */
+  err = pbuf_copy_partial_pbuf(dest, a, a->tot_len, 1);
+  fail_unless(err == ERR_OK);
+  fail_unless(strcmp("llwip packet", (char*)dest->payload) == 0);
+  /* Copy at offset with shorter length */
+  err = pbuf_copy_partial_pbuf(dest, a, 6, 6);
+  fail_unless(err == ERR_OK);
+  fail_unless(strcmp("llwip lwip p", (char*)dest->payload) == 0);
+  /* Copy with shorter length */
+  err = pbuf_copy_partial_pbuf(dest, a, 5, 0);
+  fail_unless(err == ERR_OK);
+  fail_unless(strcmp("lwip  lwip p", (char*)dest->payload) == 0);
+
+  pbuf_free(dest);
+  pbuf_free(a);
 }
 END_TEST
 
@@ -262,6 +348,8 @@
   testfunc tests[] = {
     TESTFUNC(test_pbuf_alloc_zero_pbufs),
     TESTFUNC(test_pbuf_copy_zero_pbuf),
+    TESTFUNC(test_pbuf_copy_unmatched_chains),
+    TESTFUNC(test_pbuf_copy_partial_pbuf),
     TESTFUNC(test_pbuf_split_64k_on_small_pbufs),
     TESTFUNC(test_pbuf_queueing_bigger_than_64k),
     TESTFUNC(test_pbuf_take_at_edge),
diff --git a/test/unit/dhcp/test_dhcp.c b/test/unit/dhcp/test_dhcp.c
index d84900d..ac8a219 100644
--- a/test/unit/dhcp/test_dhcp.c
+++ b/test/unit/dhcp/test_dhcp.c
@@ -4,8 +4,20 @@
 #include "lwip/dhcp.h"
 #include "lwip/prot/dhcp.h"
 #include "lwip/etharp.h"
+#include "lwip/inet.h"
 #include "netif/ethernet.h"
 
+#if LWIP_ACD
+#if LWIP_DHCP_DOES_ACD_CHECK
+#define DHCP_TEST_NUM_ARP_FRAMES 5
+#else
+#define DHCP_TEST_NUM_ARP_FRAMES 0
+#endif
+#else
+#define DHCP_TEST_NUM_ARP_FRAMES 1
+#endif
+
+
 static struct netif net_test;
 
 static const u8_t broadcast[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
@@ -132,6 +144,9 @@
 static void tick_lwip(void)
 {
   tick++;
+#if LWIP_DHCP_DOES_ACD_CHECK
+  acd_tmr();
+#endif
   if (tick % 5 == 0) {
     dhcp_fine_tmr();
   }
@@ -282,7 +297,7 @@
 
         check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));
 
-        /* Check dchp message type, can be at different positions */
+        /* Check dhcp message type, can be at different positions */
         if (txpacket == 1) {
           u8_t dhcp_discover_opt[] = { 0x35, 0x01, 0x01 };
           check_pkt_fuzzy(p, 282, dhcp_discover_opt, sizeof(dhcp_discover_opt));
@@ -295,9 +310,20 @@
         }
         break;
       }
+#if DHCP_TEST_NUM_ARP_FRAMES > 0
     case 3:
+#if DHCP_TEST_NUM_ARP_FRAMES > 1
     case 4:
+#if DHCP_TEST_NUM_ARP_FRAMES > 2
     case 5:
+#if DHCP_TEST_NUM_ARP_FRAMES > 3
+    case 6:
+#if DHCP_TEST_NUM_ARP_FRAMES > 4
+    case 7:
+#endif
+#endif
+#endif
+#endif
       {
         const u8_t arpproto[] = { 0x08, 0x06 };
 
@@ -307,7 +333,8 @@
         check_pkt(p, 12, arpproto, sizeof(arpproto)); /* eth level proto: ip */
         break;
       }
-      default:
+#endif
+    default:
         fail();
         break;
     }
@@ -363,7 +390,7 @@
 
         check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));
 
-        /* Check dchp message type, can be at different positions */
+        /* Check dhcp message type, can be at different positions */
         if (txpacket == 1) {
           u8_t dhcp_discover_opt[] = { 0x35, 0x01, 0x01 };
           check_pkt_fuzzy(p, 282, dhcp_discover_opt, sizeof(dhcp_discover_opt));
@@ -377,9 +404,20 @@
         break;
       }
     case 3:
+#if DHCP_TEST_NUM_ARP_FRAMES > 0
     case 4:
+#if DHCP_TEST_NUM_ARP_FRAMES > 1
     case 5:
+#if DHCP_TEST_NUM_ARP_FRAMES > 2
     case 6:
+#if DHCP_TEST_NUM_ARP_FRAMES > 3
+    case 7:
+#if DHCP_TEST_NUM_ARP_FRAMES > 4
+    case 8:
+#endif
+#endif
+#endif
+#endif
       {
         const u8_t arpproto[] = { 0x08, 0x06 };
 
@@ -389,7 +427,8 @@
         check_pkt(p, 12, arpproto, sizeof(arpproto)); /* eth level proto: ip */
         break;
       }
-    case 7:
+#endif
+    case 4 + DHCP_TEST_NUM_ARP_FRAMES:
       {
         const u8_t fake_arp[6] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xab };
         const u8_t ipproto[] = { 0x08, 0x00 };
@@ -410,7 +449,7 @@
 
         check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));
 
-        /* Check dchp message type, can be at different positions */
+        /* Check dhcp message type, can be at different positions */
         check_pkt_fuzzy(p, 282, dhcp_request_opt, sizeof(dhcp_request_opt));
         break;
       }
@@ -478,10 +517,12 @@
   memcpy(&dhcp_ack[46], &xid, 4); /* insert transaction id */
   send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));
 
-  for (i = 0; i < 20; i++) {
+  fail_unless(txpacket == 2);
+
+  for (i = 0; i < 200; i++) {
     tick_lwip();
   }
-  fail_unless(txpacket == 5, "TX %d packets, expected 5", txpacket); /* ARP requests sent */
+  fail_unless(txpacket == (2 + DHCP_TEST_NUM_ARP_FRAMES), "TX %d packets, expected %d", txpacket, (2 + DHCP_TEST_NUM_ARP_FRAMES));
 
   /* Interface up */
   fail_unless(netif_is_up(&net_test));
@@ -551,7 +592,12 @@
   memcpy(&dhcp_ack[46], &xid, 4); /* insert transaction id */
   send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));
 
-  fail_unless(txpacket == 3); /* ARP request sent */
+  fail_unless(txpacket == 2); /* ARP request sent */
+
+  while (txpacket == 2) {
+    tick_lwip();
+  }
+  fail_unless(txpacket == 3);
 
   tcase = TEST_LWIP_DHCP_NAK; /* Switch testcase */
 
@@ -766,10 +812,10 @@
   memcpy(&relay_ack1[46], &xid, 4); /* insert transaction id */
   send_pkt(&net_test, relay_ack1, sizeof(relay_ack1));
 
-  for (i = 0; i < 25; i++) {
+  for (i = 0; i < 200; i++) {
     tick_lwip();
   }
-  fail_unless(txpacket == 5, "txpkt should be 5, is %d", txpacket); /* ARP requests sent */
+  fail_unless(txpacket == (2 + DHCP_TEST_NUM_ARP_FRAMES), "TX %d packets, expected %d", txpacket, (2 + DHCP_TEST_NUM_ARP_FRAMES));
 
   /* Interface up */
   fail_unless(netif_is_up(&net_test));
@@ -782,20 +828,20 @@
   fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
   fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
 
-  fail_unless(txpacket == 5, "txpacket = %d", txpacket);
+  fail_unless(txpacket == (2 + DHCP_TEST_NUM_ARP_FRAMES), "TX %d packets, expected %d", txpacket, (2 + DHCP_TEST_NUM_ARP_FRAMES));
 
   for (i = 0; i < 108000 - 25; i++) {
     tick_lwip();
   }
 
   fail_unless(netif_is_up(&net_test));
-  fail_unless(txpacket == 6, "txpacket = %d", txpacket);
+  fail_unless(txpacket == (3 + DHCP_TEST_NUM_ARP_FRAMES), "TX %d packets, expected %d", txpacket, (3 + DHCP_TEST_NUM_ARP_FRAMES));
 
   /* We need to send arp response here.. */
 
   send_pkt(&net_test, arp_resp, sizeof(arp_resp));
 
-  fail_unless(txpacket == 7, "txpacket = %d", txpacket);
+  fail_unless(txpacket == (4 + DHCP_TEST_NUM_ARP_FRAMES), "TX %d packets, expected %d", txpacket, (4 + DHCP_TEST_NUM_ARP_FRAMES));
   fail_unless(netif_is_up(&net_test));
 
   xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
@@ -806,7 +852,7 @@
     tick_lwip();
   }
 
-  fail_unless(txpacket == 7, "txpacket = %d", txpacket);
+  fail_unless(txpacket == (4 + DHCP_TEST_NUM_ARP_FRAMES), "TX %d packets, expected %d", txpacket, (5 + DHCP_TEST_NUM_ARP_FRAMES));
 
   tcase = TEST_NONE;
   dhcp_stop(&net_test);
diff --git a/test/unit/etharp/test_etharp.c b/test/unit/etharp/test_etharp.c
index 8eb506c..aeaacb2 100644
--- a/test/unit/etharp/test_etharp.c
+++ b/test/unit/etharp/test_etharp.c
@@ -2,6 +2,7 @@
 
 #include "lwip/udp.h"
 #include "lwip/etharp.h"
+#include "lwip/inet.h"
 #include "netif/ethernet.h"
 #include "lwip/stats.h"
 #include "lwip/prot/iana.h"
diff --git a/test/unit/ip4/test_ip4.c b/test/unit/ip4/test_ip4.c
index a5a7fd9..af715da 100644
--- a/test/unit/ip4/test_ip4.c
+++ b/test/unit/ip4/test_ip4.c
@@ -1,6 +1,8 @@
 #include "test_ip4.h"
 
+#include "lwip/icmp.h"
 #include "lwip/ip4.h"
+#include "lwip/etharp.h"
 #include "lwip/inet_chksum.h"
 #include "lwip/stats.h"
 #include "lwip/prot/ip.h"
@@ -12,6 +14,61 @@
 #error "This tests needs LWIP_IPV4, IP_REASSEMBLY; MIB2- and IPFRAG-statistics enabled"
 #endif
 
+static struct netif test_netif;
+static ip4_addr_t test_ipaddr, test_netmask, test_gw;
+static int linkoutput_ctr;
+static int linkoutput_byte_ctr;
+static u16_t linkoutput_pkt_len;
+static u8_t linkoutput_pkt[100];
+
+/* reference internal lwip variable in netif.c */
+
+static err_t
+test_netif_linkoutput(struct netif *netif, struct pbuf *p)
+{
+  fail_unless(netif == &test_netif);
+  fail_unless(p != NULL);
+  linkoutput_ctr++;
+  linkoutput_byte_ctr += p->tot_len;
+  /* Copy start of packet into buffer */
+  linkoutput_pkt_len = pbuf_copy_partial(p, linkoutput_pkt, sizeof(linkoutput_pkt), 0);
+  return ERR_OK;
+}
+
+static err_t
+test_netif_init(struct netif *netif)
+{
+  fail_unless(netif != NULL);
+  netif->linkoutput = test_netif_linkoutput;
+  netif->output = etharp_output;
+  netif->mtu = 1500;
+  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
+  netif->hwaddr_len = ETHARP_HWADDR_LEN;
+  return ERR_OK;
+}
+
+static void
+test_netif_add(void)
+{
+  IP4_ADDR(&test_gw, 192,168,0,1);
+  IP4_ADDR(&test_ipaddr, 192,168,0,1);
+  IP4_ADDR(&test_netmask, 255,255,0,0);
+
+  fail_unless(netif_default == NULL);
+  netif_add(&test_netif, &test_ipaddr, &test_netmask, &test_gw,
+    NULL, test_netif_init, NULL);
+  netif_set_default(&test_netif);
+  netif_set_up(&test_netif);
+}
+
+static void
+test_netif_remove(void)
+{
+  if (netif_default == &test_netif) {
+    netif_remove(&test_netif);
+  }
+}
+
 /* Helper functions */
 static void
 create_ip4_input_fragment(u16_t ip_id, u16_t start, u16_t len, int last)
@@ -52,6 +109,12 @@
   }
 }
 
+static err_t arpless_output(struct netif *netif, struct pbuf *p,
+                            const ip4_addr_t *ipaddr) {
+  LWIP_UNUSED_ARG(ipaddr);
+  return netif->linkoutput(netif, p);
+}
+
 /* Setups/teardown functions */
 
 static void
@@ -71,10 +134,33 @@
   /* poll until all memory is released... */
   tcpip_thread_poll_one();
   lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+  test_netif_remove();
+  netif_set_up(netif_get_loopif());
 }
 
-
 /* Test functions */
+START_TEST(test_ip4_frag)
+{
+  struct pbuf *data = pbuf_alloc(PBUF_IP, 8000, PBUF_RAM);
+  ip_addr_t peer_ip = IPADDR4_INIT_BYTES(192,168,0,5);
+  err_t err;
+  LWIP_UNUSED_ARG(_i);
+
+  linkoutput_ctr = 0;
+
+  /* Verify that 8000 byte payload is split into six packets */
+  fail_unless(data != NULL);
+  test_netif_add();
+  test_netif.output = arpless_output;
+  err = ip4_output_if_src(data, &test_ipaddr, ip_2_ip4(&peer_ip),
+                          16, 0, IP_PROTO_UDP, &test_netif);
+  fail_unless(err == ERR_OK);
+  fail_unless(linkoutput_ctr == 6);
+  fail_unless(linkoutput_byte_ctr == (8000 + (6 * IP_HLEN)));
+  pbuf_free(data);
+  test_netif_remove();
+}
+END_TEST
 
 START_TEST(test_ip4_reass)
 {
@@ -148,13 +234,109 @@
 }
 END_TEST
 
+/* packets to 127.0.0.1 shall not be sent out to netif_default */
+START_TEST(test_127_0_0_1)
+{
+  ip4_addr_t localhost;
+  struct pbuf* p;
+  LWIP_UNUSED_ARG(_i);
+
+  linkoutput_ctr = 0;
+
+  test_netif_add();
+  netif_set_down(netif_get_loopif());
+
+  IP4_ADDR(&localhost, 127, 0, 0, 1);
+  p = pbuf_alloc(PBUF_IP, 10, PBUF_POOL);
+
+  if(ip4_output(p, netif_ip4_addr(netif_default), &localhost, 0, 0, IP_PROTO_UDP) != ERR_OK) {
+    pbuf_free(p);
+  }
+  fail_unless(linkoutput_ctr == 0);
+}
+END_TEST
+
+START_TEST(test_ip4addr_aton)
+{
+  ip4_addr_t ip_addr;
+
+  LWIP_UNUSED_ARG(_i);
+
+  fail_unless(ip4addr_aton("192.168.0.1", &ip_addr) == 1);
+  fail_unless(ip4addr_aton("192.168.0.0001", &ip_addr) == 1);
+  fail_unless(ip4addr_aton("192.168.0.zzz", &ip_addr) == 0);
+  fail_unless(ip4addr_aton("192.168.1", &ip_addr) == 1);
+  fail_unless(ip4addr_aton("192.168.0xd3", &ip_addr) == 1);
+  fail_unless(ip4addr_aton("192.168.0xz5", &ip_addr) == 0);
+  fail_unless(ip4addr_aton("192.168.095", &ip_addr) == 0);
+}
+END_TEST
+
+/* Test for bug #59364 */
+START_TEST(test_ip4_icmp_replylen_short)
+{
+  /* IP packet to 192.168.0.1 using proto 0x22 and 1 byte payload */
+  const u8_t unknown_proto[] = {
+    0x45, 0x00, 0x00, 0x15, 0xd4, 0x31, 0x00, 0x00, 0xff, 0x22,
+    0x66, 0x41, 0xc0, 0xa8, 0x00, 0x02, 0xc0, 0xa8, 0x00, 0x01,
+    0xaa };
+  struct pbuf *p;
+  const int icmp_len = IP_HLEN + sizeof(struct icmp_hdr);
+  LWIP_UNUSED_ARG(_i);
+
+  linkoutput_ctr = 0;
+
+  test_netif_add();
+  test_netif.output = arpless_output;
+  p = pbuf_alloc(PBUF_IP, sizeof(unknown_proto), PBUF_RAM);
+  pbuf_take(p, unknown_proto, sizeof(unknown_proto));
+  fail_unless(ip4_input(p, &test_netif) == ERR_OK);
+
+  fail_unless(linkoutput_ctr == 1);
+  /* Verify outgoing ICMP packet has no extra data */
+  fail_unless(linkoutput_pkt_len == icmp_len + sizeof(unknown_proto));
+  fail_if(memcmp(&linkoutput_pkt[icmp_len], unknown_proto, sizeof(unknown_proto)));
+}
+END_TEST
+
+START_TEST(test_ip4_icmp_replylen_first_8)
+{
+  /* IP packet to 192.168.0.1 using proto 0x22 and 11 bytes payload */
+  const u8_t unknown_proto[] = {
+    0x45, 0x00, 0x00, 0x1f, 0xd4, 0x31, 0x00, 0x00, 0xff, 0x22,
+    0x66, 0x37, 0xc0, 0xa8, 0x00, 0x02, 0xc0, 0xa8, 0x00, 0x01,
+    0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
+    0xaa };
+  struct pbuf *p;
+  const int icmp_len = IP_HLEN + sizeof(struct icmp_hdr);
+  const int unreach_len = IP_HLEN + 8;
+  LWIP_UNUSED_ARG(_i);
+
+  linkoutput_ctr = 0;
+
+  test_netif_add();
+  test_netif.output = arpless_output;
+  p = pbuf_alloc(PBUF_IP, sizeof(unknown_proto), PBUF_RAM);
+  pbuf_take(p, unknown_proto, sizeof(unknown_proto));
+  fail_unless(ip4_input(p, &test_netif) == ERR_OK);
+
+  fail_unless(linkoutput_ctr == 1);
+  fail_unless(linkoutput_pkt_len == icmp_len + unreach_len);
+  fail_if(memcmp(&linkoutput_pkt[icmp_len], unknown_proto, unreach_len));
+}
+END_TEST
 
 /** Create the suite including all tests for this module */
 Suite *
 ip4_suite(void)
 {
   testfunc tests[] = {
+    TESTFUNC(test_ip4_frag),
     TESTFUNC(test_ip4_reass),
+    TESTFUNC(test_127_0_0_1),
+    TESTFUNC(test_ip4addr_aton),
+    TESTFUNC(test_ip4_icmp_replylen_short),
+    TESTFUNC(test_ip4_icmp_replylen_first_8),
   };
   return create_suite("IPv4", tests, sizeof(tests)/sizeof(testfunc), ip4_setup, ip4_teardown);
 }
diff --git a/test/unit/ip6/test_ip6.c b/test/unit/ip6/test_ip6.c
index 7303741..43ffcf7 100644
--- a/test/unit/ip6/test_ip6.c
+++ b/test/unit/ip6/test_ip6.c
@@ -2,6 +2,7 @@
 
 #include "lwip/ethip6.h"
 #include "lwip/ip6.h"
+#include "lwip/icmp6.h"
 #include "lwip/inet_chksum.h"
 #include "lwip/nd6.h"
 #include "lwip/stats.h"
@@ -15,6 +16,7 @@
 
 static struct netif test_netif6;
 static int linkoutput_ctr;
+static int linkoutput_byte_ctr;
 
 static err_t
 default_netif_linkoutput(struct netif *netif, struct pbuf *p)
@@ -22,6 +24,7 @@
   fail_unless(netif == &test_netif6);
   fail_unless(p != NULL);
   linkoutput_ctr++;
+  linkoutput_byte_ctr += p->tot_len;
   return ERR_OK;
 }
 
@@ -132,6 +135,8 @@
 {
   LWIP_UNUSED_ARG(_i);
 
+  linkoutput_ctr = 0;
+
   /* test without link-local address */
   test_ip6_ll_addr_iter(0, 0);
 
@@ -287,6 +292,73 @@
 }
 END_TEST
 
+static struct pbuf *cloned_pbuf = NULL;
+static err_t clone_output(struct netif *netif, struct pbuf *p, const ip6_addr_t *addr) {
+  LWIP_UNUSED_ARG(netif);
+  LWIP_UNUSED_ARG(addr);
+  cloned_pbuf = pbuf_clone(PBUF_RAW, PBUF_RAM, p);
+  return ERR_OK;
+}
+
+/* Reproduces bug #58553 */
+START_TEST(test_ip6_dest_unreachable_chained_pbuf)
+{
+
+  ip_addr_t my_addr = IPADDR6_INIT_HOST(0x20010db8, 0x0, 0x0, 0x1);
+  ip_addr_t peer_addr = IPADDR6_INIT_HOST(0x20010db8, 0x0, 0x0, 0x4);
+  /* Create chained pbuf with UDP data that will get destination unreachable */
+  u8_t udp_hdr[] = {
+    0x60, 0x00, 0x27, 0x03, 0x00, 0x2d, 0x11, 0x40,
+    0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+    0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+    0x01, 0xff, 0x03, 0xff, 0x00, 0x2d, 0x00, 0x00,
+  };
+  struct pbuf *header = pbuf_alloc(PBUF_RAW, sizeof(udp_hdr), PBUF_ROM);
+  u8_t udp_payload[] = "abcdefghijklmnopqrstuvwxyz0123456789";
+  struct pbuf *data = pbuf_alloc(PBUF_RAW, sizeof(udp_payload), PBUF_ROM);
+  u8_t *icmpptr;
+  struct ip6_hdr *outhdr;
+  struct icmp6_hdr *icmp6hdr;
+  LWIP_UNUSED_ARG(_i);
+
+  fail_unless(header);
+  header->payload = udp_hdr;
+  fail_unless(data);
+  data->payload = udp_payload;
+  pbuf_cat(header, data);
+  data = NULL;
+
+  /* Configure and enable local address */
+  netif_set_up(&test_netif6);
+  netif_ip6_addr_set(&test_netif6, 0, ip_2_ip6(&my_addr));
+  netif_ip6_addr_set_state(&test_netif6, 0, IP6_ADDR_VALID);
+  test_netif6.output_ip6 = clone_output;
+
+  /* Process packet and send ICMPv6 reply for unreachable UDP port */
+  ip6_input(header, &test_netif6);
+  header = NULL;
+
+  /* Verify ICMP reply packet contents */
+  fail_unless(cloned_pbuf);
+  fail_unless(cloned_pbuf->len == IP6_HLEN + ICMP6_HLEN + sizeof(udp_hdr) + sizeof(udp_payload));
+  outhdr = (struct ip6_hdr*) cloned_pbuf->payload;
+  fail_unless(ip6_addr_packed_eq(ip_2_ip6(&my_addr), &outhdr->src, IP6_NO_ZONE));
+  fail_unless(ip6_addr_packed_eq(ip_2_ip6(&peer_addr), &outhdr->dest, IP6_NO_ZONE));
+  icmpptr = &((u8_t*)cloned_pbuf->payload)[IP6_HLEN];
+  icmp6hdr = (struct icmp6_hdr*) icmpptr;
+  fail_unless(icmp6hdr->type == ICMP6_TYPE_DUR);
+  fail_unless(icmp6hdr->code == ICMP6_DUR_PORT);
+  fail_unless(icmp6hdr->data == lwip_htonl(0));
+  icmpptr += ICMP6_HLEN;
+  fail_unless(memcmp(icmpptr, udp_hdr, sizeof(udp_hdr)) == 0, "mismatch in copied ip6/udp header");
+  icmpptr += sizeof(udp_hdr);
+  fail_unless(memcmp(icmpptr, udp_payload, sizeof(udp_payload)) == 0, "mismatch in copied udp payload");
+  pbuf_free(cloned_pbuf);
+}
+END_TEST
+
 /* Reproduces bug #57374 */
 START_TEST(test_ip6_frag_pbuf_len_assert)
 {
@@ -295,6 +367,7 @@
   struct pbuf *payload, *hdr;
   err_t err;
   int i;
+  LWIP_UNUSED_ARG(_i);
 
   /* Configure and enable local address */
   test_netif6.mtu = 1500;
@@ -324,6 +397,41 @@
 }
 END_TEST
 
+static err_t direct_output(struct netif *netif, struct pbuf *p, const ip6_addr_t *addr) {
+  LWIP_UNUSED_ARG(addr);
+  return netif->linkoutput(netif, p);
+}
+
+START_TEST(test_ip6_frag)
+{
+  ip_addr_t my_addr = IPADDR6_INIT_HOST(0x20010db8, 0x0, 0x0, 0x1);
+  ip_addr_t peer_addr = IPADDR6_INIT_HOST(0x20010db8, 0x0, 0x0, 0x4);
+  struct pbuf *data;
+  err_t err;
+  LWIP_UNUSED_ARG(_i);
+
+  /* Configure and enable local address */
+  test_netif6.mtu = 1500;
+  netif_set_up(&test_netif6);
+  netif_ip6_addr_set(&test_netif6, 0, ip_2_ip6(&my_addr));
+  netif_ip6_addr_set_state(&test_netif6, 0, IP6_ADDR_VALID);
+  test_netif6.output_ip6 = direct_output;
+  /* Reset counters after multicast traffic */
+  linkoutput_ctr = 0;
+  linkoutput_byte_ctr = 0;
+
+  /* Verify that 8000 byte payload is split into six packets */
+  data = pbuf_alloc(PBUF_IP, 8000, PBUF_RAM);
+  fail_unless(data != NULL);
+  err = ip6_output_if_src(data, ip_2_ip6(&my_addr), ip_2_ip6(&peer_addr),
+                          15, 0, IP_PROTO_UDP, &test_netif6);
+  fail_unless(err == ERR_OK);
+  fail_unless(linkoutput_ctr == 6);
+  fail_unless(linkoutput_byte_ctr == (8000 + (6 * (IP6_HLEN + IP6_FRAG_HLEN))));
+  pbuf_free(data);
+}
+END_TEST
+
 /** Create the suite including all tests for this module */
 Suite *
 ip6_suite(void)
@@ -334,7 +442,9 @@
     TESTFUNC(test_ip6_ntoa_ipv4mapped),
     TESTFUNC(test_ip6_ntoa),
     TESTFUNC(test_ip6_lladdr),
-    TESTFUNC(test_ip6_frag_pbuf_len_assert)
+    TESTFUNC(test_ip6_dest_unreachable_chained_pbuf),
+    TESTFUNC(test_ip6_frag_pbuf_len_assert),
+    TESTFUNC(test_ip6_frag)
   };
   return create_suite("IPv6", tests, sizeof(tests)/sizeof(testfunc), ip6_setup, ip6_teardown);
 }
diff --git a/test/unit/lwip_unittests.c b/test/unit/lwip_unittests.c
index 497a44b..8d47e45 100644
--- a/test/unit/lwip_unittests.c
+++ b/test/unit/lwip_unittests.c
@@ -5,7 +5,9 @@
 #include "udp/test_udp.h"
 #include "tcp/test_tcp.h"
 #include "tcp/test_tcp_oos.h"
+#include "tcp/test_tcp_state.h"
 #include "core/test_def.h"
+#include "core/test_dns.h"
 #include "core/test_mem.h"
 #include "core/test_netif.h"
 #include "core/test_pbuf.h"
@@ -15,12 +17,20 @@
 #include "mdns/test_mdns.h"
 #include "mqtt/test_mqtt.h"
 #include "api/test_sockets.h"
+#include "ppp/test_pppos.h"
 
 #include "lwip/init.h"
 #if !NO_SYS
 #include "lwip/tcpip.h"
 #endif
 
+/* This function is used for LWIP_RAND by some ports... */
+unsigned int
+lwip_port_rand(void)
+{
+  return (unsigned int)rand();
+}
+
 Suite* create_suite(const char* name, testfunc *tests, size_t num_tests, SFun setup, SFun teardown)
 {
   size_t i;
@@ -43,11 +53,14 @@
   unsigned int mask;
 
   if (!(skip & SKIP_HEAP)) {
-    fail_unless(lwip_stats.mem.used == 0);
+    fail_unless(lwip_stats.mem.used == 0,
+      "mem heap still has %d bytes allocated", lwip_stats.mem.used);
   }
   for (i = 0, mask = 1; i < MEMP_MAX; i++, mask <<= 1) {
     if (!(skip & mask)) {
-      fail_unless(lwip_stats.memp[i]->used == 0);
+      fail_unless(lwip_stats.memp[i]->used == 0,
+        "memp pool '%s' still has %d entries allocated",
+        lwip_stats.memp[i]->name, lwip_stats.memp[i]->used);
     }
   }
 }
@@ -67,7 +80,9 @@
     udp_suite,
     tcp_suite,
     tcp_oos_suite,
+    tcp_state_suite,
     def_suite,
+    dns_suite,
     mem_suite,
     netif_suite,
     pbuf_suite,
@@ -77,6 +92,9 @@
     mdns_suite,
     mqtt_suite,
     sockets_suite
+#if PPP_SUPPORT && PPPOS_SUPPORT
+    , pppos_suite
+#endif /* PPP_SUPPORT && PPPOS_SUPPORT */
   };
   size_t num = sizeof(suites)/sizeof(void*);
   LWIP_ASSERT("No suites defined", num > 0);
diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h
index e4523fc..0ee09df 100644
--- a/test/unit/lwipopts.h
+++ b/test/unit/lwipopts.h
@@ -51,9 +51,13 @@
 #define LWIP_HAVE_LOOPIF                1
 #define TCPIP_THREAD_TEST
 
-/* Enable DHCP to test it, disable UDP checksum to easier inject packets */
+/* Enable DHCP to test it */
 #define LWIP_DHCP                       1
 
+/* Enable DNS, with random source port to avoid alloc in dns_init */
+#define LWIP_DNS                        1
+#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_RAND_SRC_PORT)
+
 /* Minimal changes to opt.h required for tcp unit tests: */
 #define MEM_SIZE                        16000
 #define TCP_SND_QUEUELEN                40
@@ -69,6 +73,10 @@
 #define LWIP_MDNS_RESPONDER             1
 #define LWIP_NUM_NETIF_CLIENT_DATA      (LWIP_MDNS_RESPONDER)
 
+/* Enable PPP and PPPOS support for PPPOS test suites */
+#define PPP_SUPPORT                     1
+#define PPPOS_SUPPORT                   1
+
 /* Minimal changes to opt.h required for etharp unit tests: */
 #define ETHARP_SUPPORT_STATIC_ENTRIES   1
 
diff --git a/test/unit/mdns/test_mdns.c b/test/unit/mdns/test_mdns.c
index 6385163..01434b5 100644
--- a/test/unit/mdns/test_mdns.c
+++ b/test/unit/mdns/test_mdns.c
@@ -34,6 +34,7 @@
 
 #include "lwip/pbuf.h"
 #include "lwip/apps/mdns.h"
+#include "lwip/apps/mdns_domain.h"
 #include "lwip/apps/mdns_priv.h"
 
 START_TEST(readname_basic)
@@ -829,7 +830,7 @@
 
   offset = 0x20;
   length = mdns_compress_domain(p, &offset, &domain);
-  /* Dont compress if jump would be to a jump */
+  /* Don't compress if jump would be to a jump */
   fail_unless(length == domain.length);
 
   offset = 0x10;
diff --git a/test/unit/ppp/test_pppos.c b/test/unit/ppp/test_pppos.c
new file mode 100644
index 0000000..2b9aee8
--- /dev/null
+++ b/test/unit/ppp/test_pppos.c
@@ -0,0 +1,67 @@
+#include "test_pppos.h"
+
+#include "lwip/netif.h"
+#include "netif/ppp/pppos.h"
+#include "netif/ppp/ppp.h"
+
+#if PPP_SUPPORT && PPPOS_SUPPORT
+static struct netif pppos_netif;
+static ppp_pcb *ppp;
+
+static u32_t ppp_output_cb(ppp_pcb *pcb, const void *data, u32_t len, void *ctx)
+{
+  LWIP_UNUSED_ARG(pcb);
+  LWIP_UNUSED_ARG(data);
+  LWIP_UNUSED_ARG(len);
+  LWIP_UNUSED_ARG(ctx);
+
+  return  0;
+}
+
+static void ppp_link_status_cb(ppp_pcb *pcb, int err_code, void *ctx)
+{
+  LWIP_UNUSED_ARG(pcb);
+  LWIP_UNUSED_ARG(err_code);
+  LWIP_UNUSED_ARG(ctx);
+}
+
+static void pppos_setup(void)
+{
+  ppp = pppos_create(&pppos_netif, ppp_output_cb, ppp_link_status_cb, NULL);
+  fail_if(ppp == NULL);
+  ppp_connect(ppp, 0);
+}
+
+static void pppos_teardown(void)
+{
+}
+
+START_TEST(test_pppos_empty_packet_with_valid_fcs)
+{
+  u8_t two_breaks[] = { 0x7e, 0, 0, 0x7e };
+  u8_t other_packet[] = { 0x7e, 0x7d, 0x20, 0x00, 0x7e };
+  /* Set internal states of the underlying pcb */
+  pppos_pcb *pppos = (pppos_pcb *)ppp->link_ctx_cb;
+ 
+  LWIP_UNUSED_ARG(_i);
+
+  pppos->open = 1;  /* Pretend the connection is open already */
+  pppos->in_accm[0] = 0xf0;  /* Make sure 0x0's are not escaped chars */
+
+  pppos_input(ppp, two_breaks, sizeof(two_breaks));
+  pppos_input(ppp, other_packet, sizeof(other_packet));
+
+}
+END_TEST
+
+/** Create the suite including all tests for this module */
+Suite *
+pppos_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(test_pppos_empty_packet_with_valid_fcs)
+  };
+  return create_suite("PPPOS", tests, sizeof(tests)/sizeof(testfunc), pppos_setup, pppos_teardown);
+}
+
+#endif /* PPP_SUPPORT && PPPOS_SUPPORT */
diff --git a/test/unit/ppp/test_pppos.h b/test/unit/ppp/test_pppos.h
new file mode 100644
index 0000000..56b3b0c
--- /dev/null
+++ b/test/unit/ppp/test_pppos.h
@@ -0,0 +1,13 @@
+#ifndef LWIP_HDR_TEST_PPPOS_H
+#define LWIP_HDR_TEST_PPPOS_H
+
+#include "../lwip_check.h"
+#include "netif/ppp/ppp.h"
+
+#if PPP_SUPPORT && PPPOS_SUPPORT
+
+Suite* pppos_suite(void);
+
+#endif /* PPP_SUPPORT && PPPOS_SUPPORT */
+
+#endif /* LWIP_HDR_TEST_PPPOS_H */
diff --git a/test/unit/tcp/tcp_helper.c b/test/unit/tcp/tcp_helper.c
index 8689b71..61d6e56 100644
--- a/test/unit/tcp/tcp_helper.c
+++ b/test/unit/tcp/tcp_helper.c
@@ -3,6 +3,7 @@
 #include "lwip/priv/tcp_priv.h"
 #include "lwip/stats.h"
 #include "lwip/pbuf.h"
+#include "lwip/inet.h"
 #include "lwip/inet_chksum.h"
 #include "lwip/ip_addr.h"
 
@@ -24,7 +25,11 @@
   while(pcb != NULL) {
     pcb2 = pcb;
     pcb = pcb->next;
-    tcp_abort(pcb2);
+    if (pcb2->state == LISTEN) {
+      tcp_close(pcb2);
+    } else {
+      tcp_abort(pcb2);
+    }
   }
 }
 
@@ -259,6 +264,7 @@
   ip_addr_copy_from_ip4(*ip_current_src_addr(), iphdr->src);
   ip_current_netif() = inp;
   ip_data.current_ip4_header = iphdr;
+  ip_data.current_input_netif = inp;
 
   /* since adding IPv6, p->payload must point to tcp header, not ip header */
   pbuf_header(p, -(s16_t)sizeof(struct ip_hdr));
diff --git a/test/unit/tcp/test_tcp.c b/test/unit/tcp/test_tcp.c
index c7f85f6..42324d4 100644
--- a/test/unit/tcp/test_tcp.c
+++ b/test/unit/tcp/test_tcp.c
@@ -2,6 +2,7 @@
 
 #include "lwip/priv/tcp_priv.h"
 #include "lwip/stats.h"
+#include "lwip/inet.h"
 #include "tcp_helper.h"
 #include "lwip/inet_chksum.h"
 
@@ -664,6 +665,7 @@
   check_seqnos(pcb->unsent, 6, seqnos);
   EXPECT(pcb->unacked == NULL);
   err = tcp_output(pcb);
+  EXPECT_RET(err == ERR_OK);
   EXPECT(txcounters.num_tx_calls == 2);
   EXPECT(txcounters.num_tx_bytes == 2 * (TCP_MSS + 40U));
   memset(&txcounters, 0, sizeof(txcounters));
@@ -752,6 +754,7 @@
   check_seqnos(pcb->unsent, 6, seqnos);
   EXPECT(pcb->unacked == NULL);
   err = tcp_output(pcb);
+  EXPECT_RET(err == ERR_OK);
   EXPECT(txcounters.num_tx_calls == 2);
   EXPECT(txcounters.num_tx_bytes == 2 * (TCP_MSS + 40U));
   memset(&txcounters, 0, sizeof(txcounters));
@@ -1100,6 +1103,7 @@
   check_seqnos(pcb->unsent, 5, seqnos);
   EXPECT(pcb->unacked == NULL);
   err = tcp_output(pcb);
+  EXPECT_RET(err == ERR_OK);
   EXPECT(txcounters.num_tx_calls == 5);
   EXPECT(txcounters.num_tx_bytes == 5 * (TCP_MSS + 40U));
   memset(&txcounters, 0, sizeof(txcounters));
@@ -1215,6 +1219,7 @@
   err = tcp_write(pcb, &tx_data[0], TCP_MSS, TCP_WRITE_FLAG_COPY);
   EXPECT_RET(err == ERR_OK);
   err = tcp_output(pcb);
+  EXPECT_RET(err == ERR_OK);
   EXPECT(txcounters.num_tx_calls == 1);
   EXPECT(txcounters.num_tx_bytes == 1 * (TCP_MSS + 40U));
   memset(&txcounters, 0, sizeof(txcounters));
@@ -1606,7 +1611,7 @@
 #if TCP_OVERSIZE_DBGCHECK
   /* Split segment already transmitted, should be at 0 */
   EXPECT(pcb->unacked->oversize_left == 0);
-  /* Remainder segement should match pcb value (which is 0) */
+  /* Remainder segment should match pcb value (which is 0) */
   EXPECT(pcb->unsent->oversize_left == pcb->unsent_oversize);
 #endif /* TCP_OVERSIZE_DBGCHECK */
 #endif /* TCP_OVERSIZE */
diff --git a/test/unit/tcp/test_tcp_state.c b/test/unit/tcp/test_tcp_state.c
new file mode 100644
index 0000000..afd21fc
--- /dev/null
+++ b/test/unit/tcp/test_tcp_state.c
@@ -0,0 +1,665 @@
+#include "test_tcp_state.h"
+
+#include "lwip/priv/tcp_priv.h"
+#include "lwip/stats.h"
+#include "tcp_helper.h"
+#include "lwip/inet_chksum.h"
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4307) /* we explicitly wrap around TCP seqnos */
+#endif
+
+#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS
+#error "This tests needs TCP- and MEMP-statistics enabled"
+#endif
+
+static struct netif test_netif = {0};
+static struct test_tcp_txcounters test_txcounters = {0};
+
+#define SEQNO1 (0xFFFFFF00 - TCP_MSS)
+#define ISS    6510
+static u8_t test_tcp_timer;
+
+/* our own version of tcp_tmr so we can reset fast/slow timer state */
+static void
+test_tcp_tmr(void)
+{
+  tcp_fasttmr();
+  if (++test_tcp_timer & 1) {
+    tcp_slowtmr();
+  }
+}
+
+/* Get TCP flags from packets */
+static u8_t 
+get_tcp_flags_from_packet(struct pbuf *p, u16_t tcp_hdr_offset)
+{
+  struct tcp_hdr tcphdr;
+  u16_t ret;
+  EXPECT_RETX(p != NULL, 0);
+  EXPECT_RETX(p->len >= tcp_hdr_offset + sizeof(struct tcp_hdr), 0);
+  ret = pbuf_copy_partial(p, &tcphdr, sizeof(struct tcp_hdr), tcp_hdr_offset);
+  EXPECT(ret == sizeof(struct tcp_hdr));
+  return TCPH_FLAGS(&tcphdr);
+}
+
+/* Create listening tcp_pcb */
+static struct tcp_pcb_listen *
+create_listening_pcb(u16_t local_port, struct test_tcp_counters *counters)
+{
+  struct tcp_pcb *pcb;
+  struct tcp_pcb_listen *lpcb=NULL;
+  err_t err;
+  u16_t port = local_port?local_port:1234;
+
+  if (counters) {
+    pcb = test_tcp_new_counters_pcb(counters);
+  } else {
+    pcb = tcp_new();
+  }
+  EXPECT(pcb != NULL);
+
+  if (pcb) {
+    err = tcp_bind(pcb, &test_netif.ip_addr, port);
+    EXPECT(err == ERR_OK);
+    lpcb = (struct tcp_pcb_listen *)tcp_listen(pcb);
+  }
+
+  return lpcb;
+}
+
+/* Setup/teardown functions */
+static struct netif* old_netif_list;
+static struct netif* old_netif_default;
+
+static void
+tcp_state_setup(void)
+{
+  struct tcp_pcb dummy_pcb; /* we need this for tcp_next_iss() only */
+
+  /* reset iss to default (6510) */
+  tcp_ticks = 0;
+  tcp_ticks = 0 - (tcp_next_iss(&dummy_pcb) - 6510);
+  tcp_next_iss(&dummy_pcb);
+  tcp_ticks = 0;
+
+  test_tcp_timer = 0;
+
+  old_netif_list = netif_list;
+  old_netif_default = netif_default;
+  netif_list = NULL;
+  netif_default = NULL;
+  tcp_remove_all();
+  test_tcp_init_netif(&test_netif, &test_txcounters, &test_local_ip, &test_netmask);
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+static void
+tcp_state_teardown(void)
+{
+  netif_list = NULL;
+  netif_default = NULL;
+  tcp_remove_all();
+  /* restore netif_list for next tests (e.g. loopif) */
+  netif_list = old_netif_list;
+  netif_default = old_netif_default;
+  lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+/* helper functions */
+
+static void 
+test_rst_generation_with_incoming_packet(struct pbuf *p,
+  struct netif *netif, struct test_tcp_txcounters *tx_counters)
+{
+  u16_t tcp_flags;
+  EXPECT_RET(p != NULL);
+  memset(tx_counters, 0, sizeof(struct test_tcp_txcounters));
+  /* pass the segment to tcp_input */
+  tx_counters->copy_tx_packets = 1;
+  test_tcp_input(p, netif);
+  tx_counters->copy_tx_packets = 0;
+  /* check if packets are as expected */
+  EXPECT(tx_counters->tx_packets != NULL);
+  if (tx_counters->tx_packets) {
+    tcp_flags = get_tcp_flags_from_packet(tx_counters->tx_packets, 20);
+    EXPECT(tcp_flags & TCP_RST);
+    pbuf_free(tx_counters->tx_packets);
+    tx_counters->tx_packets = NULL;
+  }
+}
+
+/* Test functions */
+
+/* Call tcp_new() and test memp stats (max number) */
+START_TEST(test_tcp_new_max_num)
+{
+  struct tcp_pcb* pcb[MEMP_NUM_TCP_PCB + 1];
+  int i;
+  LWIP_UNUSED_ARG(_i);
+
+  fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+
+  for(i = 0;i < MEMP_NUM_TCP_PCB; i++) {
+    pcb[i] = tcp_new();
+    fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == (i + 1));
+  }
+  fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == MEMP_NUM_TCP_PCB);
+  /* Trying to remove the oldest pcb in TIME_WAIT,LAST_ACK,CLOSING state when pcb full */
+  pcb[MEMP_NUM_TCP_PCB] = tcp_new();
+  fail_unless(pcb[MEMP_NUM_TCP_PCB] == NULL);
+  tcp_set_state(pcb[0], TIME_WAIT, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
+  pcb[MEMP_NUM_TCP_PCB] = tcp_new();
+  fail_unless(pcb[MEMP_NUM_TCP_PCB] != NULL);
+  fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == MEMP_NUM_TCP_PCB);
+
+  for (i = 1; i <= MEMP_NUM_TCP_PCB; i++)
+  {
+    tcp_abort(pcb[i]);
+  }
+  fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+END_TEST
+
+
+/* pcbs in TIME_WAIT state will be deleted when creating new pcb reach the max number */
+START_TEST(test_tcp_new_max_num_remove_TIME_WAIT)
+{
+  struct tcp_pcb* pcb;
+  struct tcp_pcb* pcb_list[MEMP_NUM_TCP_PCB + 1];
+  int i;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create a pcb in TIME_WAIT state */
+  pcb = tcp_new();
+  EXPECT_RET(pcb != NULL);
+  tcp_set_state(pcb, TIME_WAIT, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  EXPECT_RET(pcb->state == TIME_WAIT);
+
+  /* Create max number pcbs */
+  for(i = 0;i < MEMP_NUM_TCP_PCB-1; i++) {
+    pcb_list[i] = tcp_new();
+    EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == (i + 2));
+  }
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == MEMP_NUM_TCP_PCB);
+
+  /* Create one more pcb, and expect that the pcb in the TIME_WAIT state is deleted */
+  pcb_list[MEMP_NUM_TCP_PCB-1] = tcp_new();
+  EXPECT_RET(pcb_list[MEMP_NUM_TCP_PCB-1] != NULL);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == MEMP_NUM_TCP_PCB);
+
+  for (i = 0; i <= MEMP_NUM_TCP_PCB-1; i++)
+  {
+    tcp_abort(pcb_list[i]);
+  }
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+
+}
+END_TEST
+
+
+/* Call tcp_connect to check active open */
+START_TEST(test_tcp_connect_active_open)
+{
+  struct test_tcp_counters counters;
+  struct tcp_pcb *pcb;
+  struct pbuf *p;
+  err_t err;
+  u16_t test_port = 1234;
+  u32_t seqno = 0;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create and initialize the pcb */
+  tcp_ticks = SEQNO1 - ISS;
+  pcb = test_tcp_new_counters_pcb(&counters);
+  EXPECT_RET(pcb != NULL);
+  
+  /* Get seqno from SYN packet */
+  test_txcounters.copy_tx_packets = 1;
+  err = tcp_connect(pcb, &test_remote_ip, test_port, NULL);
+  test_txcounters.copy_tx_packets = 0;
+  EXPECT(err == ERR_OK);
+  EXPECT(pcb->state == SYN_SENT);
+  EXPECT(test_txcounters.num_tx_calls == 1);
+  EXPECT_RET(test_txcounters.tx_packets != NULL);
+  if (test_txcounters.tx_packets != NULL) {
+    struct tcp_hdr tcphdr;
+    u16_t ret;
+    ret = pbuf_copy_partial(test_txcounters.tx_packets, &tcphdr, 20, 20);
+    EXPECT(ret == 20);
+    EXPECT(TCPH_FLAGS(&tcphdr) & TCP_SYN);
+    pbuf_free(test_txcounters.tx_packets);
+    test_txcounters.tx_packets = NULL;
+    seqno = lwip_htonl(tcphdr.seqno);
+    EXPECT(seqno == pcb->lastack);
+  }
+
+  /* check correct syn packet */
+  p = tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, test_port,
+    pcb->local_port, NULL, 0, 12345, seqno + 1, TCP_SYN|TCP_ACK);
+  EXPECT_RET(p != NULL);
+  test_tcp_input(p, &test_netif);
+  EXPECT_RET(pcb->state == ESTABLISHED);
+  EXPECT_RET(test_txcounters.num_tx_calls == 2);
+
+  /* make sure the pcb is freed */
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  tcp_abort(pcb);
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+END_TEST
+
+START_TEST(test_tcp_active_close)
+{
+  struct tcp_pcb *pcb, *pcbl;
+  struct test_tcp_counters counters;
+  struct pbuf *p;
+  err_t err;
+  u32_t i;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create TCP in LISTEN state */
+  memset(&counters, 0, sizeof(counters));
+  pcb = test_tcp_new_counters_pcb(&counters);
+  EXPECT_RET(pcb != NULL);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  err = tcp_bind(pcb, &test_netif.ip_addr, 1234);
+  EXPECT_RET(err == ERR_OK);
+  pcbl = tcp_listen(pcb);
+  EXPECT_RET(pcbl != NULL);
+  EXPECT_RET(pcbl->state == LISTEN);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB_LISTEN) == 1);
+
+  memset(&test_txcounters, 0, sizeof(test_txcounters));
+  err = tcp_close(pcbl);
+  EXPECT_RET(err == ERR_OK);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB_LISTEN) == 0);
+  EXPECT(test_txcounters.num_tx_calls == 0);
+
+  /* close TCP in SYN_SENT state */
+  memset(&counters, 0, sizeof(counters));
+  pcb = test_tcp_new_counters_pcb(&counters);
+  EXPECT_RET(pcb != NULL);
+  err = tcp_connect(pcb, &test_netif.gw, 1234, NULL);
+  EXPECT_RET(err == ERR_OK);
+  EXPECT_RET(pcb->state == SYN_SENT);
+  EXPECT(test_txcounters.num_tx_calls == 1);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+
+  memset(&test_txcounters, 0, sizeof(test_txcounters));
+  err = tcp_close(pcb);
+  EXPECT_RET(err == ERR_OK);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+  EXPECT(test_txcounters.num_tx_calls == 0);
+
+  /* close TCP in ESTABLISHED state */
+  memset(&counters, 0, sizeof(counters));
+  pcb = test_tcp_new_counters_pcb(&counters);
+  EXPECT_RET(pcb != NULL);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+
+  memset(&test_txcounters, 0, sizeof(test_txcounters));
+  err = tcp_close(pcb);
+  EXPECT_RET(err == ERR_OK);
+  EXPECT_RET(pcb->state == FIN_WAIT_1);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  /* test_tcp_tmr(); */
+  EXPECT(test_txcounters.num_tx_calls == 1);
+  /* create a segment ACK and pass it to tcp_input */
+  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 1, TCP_ACK);
+  EXPECT_RET(p != NULL);
+  test_tcp_input(p, &test_netif);
+  EXPECT_RET(pcb->state == FIN_WAIT_2);
+  /* create a segment FIN and pass it to tcp_input */
+  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_FIN);
+  EXPECT_RET(p != NULL);
+  test_tcp_input(p, &test_netif);
+  EXPECT_RET(pcb->state == TIME_WAIT);
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  for (i = 0; i < 2 * TCP_MSL / TCP_TMR_INTERVAL + 1; i++) {
+    test_tcp_tmr();
+  }
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+END_TEST
+
+START_TEST(test_tcp_imultaneous_close)
+{
+  struct test_tcp_counters counters;
+  struct tcp_pcb* pcb;
+  struct pbuf* p;
+  char data = 0x0f;
+  err_t err;
+  u32_t i;
+  LWIP_UNUSED_ARG(_i);
+
+  /* initialize counter struct */
+  memset(&counters, 0, sizeof(counters));
+  counters.expected_data_len = 1;
+  counters.expected_data = &data;
+
+  /* create and initialize the pcb */
+  pcb = test_tcp_new_counters_pcb(&counters);
+  EXPECT_RET(pcb != NULL);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
+  err = tcp_close(pcb);
+  EXPECT_RET(err == ERR_OK);
+  EXPECT_RET(pcb->state == FIN_WAIT_1);
+  /* create a FIN segment */
+  p = tcp_create_rx_segment(pcb, &data, 0, 0, 0, TCP_FIN);
+  EXPECT(p != NULL);
+  if (p != NULL) {
+    test_tcp_input(p, &test_netif);
+  }
+  EXPECT_RET(pcb->state == CLOSING);
+  /* create an ACK segment */
+  p = tcp_create_rx_segment(pcb, &data, 0, 0, 1, TCP_ACK);
+  EXPECT(p != NULL);
+  if (p != NULL) {
+    test_tcp_input(p, &test_netif);
+  }
+  EXPECT_RET(pcb->state == TIME_WAIT);
+  for (i = 0; i < 2 * TCP_MSL / TCP_TMR_INTERVAL + 1; i++) {
+    test_tcp_tmr();
+  }
+  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+}
+END_TEST
+
+
+/* RST was generated when receive any incoming segment in CLOSED state */
+START_TEST(test_tcp_gen_rst_in_CLOSED)
+{
+  struct pbuf *p;
+  ip_addr_t src_addr = test_remote_ip;
+  ip_addr_t dst_addr = test_local_ip;
+  LWIP_UNUSED_ARG(_i);
+
+  /* Do not create any pcb */
+
+  /* create a segment */
+  p = tcp_create_segment(&src_addr, &dst_addr, TEST_REMOTE_PORT,
+    TEST_LOCAL_PORT, NULL, 0, 12345, 54321, TCP_ACK);
+  EXPECT(p != NULL);
+  test_rst_generation_with_incoming_packet(p, &test_netif, &test_txcounters);
+  EXPECT(test_txcounters.num_tx_calls == 1);
+
+}
+END_TEST
+
+/* RST was generated when receive ACK in LISTEN state */
+START_TEST(test_tcp_gen_rst_in_LISTEN)
+{
+  struct tcp_pcb_listen *lpcb;
+  struct pbuf *p;
+  ip_addr_t src_addr = test_remote_ip;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create a pcb in LISTEN state */
+  lpcb = create_listening_pcb(TEST_LOCAL_PORT, NULL);
+  EXPECT_RET(lpcb != NULL);
+
+  /* create a segment */
+  p = tcp_create_segment(&src_addr,&lpcb->local_ip, TEST_REMOTE_PORT,
+    lpcb->local_port, NULL, 0, 12345, 54321, TCP_ACK);
+  EXPECT(p != NULL);
+  test_rst_generation_with_incoming_packet(p, &test_netif, &test_txcounters);
+  EXPECT(test_txcounters.num_tx_calls == 1);
+
+  /* the PCB still in LISTEN state */
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB_LISTEN) == 1);
+  if (MEMP_STATS_GET(used, MEMP_TCP_PCB_LISTEN) != 0) {
+    /* can not use tcp_abort() */
+    tcp_close((struct tcp_pcb *)lpcb);
+  }
+
+}
+END_TEST
+
+
+/* RST was generated when receive an SYN in TIME_WAIT state */
+START_TEST(test_tcp_gen_rst_in_TIME_WAIT)
+{
+  struct tcp_pcb *pcb;
+  struct pbuf *p;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create a pcb in LISTEN state */
+  pcb = tcp_new();
+  EXPECT_RET(pcb != NULL);
+  tcp_set_state(pcb, TIME_WAIT, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
+
+  /* create a segment */
+  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_SYN);
+  EXPECT(p != NULL);
+  test_rst_generation_with_incoming_packet(p, &test_netif, &test_txcounters);
+  EXPECT(test_txcounters.num_tx_calls == 1);
+
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  EXPECT(pcb->state == TIME_WAIT);
+}
+END_TEST
+
+/* receive TCP_RST with different seqno */
+START_TEST(test_tcp_process_rst_seqno)
+{
+  struct test_tcp_counters counters;
+  struct tcp_pcb *pcb;
+  struct pbuf *p;
+  err_t err;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create and initialize a pcb in SYN_SENT state */
+  memset(&counters, 0, sizeof(counters));
+  pcb = test_tcp_new_counters_pcb(&counters);
+  EXPECT_RET(pcb != NULL);
+  err = tcp_connect(pcb, &test_remote_ip, TEST_REMOTE_PORT, NULL);
+  EXPECT_RET(err == ERR_OK);
+
+  /* a RST segment with incorrect seqno will not be accepted */
+  p = tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, TEST_REMOTE_PORT,
+    pcb->local_port, NULL, 0, 12345,  pcb->snd_nxt-10, TCP_RST);
+  EXPECT(p != NULL);
+  test_tcp_input(p, &test_netif);
+  EXPECT(counters.err_calls == 0);
+
+  /* a RST segment with correct seqno will be accepted */
+  p = tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, TEST_REMOTE_PORT,
+    pcb->local_port, NULL, 0, 12345,  pcb->snd_nxt, TCP_RST);
+  EXPECT(p != NULL);
+  test_tcp_input(p, &test_netif);
+  EXPECT(counters.err_calls == 1);
+  counters.err_calls = 0;
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+
+  /* create another pcb in ESTABLISHED state */
+  memset(&counters, 0, sizeof(counters));
+  pcb = test_tcp_new_counters_pcb(&counters);
+  EXPECT_RET(pcb != NULL);
+  tcp_set_state(pcb, ESTABLISHED, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
+
+  /* a RST segment with incorrect seqno will not be accepted */
+  p = tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port,
+    pcb->local_port, NULL, 0, pcb->rcv_nxt-10, 54321, TCP_RST);
+  EXPECT(p != NULL);
+  test_tcp_input(p, &test_netif);
+  EXPECT(counters.err_calls == 0);
+
+  /* a RST segment with correct seqno will be accepted */
+  p = tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, TEST_REMOTE_PORT,
+    pcb->local_port, NULL, 0, pcb->rcv_nxt, 54321, TCP_RST);
+  EXPECT(p != NULL);
+  test_tcp_input(p, &test_netif);
+  EXPECT(counters.err_calls == 1);
+  counters.err_calls = 0;
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+
+}
+END_TEST
+
+/* RST was generated when receive an SYN+ACK with incorrect ACK number in SYN_SENT state */
+START_TEST(test_tcp_gen_rst_in_SYN_SENT_ackseq)
+{
+  struct tcp_pcb *pcb;
+  struct pbuf *p;
+  u16_t test_port = 1234;
+  err_t err;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create and initialize a pcb in listen state */
+  pcb = tcp_new();
+  EXPECT_RET(pcb != NULL);
+  err = tcp_connect(pcb, &test_remote_ip, test_port, NULL);
+  EXPECT_RET(err == ERR_OK);
+
+  /* create a SYN+ACK segment with incorrect seqno */
+  p = tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port,
+    pcb->local_port, NULL, 0, 12345,  pcb->lastack-10, TCP_SYN|TCP_ACK);
+  EXPECT(p != NULL);
+  test_rst_generation_with_incoming_packet(p, &test_netif, &test_txcounters);
+
+  /* LWIP: send RST then re-send SYN immediately */
+  EXPECT(test_txcounters.num_tx_calls == 2);
+
+}
+END_TEST
+
+/* RST was generated when receive an ACK without SYN in SYN_SENT state */
+START_TEST(test_tcp_gen_rst_in_SYN_SENT_non_syn_ack)
+{
+  struct tcp_pcb *pcb;
+  struct pbuf *p;
+  u16_t test_port = 1234;
+  err_t err;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create and initialize a pcb in listen state */
+  pcb = tcp_new();
+  EXPECT_RET(pcb != NULL);
+  err = tcp_connect(pcb, &test_remote_ip, test_port, NULL);
+  EXPECT_RET(err == ERR_OK);
+
+  /* create a SYN+ACK segment with incorrect seqno */
+  p = tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port,
+    pcb->local_port, NULL, 0, 12345,  pcb->lastack, TCP_ACK);
+  EXPECT(p != NULL);
+  test_rst_generation_with_incoming_packet(p, &test_netif, &test_txcounters);
+
+  /* LWIP: send RST then re-send SYN immediately */
+  EXPECT(test_txcounters.num_tx_calls == 2);
+
+}
+END_TEST
+
+/* RST was generated when receive an ACK with incorrect seqno in SYN_RCVD state */
+START_TEST(test_tcp_gen_rst_in_SYN_RCVD)
+{
+  struct tcp_pcb_listen *lpcb;
+  struct pbuf *p;
+  u32_t ack_seqno = 0;
+  ip_addr_t src_addr = test_remote_ip;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create and initialize a pcb in listen state */
+  lpcb = create_listening_pcb(TEST_LOCAL_PORT, NULL);
+  EXPECT_RET(lpcb != NULL);
+
+  /* LISTEN -> SYN_RCVD */
+  p = tcp_create_segment(&src_addr, &lpcb->local_ip, TEST_REMOTE_PORT,
+    lpcb->local_port, NULL, 0, 1000, 54321, TCP_SYN);
+  EXPECT(p != NULL);
+  memset(&test_txcounters, 0, sizeof(struct test_tcp_txcounters));
+  test_tcp_input(p, &test_netif);
+  EXPECT(test_txcounters.num_tx_calls == 1);
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  if (MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1) {
+    ack_seqno = tcp_active_pcbs[0].lastack;
+  }
+
+  /* create a ACK segment with incorrect seqno */
+  p = tcp_create_segment(&src_addr, &lpcb->local_ip, TEST_REMOTE_PORT,
+    lpcb->local_port, NULL, 0, 1001, ack_seqno+1111, TCP_ACK);
+  EXPECT(p != NULL);
+  test_rst_generation_with_incoming_packet(p, &test_netif, &test_txcounters);
+  EXPECT(test_txcounters.num_tx_calls == 1);
+
+  /* the active pcb still exists */
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB_LISTEN) == 1);
+  if (MEMP_STATS_GET(used, MEMP_TCP_PCB_LISTEN) != 0) {
+    /* can not use tcp_abort() */
+    tcp_close((struct tcp_pcb *)lpcb);
+  }
+}
+END_TEST
+
+/* a listen pcb returns to LISTEN from SYN_RCVD when RST received */
+START_TEST(test_tcp_receive_rst_SYN_RCVD_to_LISTEN)
+{
+  struct tcp_pcb_listen *lpcb;
+  struct pbuf *p;
+  u16_t tcp_flags;
+  ip_addr_t src_addr = test_remote_ip;
+  LWIP_UNUSED_ARG(_i);
+
+  /* create and initialize a pcb in listen state */
+  lpcb = create_listening_pcb(TEST_LOCAL_PORT, NULL);
+  EXPECT_RET(lpcb != NULL);
+
+  /* create a SYN segment */
+  p = tcp_create_segment(&src_addr, &lpcb->local_ip, TEST_REMOTE_PORT,
+    lpcb->local_port, NULL, 0, 1000, 54321, TCP_SYN);
+  EXPECT(p != NULL);
+  /* pass the segment to tcp_input */
+  memset(&test_txcounters, 0, sizeof(struct test_tcp_txcounters));
+  test_txcounters.copy_tx_packets = 1;
+  test_tcp_input(p, &test_netif);
+  test_txcounters.copy_tx_packets = 0;
+  /* check if packets are as expected */
+  EXPECT(test_txcounters.num_tx_calls == 1);
+  tcp_flags = get_tcp_flags_from_packet(test_txcounters.tx_packets, 20);
+  pbuf_free(test_txcounters.tx_packets);
+  test_txcounters.tx_packets = NULL;
+  EXPECT((tcp_flags & TCP_SYN) && (tcp_flags & TCP_ACK));
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);
+
+  /* create a RST segment */
+  p = tcp_create_segment(&src_addr, &lpcb->local_ip, TEST_REMOTE_PORT,
+    lpcb->local_port, NULL, 0, 1001, 54321, TCP_RST);
+  EXPECT(p != NULL);
+  test_tcp_input(p, &test_netif);
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);
+  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB_LISTEN) == 1);
+
+  if (MEMP_STATS_GET(used, MEMP_TCP_PCB_LISTEN) != 0) {
+    /* can not use tcp_abort() */
+    tcp_close((struct tcp_pcb *)lpcb);
+  }
+}
+END_TEST
+
+/** Create the suite including all tests for this module */
+Suite *
+tcp_state_suite(void)
+{
+  testfunc tests[] = {
+    TESTFUNC(test_tcp_new_max_num),
+    TESTFUNC(test_tcp_new_max_num_remove_TIME_WAIT),
+    TESTFUNC(test_tcp_connect_active_open),
+    TESTFUNC(test_tcp_active_close),
+    TESTFUNC(test_tcp_imultaneous_close),
+    TESTFUNC(test_tcp_gen_rst_in_CLOSED),
+    TESTFUNC(test_tcp_gen_rst_in_LISTEN),
+    TESTFUNC(test_tcp_gen_rst_in_TIME_WAIT),
+    TESTFUNC(test_tcp_process_rst_seqno),
+    TESTFUNC(test_tcp_gen_rst_in_SYN_SENT_ackseq),
+    TESTFUNC(test_tcp_gen_rst_in_SYN_SENT_non_syn_ack),
+    TESTFUNC(test_tcp_gen_rst_in_SYN_RCVD),
+    TESTFUNC(test_tcp_receive_rst_SYN_RCVD_to_LISTEN),
+  };
+  return create_suite("TCP_STATE", tests, sizeof(tests) / sizeof(testfunc), tcp_state_setup, tcp_state_teardown);
+}
diff --git a/test/unit/tcp/test_tcp_state.h b/test/unit/tcp/test_tcp_state.h
new file mode 100644
index 0000000..00d5c8a
--- /dev/null
+++ b/test/unit/tcp/test_tcp_state.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_HDR_TEST_TCP_STATE_H
+#define LWIP_HDR_TEST_TCP_STATE_H
+
+#include "../lwip_check.h"
+
+Suite *tcp_state_suite(void);
+
+#endif